当前位置:  开发笔记 > 编程语言 > 正文

通过EL 3.0访问JSP中的静态属性或方法(JEE7; Tomcat 8)

如何解决《通过EL3.0访问JSP中的静态属性或方法(JEE7;Tomcat8)》经验,为你挑选了1个好方法。

我正在使用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

classname是没有包名的类的名称.默认情况下,将导入所有java.lang包.您可以根据需要导入其他包,类和静态字段.

Prasad.. 7

更新:

Tomcat中有一个错误(至少从8.0.9开始)jsp-api.jar.根据更改日志,它在Tomcat 8.0.15版中得到修复.

作为解决方法,在apache-tomcat-8.0.9\lib文件夹中用javax.servlet.jsp-api-2.3.2-b01.jar替换jsp-api.jar .在eclipse中刷新项目,您将看到输出

     Testing: ${Boolean.TRUE}

如:

    Testing: true

这被确定为GLASSFISH以及错误在这里.

为了访问java.lang包外部的静态字段或方法,必须将这些特定的包或类添加到EL上下文中(这里也是BalusC讨论的).

下面是一个示例,允许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()}这不起作用.



1> Prasad..:

更新:

Tomcat中有一个错误(至少从8.0.9开始)jsp-api.jar.根据更改日志,它在Tomcat 8.0.15版中得到修复.

作为解决方法,在apache-tomcat-8.0.9\lib文件夹中用javax.servlet.jsp-api-2.3.2-b01.jar替换jsp-api.jar .在eclipse中刷新项目,您将看到输出

     Testing: ${Boolean.TRUE}

如:

    Testing: true

这被确定为GLASSFISH以及错误在这里.

为了访问java.lang包外部的静态字段或方法,必须将这些特定的包或类添加到EL上下文中(这里也是BalusC讨论的).

下面是一个示例,允许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()}这不起作用.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有