我正在使用tomcat 8.0.9(servlet 3.1,jsp 2.3,el 3.0)并尝试从jsp页面访问静态属性,如下所示:
${Boolean.TRUE}
没有错误,但渲染结果中没有输出。我究竟做错了什么?
修改的
this question(标记为重复问题)的答案声称,自从EL 3.0(JSR-341,Java EE 7的一部分)以来,可以为所有java.lang。*类引用常量是隐式导入的,可以这样使用
${Boolean.TRUE}
这个答案对我不起作用,至少不适用于tomcat 8.
编辑2
从Oracle's JEE7 Tutorial(9.3.1.2引用对象属性或集合元素)
您可以使用语法classname.field引用静态字段或方法,如以下示例所示:
Boolean.FALSE
classname是没有包名的类的名称。默认情况下,将导入所有java.lang包。您可以根据需要导入其他包,类和静态字段。
答案 0 :(得分:7)
<强>更新强>
Tomcat中存在一个错误(至少从8.0.9开始)jsp-api.jar。根据{{3}},它在Tomcat 8.0.15版中得到修复。
作为解决方法,在apache-tomcat-8.0.9 \ lib文件夹中将jsp-api.jar替换为the change log。在eclipse中刷新项目,您将看到
的输出 Testing: ${Boolean.TRUE}
为:
Testing: true
这被认为是GLASSFISH中的一个错误javax.servlet.jsp-api-2.3.2-b01.jar。
为了访问java.lang
包之外的静态字段或方法,必须将这些特定包或类添加到EL上下文中(BalusC here也讨论过)。
以下示例允许对Web应用程序中所有jsp文件的java.time
包中的类进行静态访问:
@WebListener
public 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()}
不起作用。