7

現在、JSF 1.2 から JSF 2.0 に移行しようとしていますが、直面した問題の 1 つは、フォームを含むページの一部を再レンダリングできないことです。このように(再レンダリングouterDivまたはフォーム自体):

<h:panelGroup id="outerDiv">
    <h:form id="form1">...</h:form>
    <h:form id="form2">...</h:form>
</h:panelGroup>

つまり、outerDivすべてを更新してもフォーム (またはフォーム) 自体が壊れて奇妙な動作をする場合、少なくとも ajax 呼び出しが最初にトリガーされたときに機能しないか、Bean のメソッドを呼び出す代わりに、その Bean の新しいインスタンスを作成します。何もしません(すべての呼び出しで以前のものを破棄するか、最初の呼び出しで新しいものを作成してから何もしません)。この問題は、次のようにフォーム内のコンポーネントのみを再レンダリングすることで解決できます (updateinnerDiv1およびinnerDiv2):

<h:panelGroup id="outerDiv">
   <h:form id="form1">
       <h:panelGroup id="innerDiv1">...</h:panelGroup>
   </h:form>
   <h:form id="form2">
       <h:panelGroup id="innerDiv2">...</h:panelGroup>
   </h:form>
</h:panelGroup>

しかし、いくつかのページを含む場所がたくさんあり、ui:includeそのページの中を見て特定のコンポーネントを更新するのはあまり便利ではありません。さらに、これらのページの多くはフォーム内に共通のラッパー div を持たず、各コンポーネントを個別に更新することは非常に面倒でエラーが発生しやすいため、これらすべてのページを変更する必要があります。
では、JSF 1.2 のように、JSF 2.0 でページの一部を 1 番目のアプローチで正しく更新することは可能ですか?


編集:フォームレンダリングの問題は、私が使用するリッチフェイス4.2の問題a4j:ajax(その後継者はa4j:supportリッチフェイス3.3.3で使用されたもの)とに基づくカスタムボタンのようですrich:commandButton。それらをネイティブjsfのf:ajaxフォームに置き換えると、正しく更新されるようです。しかし、外側のdivの問題はまだ実際にあります

4

1 に答える 1

6

これは、部分的な状態の保存に関連しています。子の 1 つとしてフォームを含むコンポーネントを ajax 更新すると、ビュー ステートが失われます。ビューステートがないため、そのフォーム内の最初の ajax リクエストはすべて失敗します。しかし、その ajax リクエストがフォーム自体を再レンダリングしている場合、それは機能します。

これを修正するには、別のフォームから呼び出されるたびに、横にある ajax /属性に他のフォームの ID を明示的に含める必要があります。renderupdateouterDiv

例えば

<h:form>
    <h:commandButton value="Update other forms">
        <f:ajax render="outerDiv form1 form2" />
    </h:commandButton>
</h:form>
<h:panelGroup id="outerDiv">
    <h:form id="form1">...</h:form>
    <h:form id="form2">...</h:form>
</h:panelGroup>

いいえ、重複したコンポーネントを含む ajax レスポンスにはなりません。JSF をトリガーして、他のフォームの状態を準備および保存するだけです。

以下も参照してください。

于 2012-04-05T17:29:25.707 に答える