0

以下のフォームで保存を押すとinputTextAreaの現在の内容が保存されるのですが、inputTextAreaの内容のプレビューを見たいときは、最後に保存されたメールテンプレートの内容が表示されます。もちろん、(変換後の) textArea の現在の値が表示されます。customMailTemplate の更新された値が表示されないのはなぜですか?

<h:form id="gameMailForm" prependId="false" rendered="#{customizeGameMailBean.renderGameMailPanel}">
      <h:panelGrid columns="3">
      <h:inputTextarea
              styleClass="gameMailTextArea, textArea"
              id="gameMailTextArea"
              value="#{customizeGameMailBean.customMailTemplate}"
              converter="gameMailTemplateConverter"
              style="height: 120px; width: 300px; font-size: 11px;">
              <f:validator validatorId="gameMailValidator"/>
       </h:inputTextarea>
 <p:commandButton value="Save"
                  action="#{customizeGameMailBean.saveMailTemplate}"
                  ajax="false"/>
 <p:commandButton value="Preview"
                  ajax="true"
                  action="#{customizeGameMailBean.doNothing}"
                  oncomplete="javascript: window.open('gameMailPreview.jsp','Game Email','width=300,height=300')"
                  immediate="true"/>
</h:panelGrid>
</h:form>

gameMailPreview.jsp:

<%@page import="wmc.web.controller.CustomizeGameMailBean"%>
<%@page import="javax.faces.context.FacesContext"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% CustomizeGameMailBean gameMailBean = (CustomizeGameMailBean) request.getSession().getAttribute("customizeGameMailBean");%>
<%=gameMailBean.getCustomMailPreview()%>

タイミングがおかしいのではないでしょうか?

ちなみにゲーム doNothing は本当に何もしていません。空の void メソッドです。

4

1 に答える 1

1

問題は、2 番目のコマンド ボタンの immediate 属性が true に設定されていることです。これにより、リクエスト値の適用フェーズでアクション メソッドが呼び出され、その後すぐにスキップしてレスポンスをレンダリングします。

実際には、モデル値は更新されないため、モデルには以前の値が保持されます。紛らわしいかもしれませんが、コンポーネントは入力した値を保持します。私はモデルに転送しませんでした。この詳細については、JSF での immediate 属性の意味と、特にコマンド ボタンに適用された場合の動作を調べてください。

(また、セッション スコープを使用して値をポップアップに伝達すると問題が発生することにも注意してください。これにより、ユーザーがページを複数のタブまたはウィンドウで開いている場合に、あらゆる種類の競合状態への扉が開かれます。可能であれば、 Java EE 6 の会話スコープを使用した方がよい場合があります。)

于 2011-01-08T12:20:42.690 に答える