0

JSP で HaspMap をループしようとするとき、多くの質問と回答を読みましたが、
ほとんどの場合、jstl taglib を使用して以下を利用することを示しています。

<c:forEach items="${myHashMap}" var="units">
    ...
</c:forEach>

ただし、これは次の場所では機能しません (- ...???... を参照): 私がやろうとしているのは、入力テキスト フィールドがフォーカスを失ったときです。以前にコントローラーから提供しました。

<script type="text/javascript">
    $(document).ready(function(){
        $("#someInput").blur(function(){
            ... ??? ... 
        });
    });
</script>

だから私は2つの質問があります:

1: JSP 関数内で HashMap をループするには、何を使用できますか?

2: スクリプトレットを避けたいことを念頭に置いて、jsp 領域内で使用できる関数を確認するには、何を読むことができますか。

どうもありがとう

ショーン

BAH ...: - 可能な解決策-

だから私はすでにこれに対する解決策を見つけました(私は思う)...

var csm = ${cs};
var keysArray = new Array();
for (var key in csm) {
    keysArray.push(key);
}  

次に、次のように、while ループで Array を単純にループします。

var i = 0;
while (i < keysArray.length) {
    if ( (var1_toCheck === keysArray[i]) && (var2_toCheck === csm[keysArray[i]])) {
        alert("**WARNING**\n\nYou have found a match!");
        break;
    }
    i++;
}

マッチはまだ機能していませんが、私はまだそれに取り組んでいます...

私のソリューションを改善するための提案をいただければ幸いです。

乾杯ショーン

そして...マッチングも修正しました

コントローラーは、で構成されるハッシュマップを送信していますが、入力フィールドから受け取った値を解析していませんでした。

だから私はこれを変えた

var val1_toCheck = $("#val1").val();

これに

var val1_toCheck = parseInt($("#val1").val());

今は大活躍しているようです。

前に述べたように...私がやろうとしていたことを達成するためのより良い方法があれば、ポインタをいただければ幸いです...


サーブレットでデータが利用可能になるまで待ってから送り返すことはしません。

サーブレットは、サーバーが管理するスレッド プールからサーバーが提供する独自のスレッドで実行されることを思い出してください。したがって、多くのクライアントPOSTがほぼ同時にこのリクエストを送信し、サーブレットが待機を開始した場合、アプリケーションのスレッドが不足する可能性があると想像してください。

POSTリクエストをすぐに返してGET、サーブレットをポーリングしてデータを取得する別の ajax リクエストを用意します。ポーリングを実装するには、javascript のsetInterval()を使用できます。

4

1 に答える 1

1

JavaHashMapオブジェクトは、サーバー上の JVM によってのみ定義および認識されます。それを構成するデータを、ユーザーのブラウザーで Javascript が使用できる構造にする必要があります。List考えられる解決策は機能しますが、サーバー側で各キーをオブジェクトに入れ、それを JSON 文字列にシリアル化する作業を行う必要があります。代わりに、コントローラーで Map オブジェクトをシリアル化してみてください。キーが整数のように聞こえるので、次のようにします。

Map<Integer, String> csm = new HashMap<Integer, String>();
csm.put(1, "valueone");
csm.put(2, "valuetwo");
csm.put(3, "valuethree");
String json = new Gson().toJson(csm, Map.class);
request.setAttribute("cs", json);

これで、jsp で行うコーディングが大幅に減り、オブジェクトを処理することで Javascript の OO の性質を利用できるようになり、キーをループする必要がなくなります。

var csm = ${cs};
var1_toCheck = '1'; // string values - no need for parseInt()
var2_toCheck = '2';

// check to see if key is a property of the csm object using typeof csm[var1_toCheck] != 'undefined'
// check equality of var1 and var2 values (not sure I understand your intent with this logic)
if (typeof csm[var1_toCheck] != 'undefined' && var1_toCheck == var2_toCheck)
    alert('Found a match');
else
    alert('No match');

したがって、 を使用してキーの存在をテストしますtypeof csm[varToCheck] != 'undefined'。マップから値にアクセスする必要がある場合は、 を使用しますcsm[keyVar]。このように、サーバー側とクライアント側で構造を同じように扱うことで、保守性が向上します。

于 2013-10-04T15:15:37.933 に答える