Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过EL3.0(JEE7;Tomcat8)访问JSP中的静态属性或方法_Java_Jsp_Tomcat_Tomcat8_Jspell - Fatal编程技术网

Java 通过EL3.0(JEE7;Tomcat8)访问JSP中的静态属性或方法

Java 通过EL3.0(JEE7;Tomcat8)访问JSP中的静态属性或方法,java,jsp,tomcat,tomcat8,jspell,Java,Jsp,Tomcat,Tomcat8,Jspell,我正在使用tomcat 8.0.9(servlet 3.1、jsp 2.3、el 3.0),并尝试从jsp页面访问静态属性,如下所示: ${Boolean.TRUE} 没有错误,但渲染结果中不会显示任何输出。我做错了什么 编辑 对(标记为重复问题)的回答声称,由于EL3.0(JSR-341,JavaEE7的一部分),可以为所有Java.lang.*类引用常量,因为它们是隐式导入的,并且可以像这样使用 ${Boolean.TRUE} 这个答案对我不起作用,至少对Tomcat8不起作用 编辑2

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

${Boolean.TRUE}
没有错误,但渲染结果中不会显示任何输出。我做错了什么

编辑

对(标记为重复问题)的回答声称,由于EL3.0(JSR-341,JavaEE7的一部分),可以为所有Java.lang.*类引用常量,因为它们是隐式导入的,并且可以像这样使用

${Boolean.TRUE} 
这个答案对我不起作用,至少对Tomcat8不起作用

编辑2

来自(9.3.1.2引用对象属性或集合元素)

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

Boolean.FALSE

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

Tomcat的jsp-api.jar(至少在8.0.9版本)中有一个bug。据介绍,它在Tomcat版本8.0.15中已修复

作为一种解决方法,在apache-tomcat-8.0.9\lib文件夹中,将jsp-api.jar替换为。在eclipse中刷新项目,您将看到

     Testing: ${Boolean.TRUE}
作为:

这也被确认为玻璃鱼中的一种虫子

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

下面的示例允许对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()}
不起作用。

我有最基本的web应用程序,其中只有一个index.jsp页面,其中包含
应该看到true:${Boolean.true}
,但是呈现的html在冒号之后是空的。为什么不简单地使用jsp脚本呢?作为一般最佳实践,我们的应用程序中不允许使用scriptlet代码。看,你确定你在7号吉普车上吗?正如它在6中所表现的那样。也许您正在使用EL实现打包一些旧的jar应用程序。我在tomcat 8.0.9(请参阅)上使用jasper-EL.jar和一个EL-api.jar,后者包含一个清单,清单内容为
Name:javax/EL/Specification Title:Expression Language Specification Version:3.0规范供应商:Sun Microsystems,Inc.实现标题:javax.el实现版本:3.0.FR实现供应商:Apache软件基金会
我尝试了您推荐的方法(使用8.0.3很重要),我得到了一个
提供商com.sun.el.ExpressionFactoryImpl未找到
与buzzsawddog相同的结果。我尝试使用glassfish最新的el-api jar(),行为恢复到使用Tomcat8的stock el-api.jar时看到的状态。我还需要更新el impl jar替换吗?@Buzzsawdog查看我的更新答案。保持el api JAR不变,并将jsp api更改为javax.servlet.jsp-api-2.3.2-b01。@Prasad我们越来越近了<代码>${Boolean.TRUE}有效,但是,非java.lang打包类,如:
${java.time.LocalDate.now()}
${java.util.Calendar.getInstance()}
${java.math.BigDecimal.ZERO}
无效。这些文件不提供任何输出。这不也应该起作用吗?摘自问题中引用的JEE7教程:
您可以根据需要导入其他包、类和静态字段。
@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) {}
}