我正在学习如何在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”作为串。
当我删除设置员时,通常称为。
的<f:ajax>唯一电流分量(处理由默认的读取描述execute属性)。基本上,您的代码与此完全相同:
<f:ajax>
execute
<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>(以及任何其他输入字段,如果有)被完全忽略。
<h:commandButton action>
<h:inputText value>
您需要更改execute属性,以明确指定要在ajax请求期间处理的组件或部分。通常,为了处理整个表格,@form使用了:
@form
<h:form> <h:commandButton action="nothing"> <f:ajax execute="@form" render="num"/> </h:commandButton> <h:inputText value="#{helper.randomize}" id="num"/> </h:form>