Jsf 将EL 2.2与Tomcat 6.0.24一起使用

Jsf 将EL 2.2与Tomcat 6.0.24一起使用,jsf,parameters,action,tomcat6,Jsf,Parameters,Action,Tomcat6,使用JSF 2,您应该能够做到这一点: <h:commandButton action="#{myBean.myAction(myParameter)}"/> 这对Glassfish v3非常有效。但是,在Tomcat上,您会收到一个ELException,通知解析错误 Caused by: javax.el.ELException: Error Parsing: ... 现在,通过替换Tomcat lib目录中的elAPIjar,有了一个和Glassfish的实现,但是我仍然会

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

<h:commandButton action="#{myBean.myAction(myParameter)}"/>
这对Glassfish v3非常有效。但是,在Tomcat上,您会收到一个ELException,通知解析错误

Caused by: javax.el.ELException: Error Parsing: ...
现在,通过替换Tomcat lib目录中的
elAPI
jar,有了一个和Glassfish的实现,但是我仍然会遇到同样的错误,而且运气不好。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>

正如我在评论中提到的,这可以通过升级EL实现(即用EL-impl-2.2.jar替换jasper-EL.jar)来解决。

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

其他答案提到删除jasper或创建ExpressionFactoryImpl的自定义实现。这可能行得通,但你不需要这么做

您只需要在myfaces上使用org.apache.myfaces.expression_工厂或在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>

org.apache.myfaces.EXPRESSION\u工厂
com.sun.el.ExpressionFactoryImpl
com.sun.faces.expressionFactory
com.sun.el.ExpressionFactoryImpl

用el-api-2.2.jar和el-impl-2.2.jar替换el-api.jar和el-impl.jar可以解决问题

您还需要在context.xml中添加context参数

<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>

org.apache.myfaces.EXPRESSION\u工厂
com.sun.el.ExpressionFactoryImpl
com.sun.faces.expressionFactory
com.sun.el.ExpressionFactoryImpl
您可以使用JBoss EL

它是表达式语言2.1的一个实现。但它有扩展,允许使用示例中的方法参数:

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

另请参见。

此问题不是JSF 2特有的。它是JSP-EL2.2专用的。谢谢。我尝试了两天,所有的解决方案都在网上飞来飞去,这是唯一有效的解决方案。建议将-api jar放在服务器端路径上似乎不是常识-api通常意味着这是一个规范,只需要编译时(这可以通过maven中的“提供”范围来完成。此外,如果您提供自己的实现,我建议您将其与“运行时”一起放在maven项目中范围。我故意将与服务器端库可能发生冲突的问题留待讨论……很明显,如果您的tomcat发行版中已经提供了一个实现,那么这里就会有冲突。tomcat已经有了一个el api,但它是一个非常旧的版本,他希望使用一个更新的版本。在2015年的这个时候,o当然,升级Tomcat会更有意义,但是当最初提出这个问题时,在切换到其他东西(比如Glassfish,它为他工作)不是一个选项的情况下,替换陈旧的el api是唯一真正的选项。
<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>
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
<context-param>
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>