好的,这里是核心问题。
这个页面有两个必填的“输入文本”。
一个命令按钮可以更改bean值并重新渲染“job”对象。
<a4j:form id="pervForm">
SURNAME:<h:inputText id="surname" label="Surname" value="#{prevManager.surname}" required="true" />
<br/>
JOB:<h:inputText value="#{prevManager.job}" id="job" maxlength="10" size="10" label="#{msg.common_label_job}" required="true" />
<br/>
<a4j:commandButton value="Set job to Programmer" ajaxSingle="true" reRender="job">
<a4j:actionparam name="jVal" value="Programmer" assignTo="#{prevManager.job}"/>
</a4j:commandButton>
<h:commandButton id="save" value="save" action="save" class="HATSBUTTON"/>
</a4j:form>
这里是简单的管理器:
public class PrevManager
{
private String surname;
private String job;
public String getSurname()
{
return surname;
}
public void setSurname(String surname)
{
this.surname = surname;
}
public String getJob()
{
return job;
}
public void setJob(String job)
{
this.job = job;
}
public String save()
{
//do something
}
}
让我们开始吧:
在“工作输入文本”中写入一些内容(例如“教师”)。 将姓留空。 保存。 出现验证错误(姓氏为必填项)。 按下“将职位设置为程序员”:没有任何反应。
检查bean值后,我发现它已经正确更新了,但页面上的组件没有更新!
根据我找到的JBoss文档,Ajax区域是一个关键的Ajax组件。当Ajax请求到来时,它限制要在服务器端处理的组件树部分。处理意味着在解码、验证和模型更新阶段进行调用。使用区域的最常见原因包括:
-避免在验证其他表单输入时中止JSF生命周期处理; -定义不同的事件传递策略(immediate="true/false"); -显示ajax状态的单独指示器; -提高渲染处理的性能(selfRendered="true/false",renderRegionOnly="true/false")
以下两个示例展示了验证错误不允许处理ajax输入的情况。键入名称。在第一个案例中,由于其他字段具有required="true"属性,此活动将被中止。您只会看到错误消息,而“工作”字段为空。
这是一个示例:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<style>
.outergridvalidationcolumn {
padding: 0px 30px 10px 0px;
}
</style>
<a4j:outputPanel ajaxRendered="true">
<h:messages style="color:red" />
</a4j:outputPanel>
<h:panelGrid columns="2" columnClasses="outergridvalidationcolumn">
<h:form id="form1">
<h:panelGrid columns="2">
<h:outputText value="Name" />
<h:inputText value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="outname" />
</h:inputText>
<h:outputText value="Job" />
<h:inputText required="true" id="job2" value="#{userBean.job}" />
</h:panelGrid>
</h:form>
<h:form id="form2">
<h:panelGrid columns="2">
<h:outputText value="Name" />
<a4j:region>
<h:inputText value="#{userBean.name}">
<a4j:support event="onkeyup" reRender="outname" />
</h:inputText>
</a4j:region>
<h:outputText value="Job" />
<h:inputText required="true" id="job1" value="#{userBean.job}" />
</h:panelGrid>
</h:form>
</h:panelGrid>
<h:outputText id="outname" style="font-weight:bold" value="Typed Name: #{userBean.name}" />
<br />
</ui:composition>
表单1:行为不正确。我需要先填写工作,然后填写姓名。
表单2:行为正确。我不需要填写工作就能看到正确的值。
不幸的是,使用Ajax区域没有帮助(事实上我使用得很糟糕...),因为我的字段都是必填的。这是主要的不同之处。
有什么想法吗?
非常感谢。