2011-10-21 13 views
8

私はJSFで開発されたプロジェクトに取り組んでいます。 JSFページをリフレッシュするたびに、最後のアクション・イベントが再実行されます。たとえば、フォームを送信してリストのエントリを削除し、結果ページをリフレッシュすると、同じ位置のリストから別のエントリも削除されます。これはどのようにして起こり、どのように解決できますか?私が直面しています問題についてより明確に取得するには、ページの更新時に最後のフォーム送信アクションの再実行を回避するにはどうすればよいですか?

を私は顔-config.xmlに試してみましたが、それは私の問題を解決していません

は、私がデータテーブルから一つのリソースを削除するにはcommandLinkだということです私はActionListenerを使用しています私のbackingbeanの1つのメソッドを呼び出す属性です。問題は、ページアクションイベントが発生したときにこれをリフレッシュして、テーブルから別のリソースを削除するメソッドが実行されたときです。前もってありがとうございます

答えて

18

このような症状は、ページがPOSTリクエストによってリクエストされたこと、およびリクエストをリフレッシュするときにデータが再送信されるというウェブブラウザの警告を無視していることを示しています。もちろんPOST要求を更新すると、再実行されます。これはJSF固有の問題ではありません。

これに対する一般的な解決策は、POST要求を実行した後にGET要求にリダイレクトすることです。このようにして、クライアントはブラウザビューでGET要求を持つことになります。これをリフレッシュすると、何かを変更しない(変更しない)GETリクエストが再実行されます(ビューに関連付けられたリクエストスコープ付きBeanのコンストラクタでこれを行っている場合を除く)。これは、POST-Redirect-GETパターンとも呼ばれます。

JSF 2.0では、beanアクションの結果に単にfaces-redirect=trueパラメータを追加することでこれを達成できます。

public String submit() { 
    // ... 

    return "viewid?faces-redirect=true"; 
} 

あなたはまだfaces-config.xmlで昔ながらの<navigation-case> Sを使用している場合は、その後、同様の効果がケースに<redirect/>を添加することによって達成することができます。

唯一の欠点は、リクエストスコープBeanがこのようにガーベージされていることです(リダイレクトは基本的に新しいリクエストを作成するようにWebブラウザに指示します)。したがって、リダイレクトされたページにリクエストを表示するにはリクエストスコープでデータを渡すことができません。たとえば、成功メッセージを表示します。 JSF 2.0では代わりにこれにFlashスコープを使用するか、通常のsubmitの代わりに<f:ajax> submitによってPOSTを実行させることができます。

+0

私はこのような答えを見るたびに、私が読んではいけなかった「マニュアル」の大きなセクションがあるように感じます。 @BalusC ** action **メソッドの戻り値に適用されるすべてのルールへのリンクがありますか?これは、** faces-redirect **パラメータについて私が聞いた最初のものです。他にどのようなパラメータがありますか?私はそれについて知りませんでした有用であっただろうと思う。 – AlanObject

+4

@Alan:この特定の1つ(PRGパターン)は、一般的なWeb開発の知識であり、HTTPとWebブラウザーの仕組みを理解しています。サポートされている特別なアクションパラメータに関しては、もう1つは 'includeViewParams = true'です。これには、結果ターゲットの要求パラメータとして現在のビューのすべての宣言された ' 'が含まれます。私はブログ/ドキュメンテーション/リソースを読んでそれを学びました。 Java EE 6チュートリアルでも触れられています。また、[JSF 2.0:The Complete Reference](http://jsfcompref.com/)や[Core JSF](http://horstmann.com/corejsf/)のようなちょっとしたJSF 2.0の本でも述べる必要があります。 – BalusC

+0

@BalusC私は同じ問題を抱えています、私は行のCRUDを行うことができるデータテーブルを持っています。ページを更新すると、最後のアクションが再び再送信されます。どうすれば解決できますか?送信ボタンはありませんか? – giorgimode