通过EL 3.0(JEE7; Tomcat 8)访问JSP中的静态属性或方法
我正在使用tomcat 8.0.9(servlet 3.1,jsp 2.3,el 3.0),并尝试从jsp页面访问静态属性,如下所示:
${Boolean.TRUE}
没有错误,但是渲染结果中没有输出。我究竟做错了什么?
编辑
这个问题的答案(标记为重复问题)声称,由于EL 3.0(JSR-341,Java EE7的一部分),可以为所有java.lang。*类引用常量,因为它们是隐式导入的,并且像所以
${Boolean.TRUE}
这个答案对我不起作用,至少对于tomcat 8不起作用。
编辑2
来自Oracle的JEE7教程(9.3.1.2引用对象属性或集合元素)
您可以使用语法classname.field引用静态字段或方法,如以下示例所示:
Boolean.FALSE
classname是没有包名称的类的名称。默认情况下,所有java.lang包都被导入。您可以根据需要导入其他包,类和静态字段。
回答:
Tomcat的jsp-
api.jar(至少从8.0.9起)中存在错误。根据更改日志,它已在Tomcat版本8.0.15中修复。
解决方法是,在apache-tomcat-8.0.9 \ lib文件夹中,将jsp-api.jar替换为javax.servlet.jsp-
api-2.3.2-b01.jar。在eclipse中刷新项目,您将看到输出
Testing: ${Boolean.TRUE}
如:
Testing: true
这被确定为GLASSFISH以及错误在这里。
为了访问java.lang
包外部的静态字段或方法,必须将这些特定的包或类添加到EL上下文中。
这是一个示例,允许您静态访问java.time
Web应用程序中所有jsp文件的包中的类:
@WebListenerpublic class Config implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
JspFactory.getDefaultFactory().getJspApplicationContext(event.getServletContext()).addELContextListener((ELContextEvent e) -> {
e.getELContext().getImportHandler().importPackage("java.time");
});
}
@Override
public void contextDestroyed(ServletContextEvent event) {}
}
现在从jsp中返回当前的LocalDate,例如:
${LocalDate.now()}
请注意,${java.time.LocalDate.now()}
这不起作用。
以上是 通过EL 3.0(JEE7; Tomcat 8)访问JSP中的静态属性或方法 的全部内容, 来源链接: utcz.com/qa/406161.html