17

使用 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: ...

现在,通过替换 Tomcat lib 目录中的jar来使用 EL 2.2 和 Glassfish 的实现来完成这项工作有一个记录的方法el-api,但是我仍然遇到同样的错误,但没有运气。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
4

4 回答 4

25

如其他答案中所述,您需要将 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>
于 2010-09-27T21:43:18.953 回答
8

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

于 2010-03-01T12:32:21.217 回答
2

您可以使用 JBoss EL。

它是表达式语言 2.1 的实现。但它具有允许方法参数的扩展,如您的示例中所示:

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

好处是你只需要改变你的 webapp 而不是 Tomcat 的 lib 目录。

指示

  1. 下载最新版本的 Seam 2
  2. 提炼lib/jboss-el.jar
  3. 将其复制到WEB-INF/lib/jboss-el.jar
  4. 在你的web.xml集合中:

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

另请参阅在 EL 中调用直接方法或带参数的方法

于 2013-11-20T21:17:56.690 回答
1

将 el-api.jar 和 el-impl.jar 替换为 el-api-2.2.jar 和 el-impl-2.2.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>
于 2011-04-04T12:36:34.467 回答