JSF 2を使用すると、次のことができるようになります。
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
次に、アクションメソッドを呼び出し、パラメーターを渡します(整数であると想定します)。
@ManagedBean
@SessionScoped
public class MyBean {
...
public String myAction(Integer myParameter) {
// do something
return null;
}
...
}
これはGlassfishv3で完全に機能します。ただし、Tomcatではなく、解析エラーを通知するELExceptionが発生します
Caused by: javax.el.ELException: Error Parsing: ...
さて、 EL 2.2を使用してこれを機能させる文書化された方法 とTomcatlibディレクトリのel-api
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>
より詳しい情報。
これはスタックトレースの一部ですが、まだApache EL実装を使用しているようで、libにダンプしたものではありません。 Tomcatに付属している既存のel-api.jar
を完全に削除しましたが、何かを上書きしている可能性のある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実装をアップグレードすることで解決できます(つまり、jasper-el.jarをel-impl-2.2.jarに置き換えます)
他の回答で述べたように、el-api-2.2.jarをTomcatサーバーのlibフォルダーに追加し、el-impl-2.2.jarをWEB-INF/libフォルダーに追加する必要があります。
他の回答は、ジャスパーの削除または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>
JBossELを使用できます。
これは、Expression Language2.1の実装です。ただし、例のようにメソッドパラメータを許可する拡張機能があります。
<h:commandButton action="#{myBean.myAction(myParameter)}"/>
利点は、Webアプリケーションを変更するだけで、Tomcatのlibディレクトリは変更できないことです。
指示
lib/jboss-el.jar
WEB-INF/lib/jboss-el.jar
にコピーしますweb.xml
セット内:
<context-param>
<param-name>com.Sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
直接メソッドまたはELのパラメータを持つメソッドを呼び出す も参照してください。
El-api.jarとel-impl.jarをel-api-2.2.jarとel-impl-2.2.jarに置き換えると、問題が解決します。
また、context.xmlにコンテキストパラメータを追加する必要があります
<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>