2012-04-27 13 views
1

JSF 2.0とRichfaces 4を使用してアプリケーションを作成しています。これは、要素を表示する多くの表から構成されていますが、通常は表示/編集/削除オプションです。私が見つけた答えが私の問題を解決しなかったので、いくつかのSOブラウジングとGoogle検索の後、私は質問を投稿することに決めました。セッションBeanを使用しないエレガントな属性の処理

すぐに、私のアプリケーションでは、リクエストBeanに格納されている特定の属性を処理する際に問題が発生しています。

たとえば、オブジェクトを編集する場合、オブジェクトはフォーム上のデータを表示するリクエストBeanに送信され(f:propertyActionListener)、要求が終了すると破棄されます。保存すると、新しいオブジェクトが作成され、フォームの属性がIDAに設定され(JPA + Hibernate)、アイテムは更新されずに保存されます。

私は多くのオプションを検討してきたし、これは私がこれまでにやったきたものであるとの結果:

F:PARAM + H:リンクまたはh:のcommandLink:@ManagedPropertyで paramはnullです、私はJNDIを通してそれを探すためにContext上でそれを見つけることができません。

f:setPropertyActionListener + h:commandLink + Request Bean:動作していますが、データが失われています。データを表示するフォームには条件付きでレンダリングされたフィールドがいくつかあり、その情報を保持できないため、検証フェーズで無効なデータが見つかった場合はフォームが乱されます。

f:viewParam + h:commandLink +スコープ付きBeanの表示:ここには奇妙なものがあります。これは、Beanがクリーンであるためフォームが情報なしでレンダリングされるため、フォームをレンダリングする前にBeanが破棄されるように見えるため、直接動作しません。

セッションBeanの使用:魔法のよう作品を、私は、私はまだJSFのライフサイクルについての事を学んでいるからといって、すべてのフォームのためのセッションBeanを作成する必要はありません、私はそれを適切に行いたいです方法。

リクエストセッションアプローチを維持したい場合は、パラメータ(オブジェクトまたはプレーンストリング)を保存し、後でリクエストBeanで取得する方法がありますか?

これは役に立ちますが、私はui:insertとui:defineによってマスターページを使用しています。

答えて

1

ビュースコープのBeanを使用します。それは動作するはずです。あなたがそこに記述している問題は、それをJSTLタグまたはidまたはbinding属性にバインドしていることを示唆しています。ビュースコープのBeanでは、このようにしないでください。 @ViewScoped fails in tag handlersも参照してください。 CDFの@Namedを使用して、JSFの@ManagedBeanの代わりにBeanを管理している可能性があります。これはまた、なぜ@ManagedPropertyがJSFの@ManagedBeanによって管理される必要があるので、あなたの試行の1つでも動作しない理由を説明します。

マスター詳細ページのアプローチについては、<f:param><h:link>を表ページに使用して、マスターページにビュー/編集リンクを作成します。

など。 user/list.xhtml

<h:dataTable value="#{userList.users}" var="user"> 
    <h:column>#{user.id}</h:column> 
    <h:column>#{user.name}</h:column> 
    <h:column> 
     <h:link value="Edit" outcome="edit"> 
      <f:param name="id" value="#{user.id}" /> 
     </h:link> 
    </h:column> 
</h:dataTable> 

Beanはスコープを要求することができます。

この場合は編集ページのdefailページでをUserに変換、検証、設定するには<f:viewParam>を使用してください。

など。

この場合であっても
@ManagedBean 
@ViewScoped 
public class UserEdit { 

    private User user; 

    @EJB 
    private UserService service; 

    public String save() { 
     service.save(user); 
     return "users"; 
    } 

    // Getter+setter. 
} 
+0

は、 'ViewScoped' @本当に良い解決策がある:user/edit.xhtml

<f:metadata> <f:viewParam name="id" value="#{userEdit.user}" converter="#{userConverter}" converterMessage="Bad request. Unknown user." required="true" requiredMessage="Bad request. Please use a link from within the system." /> </f:metadata> <h:messages /> <h:link value="Back to all users" outcome="users" /> <h:form id="user" rendered="#{not empty userEdit.user}"> <h:inputText value="#{userEdit.user.name}" required="true" /> ... <h:commandButton value="Save" action="#{userEdit.save}"> <f:ajax execute="@form" render="@form" /> </h:commandButton> </h:form> 

は、データ、サービス及びアクションメソッドを保持するために@ViewScoped Beanを使用しますか?それはもう少し作業が必要ですが、バックボタンの使用、複数のタブ/ウィンドウ、およびビュースコープのデータの期限が切れる問題を避けるため、通常、@会話スコープを使用しました。私は私の思考について適切なブログ投稿を書く必要がありますが、今のところ私は[前の回答]を参照します(http://stackoverflow.com/questions/10098528/jsf-2-0-viewscoped-redirect-navigation-to -target-blank/10108609#10108609)を使用してください。 – Brian

+0

あなたのポスト@BalusCに感謝します!常にあなたの答えを読むのが楽しいです。オプションに関しては、あなたのブログのリンクが意味する特定のタグにバインドするのではなく、タグを直接Beanにバインドすることもありません。 「レンダリング」属性でEL式を使用すると問題が発生する可能性がありますか?私たちは、ケースに応じてフォームを調整するためにそれを行います。 – Gamb

+0

'@ ViewScoped'は、アクションメソッドが' null'または 'void'を返す単一の送信ボタンを持つ基本的なhelloワールドページでも失敗しますか? – BalusC

関連する問題