jsp编译器的奇怪行为

时间:2012-09-19 10:25:05

标签: java jsp jboss

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

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

不确定为什么要在类文件中清除blockScreen变量。在c:choose标签中进一步使用相同的变量:

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

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

对此方面的任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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