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ファイルにメッセージを直書きしようか(笑)