为什么 sessionScope.instance_var 的 bean 在 jstl 中进行比较时给出 Long 值,尽管 instance_var 是字符类型 class?
Why sessionScope.instance_var of bean giving Long value while comparison in jstl although the instance_var is of type Character class?
我们有一个使用 JSF 2.x 构建的小型应用程序。和 Eclipse Luna 中 Tomcat 7 的表达式语言。
在login.jsp,
<jsp:include page="header.jsp"></jsp:include>
里面 header.jsp,
<c:choose>
<c:when test="${sessionScope.role eq 'B'}">
<h:outputLink value="../../faces/pages/biller/Home.jsp">Home</h:outputLink> |
</c:when>
<c:when test="${sessionScope.role eq 'C'}">
<h:outputLink value="../../faces/pages/customer/Home.jsp">Home</h:outputLink> |
</c:when>
<c:otherwise>
<h:outputLink value="../../faces/pages/login.jsp">Home</h:outputLink> |
</c:otherwise>
</c:choose>
在 LoginBean 中,我有 "role" 类型的 "String" 实例变量。
我也在 LoginBean 上使用 @SessionScoped 和 @ManagedBean 注释。
当我尝试登录时,它抛出异常 -->
org.apache.jasper.JasperException: javax.el.ELException: Cannot convert B of type class java.lang.String to class java.lang.Long
我无法理解为什么“sessionScope.role”给出了 "Long" 值。
如果有人有任何想法,请帮助。
编辑:
在检查时,我发现它给了我另一个这样的异常:
javax.servlet.ServletException: /pages/SignUp.jsp(56,6)
'#{registrationBean.userType eq 'C'}' Cannot convert C of type class
java.lang.String to class java.lang.Long
虽然Registration Bean中的"userType"类型是"Character"
# 和 $ 都不起作用。
[![我在 lib 文件夹中有以下 jar][2]][2]
- antlr-2.7.7
- cglib-2.2
- commons-collections-3.1
- dom4j-1.6.1
- hibernate-commons-annotations-4.0.5.Final
- hibernate-core-4.3.9.Final
- hibernate-entitymanager-4.3.9.Final
- hibernate-jpa-2.1-api-1.0.0
- jandex-1.1.0.Final
- javaassist-3.18.1-GA
- javax.faces-2.2.10
- javax.persistence-2.1.0-RC2
- jboss-logging-3.1.3.GA
- jboss-transaction-api_1.2-spec-1.0.0.Final
- joda-time-2.2
- jstl
- jta-1.1
- junit-4.9b2
- log4j-1.2.15
- ojdbc7
- org.apache.commons.fileupload
- servlet-api
- servlet
- slf4j-api-1.6.1
- 标准
EL(表达式语言)结合不同的 JDKs/JREs 和 Tomcat 版本会有所不同。
对于 JDK 1.6 和某些 Tomcat-6 版本,以下语法是有效的-->
<c:when test="${role eq 'B'}"> ---where 'role' is Character type in backing bean
即使 JDK 1.7 和 Tomcat 7.0.12 也适用于上述语法。
但是在JDK-8中,大多数Tomcat版本(这些已经过测试-->6.0.44、7.0.34、7.0.52、7.0.62、7.0. 63、8.0.24)不认为上述语法有效(因为新的 EL2.2 规范)。他们会给出这样的异常 -->
B of java.lang.String cannot be converted to java.lang.Long
这是因为在解析上述EL时,
anything in quotes in EL is considered as String not character and is parsed as Long Unicode values.
所以为了使两者相同我们可以写
<c:when test="${role eq 'B'.charAt(0)}">
即使在 JDKs 和 Tomcats 的早期版本中也能正常工作。
同时为了避免思考在何处使用哪种语法的麻烦,
我们可以在支持 bean 中进行字符比较并将布尔变量设置为 true 或 false,然后在 jsp 中使用此布尔变量进行渲染。
<c:if> not working for comparing characters
char comparison in EL expression
我们有一个使用 JSF 2.x 构建的小型应用程序。和 Eclipse Luna 中 Tomcat 7 的表达式语言。
在login.jsp,
<jsp:include page="header.jsp"></jsp:include>
里面 header.jsp,
<c:choose>
<c:when test="${sessionScope.role eq 'B'}">
<h:outputLink value="../../faces/pages/biller/Home.jsp">Home</h:outputLink> |
</c:when>
<c:when test="${sessionScope.role eq 'C'}">
<h:outputLink value="../../faces/pages/customer/Home.jsp">Home</h:outputLink> |
</c:when>
<c:otherwise>
<h:outputLink value="../../faces/pages/login.jsp">Home</h:outputLink> |
</c:otherwise>
</c:choose>
在 LoginBean 中,我有 "role" 类型的 "String" 实例变量。 我也在 LoginBean 上使用 @SessionScoped 和 @ManagedBean 注释。
当我尝试登录时,它抛出异常 -->
org.apache.jasper.JasperException: javax.el.ELException: Cannot convert B of type class java.lang.String to class java.lang.Long
我无法理解为什么“sessionScope.role”给出了 "Long" 值。
如果有人有任何想法,请帮助。
编辑:
在检查时,我发现它给了我另一个这样的异常:
javax.servlet.ServletException: /pages/SignUp.jsp(56,6) '#{registrationBean.userType eq 'C'}' Cannot convert C of type class java.lang.String to class java.lang.Long
虽然Registration Bean中的"userType"类型是"Character"
# 和 $ 都不起作用。
[![我在 lib 文件夹中有以下 jar][2]][2]
- antlr-2.7.7
- cglib-2.2
- commons-collections-3.1
- dom4j-1.6.1
- hibernate-commons-annotations-4.0.5.Final
- hibernate-core-4.3.9.Final
- hibernate-entitymanager-4.3.9.Final
- hibernate-jpa-2.1-api-1.0.0
- jandex-1.1.0.Final
- javaassist-3.18.1-GA
- javax.faces-2.2.10
- javax.persistence-2.1.0-RC2
- jboss-logging-3.1.3.GA
- jboss-transaction-api_1.2-spec-1.0.0.Final
- joda-time-2.2
- jstl
- jta-1.1
- junit-4.9b2
- log4j-1.2.15
- ojdbc7
- org.apache.commons.fileupload
- servlet-api
- servlet
- slf4j-api-1.6.1
- 标准
EL(表达式语言)结合不同的 JDKs/JREs 和 Tomcat 版本会有所不同。
对于 JDK 1.6 和某些 Tomcat-6 版本,以下语法是有效的-->
<c:when test="${role eq 'B'}"> ---where 'role' is Character type in backing bean
即使 JDK 1.7 和 Tomcat 7.0.12 也适用于上述语法。
但是在JDK-8中,大多数Tomcat版本(这些已经过测试-->6.0.44、7.0.34、7.0.52、7.0.62、7.0. 63、8.0.24)不认为上述语法有效(因为新的 EL2.2 规范)。他们会给出这样的异常 -->
B of java.lang.String cannot be converted to java.lang.Long
这是因为在解析上述EL时,
anything in quotes in EL is considered as String not character and is parsed as Long Unicode values.
所以为了使两者相同我们可以写
<c:when test="${role eq 'B'.charAt(0)}">
即使在 JDKs 和 Tomcats 的早期版本中也能正常工作。
同时为了避免思考在何处使用哪种语法的麻烦, 我们可以在支持 bean 中进行字符比较并将布尔变量设置为 true 或 false,然后在 jsp 中使用此布尔变量进行渲染。
<c:if> not working for comparing characters
char comparison in EL expression