4

私は、次のような URL で以下のように設定されたページを持っていますmy.page.com/table.xhtml?id=123

+----------------------------------------------+
|Meta information                              |
|----------------------------------------------|
|           Search Fields           Submit btn |
|----------------------------------------------|
|                                              |
|                                              |
|            Big p:dataTable                   |
|                with rowExpansion             |
|                                              |
|----------------------------------------------|
|                   Pager                      |
+----------------------------------------------+

id=123結果テーブルの内容を制御するリクエスト パラメータです。すべてのアクションは、 を使用してデータ テーブルをリロードするだけAJAXです。

idこれを通してロードされます:

<f:metadata>
    <o:viewParam name="id" value="#{dataTable.id}" />
    <f:viewAction action="#{dataTable.initialize}" />
</f:metadata>

セッションが期限切れになるまで、これはすべて正常に機能します。この時点では、何も機能しません。問題のデータにアクセスできなくなり、データを取得idするクラスの呼び出しにDAOこれがないため、データを取得できません。

アクセスできなくなったid」とは、次のことを意味します。

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id")

戻りますnull。また、int idバッキング Bean から ( を介してロードされる)o:viewParamf:metadata同じ運命をたどります。

をキャッチする方法があることは知っていますがViewExpiredException、これは私が望むものではありません。idユーザーが知らないうちに、リクエストパラメーター (この場合は ) を使用してすべての値を単純にリロードするページが必要です。

@ViewScopedこの複雑なテーブルとすべてのパラメーターなどを制御するには、管理 Bean が必要だと思います。

私はこれに関して途方に暮れています。私は自分自身ViewHandlerを構築して、ページを単純に再構築 (更新を模倣) しようとし、PrimeFaces ajaxExceptionHandler他のソリューションの中でも を使用しようとしました。しかし、これらはすべてエラーになり、表示されます。my.page.com/table.xhtml?id=123バッキング Bean からリクエスト パラメータにアクセスしたいだけです。

どんな助けでも大歓迎です。

私は実行しています:

  • トムキャット7
  • モハラ 2.2.6
  • オムニフェイス 1.8.1
  • プライムフェイス 5.0
4

2 に答える 2

4

期限切れのビューを完全に再作成することでバイパスする<o:enableRestorableView>には、メタデータに次を追加します。

<f:metadata>
    ...
    <o:enableRestorableView />
</f:metadata>

リクエスト パラメータを保持する場合は、フォームにプレーンな HTML 非表示入力フィールドを追加します。

<h:form>
    ...
    <input type="hidden" name="id" value="#{dataTable.id}" />
</h:form>

または、すべてのビュー パラメータを含む JSF ビュー ID に送信するか、リクエスト クエリ文字列全体を含む JSF ビュー ID に送信するか、またはリクエスト URI 全体 (クエリ文字列を含む) に送信するかに応じて、 、または<o:form>と共に使用します。includeViewParams="true"includeRequestParams="true"useRequestURI="true"

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

JSF ライフサイクルのすべてのフェーズを通過する前に、ポストバックで Bean の状態を再初期化する場合は<o:viewParam>、手動で取得して by<f:viewAction>を置き換える必要があり@PostConstructます。

@PostConstruct
public void initialize() {
    id = Faces.getRequestParameter("id");
    // ...
}
于 2014-06-24T21:24:37.347 に答える