JavaでWEBアプリケーションを作るのにStrutsを使っている場合、
StrutsのメッセージリソースにあるメッセージをJavaScriptの中でalertなどで出力したいことがある。
HOGE=暑いねぇ。
<html> <head> <script type="text/javascript"> function func() { alert('<bean:message key="HOGE"/>'); } </script> </head> <body onload="func();"> 今日もいい天気だねぇ。 </body> </html>
こんな感じかな…これはシンプルな例だけど。
で、実際にはこんなシンプルじゃなくてもっと長ったらしいJSPになるわけだ。
そうなると、JavaScriptコードを外部化したいわけだ。
HOGE=暑いねぇ。
function func() { alert('<bean:message key="HOGE"/>'); }
<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タグを書いても無意味。)
これを解決するには、やっぱり
HOGE=暑いねぇ。
function func(msg) { alert(msg); }
<html> <head> <script type="text/javascript" src="script.js"></script> </head> <body onload="func('<bean:message key="HOGE"/>');"> 今日もいい天気だねぇ。 </body> </html>
なんだろうか!?
はたまた
HOGE=暑いねぇ。
function func() { alert(msg); }
<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すればいいんだ。
HOGE=暑いねぇ。
<html> <head> <script type="text/javascript"> function func() { alert('<bean:message key="HOGE"/>'); } </script> </head> </html>
<html> <head> </head> <jsp:include page="js.jsp"/> <body onload="func();"> 今日もいい天気だねぇ。 </body> </html>
うーん、これもダサいなぁ。
いっそのこと、メッセージリソースを使うのはあきらめてJSファイルにメッセージを直書きしようか(笑)