0

我的 jsp scriptlet 中有以下代码(在 <% %> 内):

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 变量。我反编译了class文件,可以看到如下代码:

   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>

我正在使用 JBoss EAP 6 服务器。

在这方面的任何帮助表示赞赏。

4

2 回答 2

1

EL 表达式${blockScreen==true}使用名为 的请求属性blockScreen,而不是同名的 scriptlet 变量,因此编译器可以自由优化掉使用的变量。

如果您想改用 scriptlet 变量,请尝试<c:when test="<%= blockScreen %>">.

于 2012-09-19T10:37:11.603 回答
0

AFAIR 变量的范围对于 scriplet(和生成的 servlet)是本地的,因此它在页面的其余部分可见/不可访问。出于这个原因,编译器将完全删除它。
如果您可以在页面的其他地方使用同名变量,这意味着它在其他地方被声明为页面范围的变量......

于 2012-09-19T10:32:52.413 回答