0

一部の入力フィールドに応じて、応答ページを表示する必要があります。たとえば、以下の tabid inputHidden :

#{controllerBean.tabId}
...
<h:form id="edit">
  <h:inputHidden value="#{controllerBean.tabId}" id="tabid" />
  <h:inputText value="#{controllerBean.name}" id="name" />
</h:form>

しかし、同じフォームの他の入力に検証エラーがある場合 (例: 「名前」inputText)。JSF が検証段階で戻るため、「controllerBean.tabId」値は割り当てられません。

ページを正しく表示するにはまだ tabId が必要で、2 つのアイデアを念頭に置いています。

#{param['edit:tabid']}

またはバインディングを使用します。

#{tabId.value}
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" binding="tabId" />

私の質問は、これら 2 つのどちらが優れているか、またはベスト プラクティスであるかということです。または、これを行うためのさらに良い方法はありますか?


アップデート:

ノート。私の特定のケースでは、tabid はクライアントの JavaScript によって設定されます。

  1. サーバーは、html にいくつかの項目を返信します。
  2. Javascript は、これらの項目をページの別のタブに配置します。
  3. タブの 1 つが、フォーム内の現在のタブ ID を使用してサーバーにデータを POST します。

したがって、サーバーは、正しいタブが選択された応答ページを表示するためのタブ ID を知る必要があります。

4

3 に答える 3

1

ライフサイクル イベント リスナーをコンポーネントに追加し、そこから値を取得できます。私はpreValidateリスナーをお勧めします:

 <h:form id="edit">
     <h:inputHidden value="#{controllerBean.tabId}" id="tabid">
         <f:event type="preValidate" listener="#{controller.grabTabId}"/>
     </h:inputHidden>
     <h:inputText value="#{controllerBean.name}" id="name" />
 </h:form>

これにより、リクエストの検証フェーズの直前に起動するリスナーが登録されます。バッキング Bean で次のように定義されたリスナーが作成されます。

   public void grabTabId(ComponentSystemEvent cse){
     //obtain a reference to the component
     HtmlInputHidden hiddenElement = (HtmlInputHidden)cse.getComponent(); 
     //get the value from the component.
     String hiddenValue = hiddenElement.getValue();
   }
于 2013-11-04T19:21:05.533 に答える