appendChildでリソースを出力させたい

[新着] Webテンプレートを仮オープンしました



0   名前: まなちゃん : 2007/09/14(金) 00:06  ID:YGWxb6.K sub-3C
お世話になっております。


処理上の理由で、strutsのvalidatorが使用できない為、
javaScriptのappendChild()を使用し、エラー文字をjspに出力させております。
(下記のソースを参照願います。)

ご質問の内容として、文字列は出力させることは出来るのですが、
メッセージリソースとして、jspに表示させる方法は可能なのでしょうか?


jsp------------------------------------

<html:form action="***">

<html:text property="date1">

<html:submit property="submit" value="送信" onclick="submitOn()"/>

<%-- エラー出力 --%>
<font color="red"><p id="pic">(※1)</p></font>

(※1)この箇所に<bean:message key="****"/>の
文字列を出力させたいです。

</html:form>

---------------------------------------

↓文字列出力のソースではございますが、
記載させて頂きます。
js------------------------------------

function submitOn() {

if(document.forms[0].date1.value == ""){

var textNode = document.createTextNode("エラーです");
var ele = document.createElement("pic");
ele.appendChild(textNode);

document.getElementById("pic").appendChild(ele);

return false;

}
}
---------------------------------------

お忙しいところ、大変申し訳ございませんが、
どなたかアドバイスを頂けませんでしょうか?

宜しくお願い致します。

1   名前: まなちゃん : 2007/09/14(金) 00:06  ID:YGWxb6.K sub-3C
補足になりますが下記の処理は失敗でした…。

1.textNode = document.createTextNode('<bean:message key="****"/>');
の場合、出力時に<bean:message key="****"/>とまんま文字列として、
表示されてしまいます。

2.<p id="pic"><bean:message key="****"/></p></font>
の場合、何故か可視不可視されず、最初からリソースファイルの
文字列を出力してしまっています。

2   名前: mug : 2007/09/14(金) 00:06  ID:4qs1Kor2 sub-6m
> メッセージリソースとして、jspに表示させる方法は可能なのでしょうか?

この質問の意味は、
(a)サーバー側のリソース(ファイルorDBor...etc)にエラーメッセージが定義されていて
(b)それをエラーメッセージとして使いたい(<bean:message key="****"/>で取り出せる)
(c)ただし、1度サブミットをさせて、strutsのvaridateで出すのではなく、
(d)送信前(送信ボタン押下時)にJavaScriptで値を検査してメッセージを表示させたい
(e)表示箇所は※1の箇所である
(f)もちろん、最初からエラーメッセージが表示されていてはいない
(g)DOMのappendChild()を使って何とかならないだろうか
ということと解釈しました。

ちなみにappendChildだと、何度もエラーになったときにエラーメッセージがいくつも出ると思うのですが・・・。



まず、他のJSP絡みの質問者の方々も返信で書かれていることですが、JSPではなくHTMLを記述してください。
表示されたブラウザを右クリック等して、表示したソースのことです。

たぶん、以下のようになっているはずです。
HTML--------------------------------

<form action="***">


<input type="text" name="date1" value="[date1フィールドの中身]">


<input type="submit" value="送信" onclick="submitOn()">



<font color="red"><p id="pic">(※1)</p></font>


</form>


-------------------------------------
※1に、たぶん“メッセージリソース”の値が入っているであろう<bean:message key="****"/>を記述していた場合、
その部分はメッセージリソースの値に置き換わっています。

ただし、*.jsなどのJSPでないファイルにJSPやstruts等のカスタムタグを書いても変換されません。



ブラウザがJSPを表示しようとしたとき、どのようや通信・処理・変換などを行っているか、順に解説してみました。

(0)リンクのクリックやフォームの送信によって、ブラウザがリクエストを出す。
(1)ブラウザから該当JSPにリクエストが来る、もしくはサーブレットが該当JSPにリクエストをディスパッチする。
(2)該当JSPは、必要であれば自動的にJAVAに変換され、コンパイルされる。
(3)該当JSPは、そこに書かれていた内容からレスポンス(このケースはHTML)を生成してブラウザに返す。
(4)ブラウザはサーバーから受け取ったHTMLを表示しようとする。
(5)表示しつつ、その中で発見した他に読み込むべきファイル(jsファイルなど)をサーバーにリクエストする。
(6)サーバーは、リクエストされたファイルがJSPではない(例えばjsファイル)ので、返せる限りファイルをそのままの内容で返す。
(7)(4)から(6)を繰り返し、(4)のHTMLを最後まで表示しきったらそのページのロード完了

(補足)

(3)では、JSPのスクリプトレットが実行・展開され、カスタムタグが変換されて、HTMLが生成されます。
なので >>1 の 2. は、メッセージを変換されてpタグの間に記述された状態で、ブラウザが受け取ります。

(6)jsファイルにスクリプトレットやカスタムタグを記述しても変換されないので、>>1 の 1. はそのままカスタムタグが出力されています。

(7)表示された画面で動くJavaScriptは、(4)以降しか知りえません。(4)で受け取ったHTMLベースで動くのです。
つまり、HTMLに変換される前のJSPの記述や、サーバー側の変数の値などは直接参照・変更できません。

だから、JavaScriptに関する質問をするときは、JSPのソース(変換前)ではなく、ブラウザが受け取った(変換後の)HTMLを載せる方がよいのですよ。



結局「どうすればいいか」ですが、

(A)サーバー側からブラウザに渡したい変数の値、このケースでいう“メッセージリソース”は、サーバー側で変換しなければならない
(B)だから<bean:message key="****"/>はjspファイルに書かなければならない。
(C)かといって(B)を最初から表示できないので、いきなり表示されない場所に書く。
 (C-1)その方法は、"pic"をスタイルシートで非表示にしておくとか(でもこの方法だとappendChild使わない)
<p id="pic" style="visibility:hidden;"><bean:message key="****"/></p></font>

 (C-2)JavaScriptの変数に持たせておくとか、いろいろある
JSP----------------------------
<script ...>
var ErrorMessage = "<bean:message key="****"/>";
</script>

(D)いざエラーになったら、それを表示すればよい

このような方針ではどうでしょうか。

一覧へ戻る