3

我正在使用 tomcat 8.0.9(servlet 3.1、jsp 2.3、el 3.0)并尝试从 jsp 页面访问静态属性,如下所示:

${Boolean.TRUE}

没有错误,但渲染结果中没有输出。我究竟做错了什么?

编辑

这个问题的答案(标记为重复问题)声称,从 EL 3.0(JSR-341,Java EE 7 的一部分)开始,可以引用所有 java.lang.* 类的常量,因为它们是隐式导入的并且可用所以

${Boolean.TRUE} 

这个答案对我不起作用,至少不适用于 tomcat 8。

编辑 2

来自Oracle 的 JEE7 教程(9.3.1.2 引用对象属性或集合元素)

您可以使用语法 classname.field 引用静态字段或方法,如下例所示:

Boolean.FALSE

类名是不带包名的类名。默认情况下,会导入所有 java.lang 包。您可以根据需要导入其他包、类和静态字段。
4

1 回答 1

7

更新:

Tomcat(至少从 8.0.9 开始)的 jsp-api.jar 中有一个错误。根据更改日志,它在 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 上下文中(也由 BalusC在此处讨论)。

下面是一个示例,允许静态访问java.timeWeb 应用程序中所有 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()}这不起作用。

于 2014-07-23T05:41:37.147 回答