有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jsp编译器的java奇怪行为

我的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变量在类文件中被清除。同一个变量在c:choose标记中进一步使用:

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

我正在使用JBossEAP6服务器

感谢您在这方面的帮助


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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