2013-04-24 4 views
5

私は単に@RequestScoped backing beanに関連付けられているページを持っています。私はこのページを他のページから取得します。このページでは、「プロジェクト」というパラメータを渡しました。だから、私が右ページに行くとき、私はcontextRoot/faces/jsf.xhtml?project=123のようなURLを持っています。ポストバック全体で元のGETリクエストパラメータを保持

ビュー:

<f:metadata> 
    <f:viewParam name="project" value="#{entityBean.projectId}" /> 
</f:metadata>  
... 
<p:commandButton value="#{msg['button.add']}" 
    actionListener="#{entityBean.addNewEntity((entityName),(entityDescritpion))}" 
    ajax="true" update=":projectDetailForm"/> 

バッキングBean:ページが初めて開かれたとき

@Named("entityBean") 
@RequestScoped 
public class EntityBean implements Serializable{ 
    private String projectId; 

    @PostConstruct 
    public void init() { 
     params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); 

     for (Map.Entry<String, String> entry : params.entrySet()) { 
      System.out.println(entry.getKey() + "/" + entry.getValue()); 
     } 

     if (params.get("project") != null) { 
      projectId = params.get("project"); 
     } else { 
      HttpServletRequest request = 
       (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
      String projectId = request.getParameter("project"); 
     } 
    } 

    //projectId getter and setter 
    //public void addNewEntity(String name, String desc) {} 
} 

すべてが正常に動作します。 GETパラメーターは正常に処理されます。しかし、Beanの要求スコープは、リクエストの終わりまでに破棄され、後続のポストバックで再作成されます。これらのポストバック中、GETパラメータはブラウザのアドレスバーに表示されていても使用できなくなります。私はパラメータ をf:viewParamExternalContextそしてさらにServletContextから得る3つの方法を試みましたが、私はそれらのパラメータを得ることができません。

私は@SessionsScopedから@RequestScopedを変更したくないと私はCDI豆を使用していbeacuse私は、@ViewScopedを使用することはできませんし、私はそれらをミックスする必要はありません。

+0

ビーンのスコープの変更「要求」に「表示」から。 – KSHiTiJ

+1

@kshitij:残念ながら、OPはJSFの代わりにCDIを使用してBeanを管理しています。したがって、JSF固有のビュー・スコープは機能しません。 OPはまた、質問の最後の文でそれを明示した。 – BalusC

答えて

9

UICommandコンポーネントには、次の要求の要求パラメータを保持するために、<f:param>が必要です。例えば。

<p:commandButton ...> 
    <f:param name="project" value="#{param.project}" /> 
</p:commandButton> 

また、あなたはそれが基本的にあなたが後続の要求のために<f:viewParam>を経て登録されたリクエストパラメータを保持することができます追加の属性includeViewParams<h:form>を拡張し、JSFユーティリティライブラリOmniFaces<o:form>を使用することができます。

<o:form includeViewParams="true"> 
    ... 
</o:form> 

複数のコマンドボタン/リンクとajaxアクションがあると、これは簡単に終わることがあります。

ajaxリクエストを送信しているため、ブラウザのアドレスバーのURLは変更されません。しかしの実際の URLは、生成されたHTML出力の<form action>にrightclick - のように表示されます。ブラウザーのソースは、デフォルトで現在のGETパラメーターを含んでいません。具体的な問題へ


無関係、手動postconstructでパラメータを収集し、あなたは基本的に<f:viewParam>の有用性と力を無視しています。私は慎重にそれらを適切に活用する方法については、以下の回答を通過することをお勧めします:

+0

この問題を解決するために、Apache MyFaces CODIを使用しました。 ViewAccessScopedのようなCDIスコープのための非常に便利な拡張機能を提供します。 JSF 2.0とPrimefaceでうまくいく – AdrianX

+0

@AdrianX:できます。 URLには醜い 'windowId'パラメータしか残っていません。また、JSFの '@ ViewScoped'もCDIと透過的に橋渡しするので、' @Named @ ViewScoped'を使うことができます。 – BalusC

関連する問題