0

jspスクリプトレット(<%%>内)に次のコードがあります。

boolean blockScreen = false;
    if(title.equalsIgnoreCase(labelA) || title.equalsIgnoreCase(labelB))
    {
    blockScreen = true;
    }

上記のjspに対応して生成されたJavaファイルには、次のコード(同一)が含まれています。

boolean blockScreen = false;
        if(title.equalsIgnoreCase(labelA) || title.equalsIgnoreCase(labelB))
        {
        blockScreen = true;
        }

しかし、デバッグすると、blockScreen変数が表示されません。クラスファイルを逆コンパイルすると、次のコードが表示されます。

   if(!title.equalsIgnoreCase(labelA))
            if(!title.equalsIgnoreCase(labelB));

blockScreen変数がクラスファイルでクリーンアップされる理由がわかりません。同じ変数がac:chooseタグのさらに下で使用されます。

<c:choose>
<c:when test="${blockScreen==true}">
<!--do something -->    
</c:when>
<c:otherwise>
<!--do something else -->
</c:otherwise>
</c:choose>

JBossEAP6サーバーを使用しています。

この点での助けはありがたいです。

4

2 に答える 2

1

EL 式${blockScreen==true}は、同じ名前のスクリプトレット変数ではなく、という名前のリクエスト属性を使用するblockScreenため、コンパイラは usused 変数を自由に最適化して除去できます。

代わりにスクリプトレット変数を使用する場合は、 を試してください<c:when test="<%= blockScreen %>">

于 2012-09-19T10:37:11.603 に答える
0

AFAIR変数のスコープはスクリプトレット(および生成されたサーブレット)に対してローカルであるため、ページの残りの部分では表示/アクセスできません。このため、コンパイラはそれを完全に削除します。ページ内の別の場所で同じ名前の変数を使用できる
場合、それはページ全体の変数が別の場所で宣言されていることを意味します...

于 2012-09-19T10:32:52.413 に答える