在Jetty和Java 7上找不到javax.el.ExpressionFactory.newInstance()



我有这个JSP:

<%@ page pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set var="contextPath" value="http://localhost:8000/"/> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
        <link type="text/css" rel="stylesheet" href="${contextPath}/css/styles.css"/>
</head>
<body>
    <!-- some html -->
</body>

当我导航到此页面时,我会得到下一个错误:

java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;  
at org.apache.jasper.compiler.JspUtil.getExpressionFactory(JspUtil.java:1182) 
at org.apache.jasper.compiler.JspUtil.validateExpressions(JspUtil.java:644)
at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:752)
at org.apache.jasper.compiler.Node$ELExpression.accept(Node.java:946)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)
at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2341)
at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2347)
at org.apache.jasper.compiler.Node$Root.accept(Node.java:498)
at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2291)
[...]

执行此页面的环境是Java7和Jetty。

如果我删除${contextPath},效果会很好。

为什么我会有这个错误?

向致以最良好的问候

错误的原因是类路径中有两个不同的EL语言jar。

  • EL 2.1版是您的网络应用程序正在使用的内容,也是您错误的原因(EL 2.1中不存在该方法)
  • EL 2.2版是您的Web应用程序需要用于javax.el.ExpressionFactory.newInstance()的版本,因为该方法已在EL 2.2中介绍

确保您使用的是正确版本的EL库,并且您的网络应用中没有多个版本的EL

还有,为什么不直接使用。。。

<link type="text/css" rel="stylesheet"
      href="${pageContext.request.contextPath}/css/styles.css"/>

并跳过您正在使用的整个<c:set>?(无论如何,选择完全限定的URI是个坏主意)

最新更新