将<f:ajax>添加到<h:commandbutton> </h:commandbutton> </f:ajax>时,在模型中未更新的提交的表单值

时间:2013-07-31 03:10:34

标签: ajax jsf jsf-2 form-submit

我正在学习如何在jsf中使用ajax,我创建了一个实际上什么都没有的页面,一个填充了数字的输入文本,提交给服务器,使用提交的值调用该元素的setter,以及显示getter的值。

这是简单bean的代码:

@ManagedBean(name="helper",eager=true)
public class HealthPlanHelper {


    String random = "1";

    public void setRandomize(String s){
        random = s;
                System.out.println("Calling setter");
    }

    public String getRandomize(){
        return random;
    }

}

和jsf页面:

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core">
<h:head></h:head>
<h:body>

    <h:form>
        <h:commandButton action="nothing">
            <f:ajax render="num"/>
        </h:commandButton>

        <h:inputText value="#{helper.randomize}" id="num"/>
    </h:form>

</h:body>
</html>

如您所见,这是一个请求范围的bean,每当我单击按钮时服务器显示它创建了一个bean的实例,但是从不调用setter方法,因此,getter总是返回“1”字符串的值。

当我删除时,正常调用setter。

1 个答案:

答案 0 :(得分:6)

<f:ajax>进程默认只有当前组件(read description of execute attribute)。基本上,您的代码与此完全相同:

<h:form>
    <h:commandButton action="nothing">
        <f:ajax execute="@this" render="num"/>
    </h:commandButton>
    <h:inputText value="#{helper.randomize}" id="num"/>
</h:form>

在效果中,只处理了<h:commandButton action>,并且完全忽略了<h:inputText value>(以及任何其他输入字段,如果有的话)。

您需要更改execute属性,以明确指定您在ajax请求期间要处理的组件或部分。通常,为了处理整个表单,使用了@form

<h:form>
    <h:commandButton action="nothing">
        <f:ajax execute="@form" render="num"/>
    </h:commandButton>
    <h:inputText value="#{helper.randomize}" id="num"/>
</h:form>

另见: