0

I am using Java servlets with Tomcat to display a table of Places in HTML. The data in the table's rows consists of info like name, location, etc. and are obtained by taking the servlet response data and injecting it into the tags. Once this is done however, I need to use Javascript to manipulate the "td" elements based their values. So if one of the locations which went into a "td" element was "USA," my Javascript function would do something specific to the "USA" element, like make the surrounding border red, white and blue.

I do not want to send a request using $.ajax. I simply want to, within the scope of a script element, access the attributes returned by the servlet response like I do in the following way with JSP scriptlets

<% request.getAttribute("location"); %>

I'm kind of surprised I haven't found how to do this online because it seems like an daily action of anyone working with servlets and JS, but I've searched on SO and Google to no avail.

4

3 に答える 3

5

@CarlosGavidia (ペルー人) が説明したように、スクリプトレットはサーバー側で実行され、JavaScript (および jQuery や Dojo などの他のフレームワーク) はクライアント側 (ブラウザー クライアントなど) で実行されます。また、スクリプトレットの使用は強くお勧めしません。詳細な説明は次のとおりです: How to avoid Java code in JSP files?

最後のリンクにアクセスした場合、 ELおよびJSTLを使用して、ページ コンテキスト (PageContext)、リクエスト (ServletRequest)、セッション (HttpSession)、および/またはアプリケーション (ServletContext) 属性にアクセスする必要があることがわかります (関連情報: c:set を介して jsp:include にパラメータを渡す方法は? JSP の変数のスコープは? )。

この背景から、DOM の一部として設定されるか、JavaScript コードに挿入されない限り、リクエスト属性 (または Java コードからの他の属性) に直接アクセスできないことが理解できるようになりました。両方のケースの例を示します:

  1. request 属性を DOM の一部として設定します。

    <input type="hidden" id="hidReqAttr" value="${location}" />
    <script type="text/javascript">
        function foo() {
            var fromJavaSide = document.getElementById("hidReqAttr").value;
            //fromJavaSide value will be ${location}
        }
    </script>
    
  2. JavaScript に request 属性を直接挿入します。

    <script type="text/javascript">
        function foo() {
            var fromJavaSide = '<c:out value="${location}" />';
            //fromJavaSide value will be ${location} as string
        }
    </script>
    

これらのアプローチのいずれかを使用すると、JavaScript を使用して Java サーバー変数値を操作できることを意味しますが、JavaScript 側でのみ機能し、サーバー側で設定されたリクエスト属性値には影響しません。言い換えると:

<script type="text/javascript">
    function foo() {
        var fromJavaSide = '<c:out value="${location}" />';
        //fromJavaSide value will be ${location} as string
        fromJavaSide = fromJavaSide + '_modified';
        //last line affects only the JavaScript variable, not the request attribute value
    }
</script>

したがって、「td」要素に入った場所の 1 つが「USA」である場合、私の Javascript 関数は、周囲の境界線を赤、白、青にするなど、「USA」要素に固有の処理を行います。

ID を持つ HTML コンポーネントを使用するか、CSS クラス名を に適用して<td>、目的の値がどこで得られるかを確認します。例として使用"USA"

<td class="${location eq 'USA' ? 'usaStyle' : 'commonStyle'}">${location}</td>
<script type="text/javascript">
    function foo() {
        var usaTDs = document.getElementsByClassName('usaStyle');
        //now you have all TDs with usaStyle that has your `USA` text
    }
</script>

あなたのコメントに基づいて、リクエストパラメーターにもアクセスしたいと考えています(おそらくクエリ文字列から)。それらを取得するために使用${param.parameterName}します。上記の EL リンクの詳細については、リクエスト パラメーターの取得やその他の機能について説明しているImplicit EL objectsセクションを確認してください。

于 2013-07-17T19:24:26.680 に答える
0

HTML DOM 操作は JavaScript で行う必要があります。JSP/サーブレットは、サーバー側のプログラミング手法でありHTTPServletRequest、JavaScript を介してアクセスできないようなオブジェクトです。そのインスタンスはサーブレット コンテナーに存在し、JavaScript はクライアント ブラウザーで実行されます。

一方、TD純粋な JavaScript を使用してタグの内容を変更しても問題はありません。Dojo や JQuery などのツールキットを使用すると、このタスクを簡単に行うことができます。

于 2013-07-17T15:48:51.300 に答える