JMemo028

Strutsタグを含むJavaScriptコードの外部化

JavaでWEBアプリケーションを作るのにStrutsを使っている場合、
StrutsのメッセージリソースにあるメッセージをJavaScriptの中でalertなどで出力したいことがある。

  • MessageResources.properties
    HOGE=暑いねぇ。
    
  • JSP
    <html>
    <head>
    <script type="text/javascript">
    function func() {
        alert('<bean:message key="HOGE"/>');
    }
    </script>
    </head>
    <body onload="func();">
    今日もいい天気だねぇ。
    </body>
    </html>
    

こんな感じかな…これはシンプルな例だけど。
で、実際にはこんなシンプルじゃなくてもっと長ったらしいJSPになるわけだ。
そうなると、JavaScriptコードを外部化したいわけだ。

  • MessageResources.properties
    HOGE=暑いねぇ。
    
  • script.js
    function func() {
        alert('<bean:message key="HOGE"/>');
    }
    
  • JSP
    <html>
    <head>
    <script type="text/javascript" src="script.js"></script>
    </head>
    <body onload="func();">
    今日もいい天気だねぇ。
    </body>
    </html>
    

しかし、これではメッセージ「暑いねぇ。」が表示されない。
「<bean:message key="HOGE"/>」とalertで表示されてしまう。

(Strutsタグが解釈されるのはJSPがサーブレットに変換される瞬間であり、
jsファイルが読み込まれるのはブラウザで表示される瞬間だから。
そもそもJSPファイル以外にStrutsタグを書いても無意味。)

これを解決するには、やっぱり

  • MessageResources.properties
    HOGE=暑いねぇ。
    
  • script.js
    function func(msg) {
        alert(msg);
    }
    
  • JSP
    <html>
    <head>
    <script type="text/javascript" src="script.js"></script>
    </head>
    <body onload="func('<bean:message key="HOGE"/>');">
    今日もいい天気だねぇ。
    </body>
    </html>
    

なんだろうか!?
はたまた

  • MessageResources.properties
    HOGE=暑いねぇ。
    
  • script.js
    function func() {
        alert(msg);
    }
    
  • JSP
    <html>
    <head>
    <script type="text/javascript">
    var msg = '<bean:message key="HOGE"/>';
    </script>
    <script type="text/javascript" src="script.js"></script>
    </head>
    <body onload="func();">
    今日もいい天気だねぇ。
    </body>
    </html>
    

なんだろうか?
どちらもエレガントさに欠けるなぁ。
第一メッセージの数が多様になってきたらなんかよりいっそうダサいコードになりそうだ。

お勧めは後者かな、という気もしないでもないが、なんかグローバル変数が沢山になりそうでいやだ。
またはグローバルの配列変数(連想配列)にするか。
仕方ないのかな…。


あ、もう一つ思いついた。
JSPで外部化して、jsp:includeすればいいんだ。

  • MessageResources.properties
    HOGE=暑いねぇ。
    
  • js.jsp
    <html>
    <head>
    <script type="text/javascript">
    function func() {
        alert('<bean:message key="HOGE"/>');
    }
    </script>
    </head>
    </html>
    
  • JSP(メイン)
    <html>
    <head>
    </head>
    <jsp:include page="js.jsp"/>
    <body onload="func();">
    今日もいい天気だねぇ。
    </body>
    </html>
    

うーん、これもダサいなぁ。

いっそのこと、メッセージリソースを使うのはあきらめてJSファイルにメッセージを直書きしようか(笑)

最終更新:2012年08月24日 10:40