我正在学习如何在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。
答案 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>