6

@RequestScopedバッキングビーンが関連付けられているページがあります。パラメータ「プロジェクト」を渡した他のページからこのページにアクセスします。したがって、正しいページにアクセスすると、 のような URL が表示されますcontextRoot/faces/jsf.xhtml?project=123

意見:

<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 パラメーターは使用できなくなります。パラメータを取得する3つの方法を試しましたが、それらのパラメータf:viewParamを取得できません。ExternalContextServletContext

@RequestScopedに変更したくなく、@SessionsScoped使用できません@ViewScoped。CDI Bean を使用していて、それらを混在させたくないためです。

4

1 に答える 1

10

後続のリクエストのリクエスト パラメータを保持する<f:param>には、コンポーネントにが必要です。UICommand例えば

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

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

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

複数のコマンド ボタン/リンクと ajax アクションがある場合、これはより簡単になる可能性があります。

ajaxリクエストを発行しているため、ブラウザのアドレスバーのURLは変更されていません。ただし、生成された HTML 出力を右クリックして表示できる実際のURL には、デフォルトで現在の GET パラメータが含まれていません。<form action>


具体的な問題とは関係ありませんが、 postconstructでパラメーターを手動で収集すると、基本的に の有用性と機能を無視しています<f:viewParam>。以下の回答を注意深く読んで、それらを適切に利用する方法を学ぶことをお勧めします。

于 2013-04-24T11:34:15.943 に答える