时间:2011-03-29 17:30:05

标签: ajax jsf jsf-2

我有一个带有inputText和2 commandButtons的简单表单。 inputText显示支持bean的值很好,但是当我第一次更改值时,不调用set方法,因此表单提交为空值。当我再次更改它时,调用set方法,一切正常。原因是什么?如何解决?

  <h:panelGroup id="chatId">
    <h:panelGrid rendered="#{chat.validUser == true}">
      <h:form id="sendMsgForm" >
        <h:panelGroup id="chatId2">
          <h:inputText id="chatInput" value="#{chat.msgTo}" autocomplete="off" >
            <f:ajax execute="@this @form" />
          </h:inputText>
          <h:commandButton value="Send" id="sendButton" action="#{chat.send}">
            <f:ajax render=":chatLogId :chatId" />
          </h:commandButton>    
          <h:commandButton value="Bye" action="#{chat.bye}">
            <f:ajax render=":chatLogId :chatId :chatUserId" />
          </h:commandButton>
        </h:panelGroup>
      </h:form>
    </h:panelGrid>
  </h:panelGroup>

支持bean代码:

@SessionScoped
public class Chat implements Serializable, ActionListener, ValueChangeListener {
  private String msgTo = "Start typing...";
  private boolean validUser = false;

  public void bye() {
    validUser = false;
    tc.disconnect();
  }

  public void send() {
    try {
      tc.sendMessage(msgTo);
      setMsgTo("");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // ...

3 个答案:

答案 0 :(得分:3)

Matt Handy的代码片段是正确的解决方案,但原因的解释是错误的。

您在命令按钮中省略了execute的{​​{1}}属性。然后它将默认为<f:ajax>,这意味着只有按钮本身的name = value对被发送到服务器端(因此将调用相关的操作;输入值不会更新)。由于您要提交整个表单,因此需要将@this明确设置为execute

@form

在更改输入字段期间它的工作原理是因为您已将<h:commandButton value="Send" id="sendButton" action="#{chat.send}"> <f:ajax execute="@form" render=":chatLogId :chatId" /> </h:commandButton> 放在输入字段中。更改值时,默认情况下会执行execute="@form"内部输入字段。但在这种特殊情况下,你完全不需要它。所以摆脱它:

<f:ajax>

答案 1 :(得分:0)

也许是因为你同时使用并发行为触发了两个ajax调用。如果单击sendButton,将重新呈现chatId panelGroup(通过提交按钮的ajax调用)并执行表单(通过输入字段的ajax调用)。

请尝试以下方式进行提交按钮的ajax调用:

<h:commandButton value="Send" id="sendButton" action="#{chat.send}">
  <f:ajax render=":chatLogId :chatId" execute="@form"/>
</h:commandButton> 

答案 2 :(得分:0)

想要跟进我的问题的答案是将我拥有的3个表单标签合并为两个表单。我有一个用于chatLogId的表单,1表示chatId,1表示chatUserId。 chatLogId只是一个dataTable,我就离开了。我将chatId和chatUserId表单合并为一个。当我离开inputText字段时,调用setMsgTo然后调用send方法。不确定,但我认为我的问题可能是之前更新了错误的表单。 感谢你的帮助。平