为什么 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>&nbsp;|&nbsp;
</c:when>
<c:when test="${sessionScope.role eq 'C'}">
<h:outputLink value="../../faces/pages/customer/Home.jsp">Home</h:outputLink>&nbsp;|&nbsp;
                        </c:when>
<c:otherwise>
        <h:outputLink value="../../faces/pages/login.jsp">Home</h:outputLink>&nbsp;|&nbsp;
                    </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]

  1. antlr-2.7.7
  2. cglib-2.2
  3. commons-collections-3.1
  4. dom4j-1.6.1
  5. hibernate-commons-annotations-4.0.5.Final
  6. hibernate-core-4.3.9.Final
  7. hibernate-entitymanager-4.3.9.Final
  8. hibernate-jpa-2.1-api-1.0.0
  9. jandex-1.1.0.Final
  10. javaassist-3.18.1-GA
  11. javax.faces-2.2.10
  12. javax.persistence-2.1.0-RC2
  13. jboss-logging-3.1.3.GA
  14. jboss-transaction-api_1.2-spec-1.0.0.Final
  15. joda-time-2.2
  16. jstl
  17. jta-1.1
  18. junit-4.9b2
  19. log4j-1.2.15
  20. ojdbc7
  21. org.apache.commons.fileupload
  22. servlet-api
  23. servlet
  24. slf4j-api-1.6.1
  25. 标准

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