我正在使用 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 引用对象属性或集合元素)
You can reference a static field or method using the syntax classname.field, as in the following example:
Boolean.FALSE
The classname is the name of the class without the package name. By default, all the java.lang packages are imported. You can import other packages, classes, and static fields as needed.
最佳答案
更新:
Tomcat(至少从 8.0.9 开始)的 jsp-api.jar 中有一个错误。根据the change log , 它在 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 中的错误 here .
为了访问 java.lang
包之外的静态字段或方法,必须将那些特定的包或类添加到 EL 上下文中(BalusC 也讨论过 here )。
下面是一个允许静态访问 java.time
包中的类的示例,用于您的 Web 应用程序中的所有 jsp 文件:
@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()}
不起作用。
关于java - 通过 EL 3.0 (JEE7; Tomcat 8) 访问 JSP 中的静态属性或方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768377/