JSFコマンドボタン属性が正しく転送されない
-
23-09-2019 - |
質問
JSFページに次のコードがあり、JSFマネージドBeanによってサポートされています
<h:dataTable value="#{poolBean.pools}" var="item">
<h:column>
<f:facet name="header">
<h:outputLabel value="Id"/>
</f:facet>
<h:outputText value="#{item.id}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputLabel value="Start Range"/>
</f:facet>
<h:inputText value="#{item.startRange}" required="true"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="End Range"/>
</f:facet>
<h:inputText value="#{item.endRange}" required="true"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Pool type"/>
</f:facet>
<h:selectOneMenu value="#{item.poolType}" required="true">
<f:selectItems value="#{poolBean.poolTypesMenu}"/>
</h:selectOneMenu>
</h:column>
<h:column>
<f:facet name="header"/>
<h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
<f:attribute name="pool" value="#{item}"/>
</h:commandButton>
</h:column>
</h:dataTable>
このコード フラグメントは、アイテムのコレクションの編集専用です。テーブルの各行には、行の変更された値をサーバーに送信する「編集」ボタンが含まれています。アイテム自体を属性として持ちます。送信は、バッキング マネージド Bean の actionListener メソッドを呼び出すことによって実行されます。
このコードは Glassfish v 2.1 で正しく実行されます。
しかし、サーバーが Glassfish v 2.1.1 に更新されると、属性が正しく渡されなくなりました。編集されたアイテムを渡す代わりに (テーブル行の値を変更すると、実際には基礎となるオブジェクトフィールドが変更されます)、ソースアイテムがサーバーに送信されます。以前にページに与えられたアイテム。ページ上で行われたすべての変更は破棄されます。
jsf バージョンを 1.2_02 から 1.2_14 に更新しようとしました (jsf RI を使用しています) が、効果はありませんでした。
おそらく誰かが同じ問題に遭遇したでしょうか?助けや提案をいただければ幸いです。
解決
Glassfish には JSF がバンドルされて出荷されます。 Glassfish v2.1.1 は Mojarra 1.2_13 に同梱されています. 。実際には、独自の JSF ライブラリを /WEB-INF/lib
. 。この特定の問題がどのように発生するのかはわかりませんが、まず、クラスパス内に JSF バージョンの競合がないことを確認する必要があります。
そうは言っても、Bean プロパティを渡す JSF 1.2 の推奨方法は、 f:setPropertyActionListener
.
<h:commandButton id="ModifyPool" actionListener="#{poolBean.updatePool}" image="img/update.gif" title="Modify Pool">
<f:setPropertyActionListener target="#{poolBean.pool}" value="#{item}"/>
</h:commandButton>
アップデート:何かを思い出します。この問題は、1.2_05 よりも古い JSF 1.2 バージョンがクラスパス内にまだ存在していることを示唆しています。このバージョンでは、パフォーマンスの向上を優先して、コンポーネント属性の処理が変更されました。一言で言えば、もしあなたが持っているなら、 jsf-api.jar
クラスパスに 1.2_05 より古いものがある一方で、 jsf-impl.jar
クラスパスに 1.2_05 以降が含まれている場合、まさにこの問題が発生します。
解決策は明らかです。クラスパスをクリーンアップして、古い JSF バージョンを削除します。Web アプリのデフォルトのクラスパスでカバーされるパスは、それぞれの下にあります。 /WEB-INF/lib
, Appserver/lib
(これは Glassfish の場合です。 Appserver/domains/domainname/*
) そしてその JRE/lib
そして JRE/lib/ext
. 。Glassfish のことを覚えておいてください。 javaee.jar
JSF ライブラリも含まれているため、その JAR (またはその他のアプリサーバー固有の JAR ファイル) がファイル内に存在しないことを確認する必要があります。 /WEB-INF/lib
または別の場所にあります。
他のヒント
あなたは<のJBoss ELを追加することができます/ A>と書き込みます:
#{poolBean.updatePool(item)}
あなたはJSF RIと罰金を動作しますが、そのために全体のシームを必要としません。
おそらくそれは仕方JSF 1.2実装のactionListenerに関係しています。 >のactionListener - - >アクションJSF 1.1ではおよびJSF 1.2の最新の実装(RichFacesの、トリニダードなど)まで、オーダーはsetPropertyActionListener(または属性)でした。 JSF 1.2では、今RichFacesのトリニダードに実装(いないことを確認ICEfacesをについての)順番があるのactionListener - > setPropertyActionListener(または属性) - >アクション。 私はそれが邪魔して非常に迷惑されて知っています... 誰がそれを考えましたか?彼らは心の中で何をしていたのですか? とにかく、代わりのactionListenerのアクションを使ってみて、それが動作するかどうかを確認します。