javascript弹出窗口没有获得托管值

时间:2011-01-07 22:18:43

标签: java jsf jsf-2 primefaces

我不明白当我在下面的表单中按save时,我保存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()%>

时机可能有问题吗?

顺便说一下,游戏什么都不做。这是一个空虚的方法。

1 个答案:

答案 0 :(得分:1)

问题是第二个命令按钮的immediate属性设置为true。这将导致在应用请求值阶段调用操作方法,然后立即跳过以呈现响应。

实际上,不会更新任何模型值,因此您可以在模型中保留以前的值。可能会令人困惑,但该组件将保留您刚刚输入的值。我只是没有转移到模型。有关此内容的更多信息,请查看直接属性在JSF中的含义,尤其是应用于命令按钮时的操作。

(我还想说明,使用会话范围将值传递给弹出窗口会遇到麻烦。当用户在多个选项卡中打开页面时,这为各种竞争条件打开了大门。如果可能的话,最好使用Java EE 6的会话范围。)