奇怪行为

问题描述:

我在我的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> 

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

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

+0

你如何在''标签中使用变量? – axtavt

+0

对不起,该变量用在c:choose标签中。我用c:choose代码更新了这个问题。 – Manish

+0

用javap工具运行类文件,看看变量是否仍然存在。 – Shailendra

EL表达式${blockScreen==true}使用名为blockScreen,不是一个小脚本变量的请求属性因此编译器可以*地优化usused变量。

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

+0

正确的钱!谢谢! – Manish

AFAIR变量的作用域是scriplet(和生成的servlet)的本地作用域,所以它在页面的其余部分是NOT可见/可访问。为此,编译器将完全删除它。
如果可以使用相同名称的,这意味着它宣布页面宽度可变别处的页面其他变量地方......

+0

但是,如果在下面的c:choose标签中使用了相同的变量,它应该不会导致编译错误? – Manish

+0

没有编译错误,因为您正在声明限制范围更大的局部变量。 –