Java jsp编译器的奇怪行为

Java jsp编译器的奇怪行为,java,jsp,jboss,Java,Jsp,Jboss,我的jsp scriptlet(内部)中有以下代码: 与上述jsp对应生成的java文件包含以下代码(相同): 但是当我调试时,我看不到blockScreen变量。我反编译了类文件,可以看到以下代码: if(!title.equalsIgnoreCase(labelA)) if(!title.equalsIgnoreCase(labelB)); 不确定为什么blockScreen变量在类文件中被清除。同一个变量在c:choose标记中进一步使用: <c:ch

我的jsp scriptlet(内部)中有以下代码:

与上述jsp对应生成的java文件包含以下代码(相同):

但是当我调试时,我看不到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服务器


非常感谢您在这方面的帮助。

AFAIR您的变量范围是scriplet(和生成的servlet)的本地范围,因此它在页面的其余部分不可见/不可访问。因此,编译器将完全删除它。

如果可以在页面的其他地方使用同名变量,这意味着它在其他地方声明为页面范围的变量…

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


如果要改为使用scriptlet变量,请尝试

如何在
标记中使用该变量?很抱歉,该变量在c:choose标记中使用。我已经用c:choose代码更新了这个问题。用javap工具运行类文件,看看变量是否仍然存在。但是,当在下面的c:choose标记中使用相同的变量时,它不应该导致编译错误吗?没有编译错误,因为您声明的是范围更为有限的局部变量。
   if(!title.equalsIgnoreCase(labelA))
            if(!title.equalsIgnoreCase(labelB));
<c:choose>
<c:when test="${blockScreen==true}">
<!--do something -->    
</c:when>
<c:otherwise>
<!--do something else -->
</c:otherwise>
</c:choose>