web-dev-qa-db-ja.com

JavaScriptでJava /サーブレット/ JSP / JSTL / EL変数にアクセス

JSPにフォームがあります。 (サーブレットからの)リクエストオブジェクトに基づいてデータを入力する必要があります。 Javaスクリプトを使用してリクエストオブジェクトの属性にアクセスするにはどうすればよいですか、またはフォームに動的に入力する他のより良い方法を提案できる場合はどうすればよいですか?

15
Reddy

Java/JSPは単なるHTML/CSS/JSコードプロデューサーであることを理解する必要があります。したがって、JSPにJava変数をJavaScript変数であるかのように出力させ、生成されたHTML/JSコード出力が構文的に有効であることを確認するだけです。

Java変数がELスコープで${foo}によって使用可能である場合、それを出力する方法のいくつかの例を次に示します。

<script>var foo = '${foo}';</script>
<script>someFunction('${foo}');</script>
<div onclick="someFunction('${foo}')">...</div>

Java変数の値が"bar"であると想像してください。そうすると、JSPは最終的にこのHTMLを生成し、右クリックで確認できますソースの表示Webブラウザ内:

<script>var foo = 'bar';</script>
<script>someFunction('bar');</script>
<div onclick="someFunction('bar')">...</div>

したがって、JSで文字列型の変数を表すには、これらの単一引用符が必須であることに注意してください。代わりにvar foo = ${foo};を使用した場合、var foo = bar;が出力され、JSコードのさらに下にアクセスしようとすると、「bar isundefined」エラーが発生する可能性があります(JSエラーが表示されます)。 Chrome/FireFox23 +/IE9 +でF12キーを押すと開くことができる、ブラウザのWeb開発者ツールセットのJSコンソールで。また、変数が数値またはブール値を表し、引用符で囲む必要がない場合は、正常に機能することにも注意してください。

変数がユーザー制御の入力から発生した場合は、 XSS攻撃ホール および JSエスケープ を考慮に入れるようにしてください。 EL wikiページ の下部近くに、JSで安全に使用するためにJava変数をエスケープするカスタムEL関数を作成する方法の例があります。

変数がもう少し複雑な場合、たとえばa Java Bean、またはそのリスト、またはマップの場合、利用可能な多くの JSONライブラリ の1つを使用してJava JSON文字列に対するオブジェクト。これはGsonを想定した例です。

String someObjectAsJson = new Gson().toJson(someObject);

この方法では、引用符で囲まれた文字列として出力する必要がなくなったことに注意してください。

<script>var foo = ${someObjectAsJson};</script>

参照:

19
BalusC

HTTPリクエストのパラメータに基づいてフォームフィールドに事前入力している場合は、JavaScriptを使用してクライアント側ではなく、JSPのサーバー側でこれを実行してみませんか? JSPでは、漠然と次のようになります。

<input type="text" name="myFormField1" value="<%= request.getParameter("value1"); %>"/>

クライアント側では、JavaScriptには実際には「リクエストオブジェクト」の概念がありません。 CGIパラメータを取得するには、クエリ文字列を手動で解析する必要があります。それはあなたが実際にやりたいことではないと思います。

6
Steve Perkins

JSPファイルの場合:

<head>
...
<%@ page import="com.common.Constants" %>
...
</head>
<script type="text/javascript"> 
        var constant = "<%=Constants.CONSTANT%>"
</script>

この定数変数は、上記のコードの後に​​宣言された.jsファイルで使用できるようになります。

Constants.Javaは、CONSTANTという名前の静的定数を含むJavaファイルです。

私が持っていたシナリオは、プロパティファイルから1つの定数が必要だったので、javascriptのプロパティファイルを作成する代わりに、これを行いました。

0
Raj Kundalia