Skip to main content
 首页 » 编程设计

jsf之将 EL 2.2 与 Tomcat 6.0.24 一起使用

2025年05月04日104xing901022

使用 JSF 2,您应该能够做到这一点:

<h:commandButton action="#{myBean.myAction(myParameter)}"/> 

然后它会调用 action 方法,传入参数(假设它是一个整数):
@ManagedBean 
@SessionScoped 
public class MyBean { 
    ... 
    public String myAction(Integer myParameter) { 
        // do something 
        return null; 
    } 
    ... 
} 

这在 Glassfish v3 上完美运行。但是不是在 Tomcat 上,您会收到一个 ELException 通知解析错误
Caused by: javax.el.ELException: Error Parsing: ... 

现在,有一个 documented way of making this work using EL 2.2和 Glassfish 通过替换 el-api 来实现jar 在 Tomcat lib 目录中,但是我仍然遇到同样的错误,但没有运气。 Tomcat 真的开始让我沮丧了! JSF2 旨在变得更简单!

Maven POM 片段:
<repositories> 
  <repository> 
    <id>sun</id> 
    <url>http://download.java.net/maven/2/</url> 
  </repository> 
  <repository> 
    <id>jboss</id> 
    <url>http://repository.jboss.com/maven2/</url> 
  </repository> 
</repositories> 
... 
  <dependency> 
    <groupId>javax.el</groupId> 
    <artifactId>el-api</artifactId> 
    <version>2.2</version> 
    <scope>provided</scope> 
  </dependency> 
 
  <dependency> 
    <groupId>org.glassfish.web</groupId> 
    <artifactId>el-impl</artifactId> 
    <version>2.2</version> 
    <scope>provided</scope> 
  </dependency> 

更多信息。

这是堆栈跟踪的一部分,似乎它仍在使用 Apache EL 实现,而不是我转储到 lib 中的那个。我完全删除了现有的 el-api.jar Tomcat 自带的,有没有 el-impl.jar我也打算删除可能覆盖某些东西的地方?
Was expecting one of: 
    "}" ... 
    "." ... 
    "[" ... 
    ">" ... 
    "gt" ... 
    "<" ... 
    "lt" ... 
    ">=" ... 
    "ge" ... 
    "<=" ... 
    "le" ... 
    "==" ... 
    "eq" ... 
    "!=" ... 
    "ne" ... 
    "&&" ... 
    "and" ... 
    "||" ... 
    "or" ... 
    "*" ... 
    "+" ... 
    "-" ... 
    "/" ... 
    "div" ... 
    "%" ... 
    "mod" ... 
 
    at org.apache.el.parser.ELParser.generateParseException(ELParser.java:2142) 
    at org.apache.el.parser.ELParser.jj_consume_token(ELParser.java:2024) 
    at org.apache.el.parser.ELParser.DeferredExpression(ELParser.java:113) 
    at org.apache.el.parser.ELParser.CompositeExpression(ELParser.java:40) 
    at org.apache.el.lang.ExpressionBuilder.createNodeInternal(ExpressionBuilder.java:93) 
    ... 64 more 

请您参考如下方法:

如其他答案所述,您需要将 el-api-2.2.jar 添加到 Tomcat 服务器的 lib 文件夹,并将 el-impl-2.2.jar 添加到 WEB-INF/lib 文件夹。

其他答案提到删除 jasper 或创建 ExpressionFactoryImpl 的自定义实现。这可能有效,但您不需要这样做。

您只需要使用 MyFaces 上的 org.apache.myfaces.EXPRESSION_FACTORY 或 Mojarra 上的 com.sun.faces.expressionFactory 覆盖表达式工厂实现。

<context-param> 
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
</context-param> 
  <context-param> 
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
  </context-param>