好的,这是你的核心问题 .
这页纸 . 我有两个必需的“输入文本” . 一个命令按钮,用于更改bean值并重新更新“作业”对象 .
<a4j:form id="pervForm">
SURNAME:<h:inputText id="surname" label="Surname" value="#{prevManager.surname}" required="true" />
JOB:<h:inputText value="#{prevManager.job}" id="job" maxlength="10" size="10" label="#{msg.common_label_job}" required="true" />
<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 Docs我发现:
Ajax区域是关键的ajax组件 . 当ajax请求到来时,它限制了在服务器端处理的组件树的部分 . 处理意味着在解码,验证和模型更新阶段进行调用 . 使用区域的最常见原因是: - 在验证给定ajax请求所不需要的其他表单输入期间,避免中止JSF生命周期处理; - 在事件将被传递时定义不同的策略(立即=“真/假”) - 显示ajax状态的单独指示符 - 增加渲染处理的性能(selfRendered =“true / false”,renderRegionOnly =“true / false“)以下两个示例显示了验证错误不允许处理ajax输入的情况 . 输入名称 . 在您之后,outputText组件应该重新出现 . 但是,在第一种情况下,由于其他字段的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}" />
</ui:composition>
Form1:行为不正确 . 我需要填写工作,然后填写姓名 . Form2:行为是正确的 . 我不需要填写工作来查看正确的值 .
不幸的是,使用Ajax区域并没有帮助(事实上我使用它的方式很糟糕......)因为我的字段都是必需的 . 这是主要的不同 .
任何的想法?
非常感谢 .
3 回答
使用a4j:actionparam将设置该值,但在这种情况下无法帮助您绕过验证 . 验证发生在组件上(而不是bean属性) . 因此,当您提交时,组件值仍为空 . 希望这可以帮助 .
此问题也在JSF 2中确定,并在此相关答案中详细解释:How can I populate a text field using PrimeFaces AJAX after validation errors occur?
总结一下,答案是你需要通过调用方法setValue(null),setSubmittedValue(null),setLocalValueSet(false),setValid(true)来清除EditableValueHolder组件的状态EditableValueHoldert . 注意:在JSF 2中,您将使用方便方法resetValue() .
鉴于您的"job"输入字段具有客户端ID
prevForm:job
,以下是如何在与"Set job to programmer"按钮关联的动作侦听器方法中清除它:当您单击“将作业设置为程序员”时,没有任何反应,因为您没有重新调整消息组件 . 如果这样做,您将能够看到验证消息 .
你需要重新发送消息,因为它是
<a4j:commandButton/>
,而不是简单的<h:commandButton/>
尝试使用道具 .
immediate
在"Set job to Programmer"按钮中,检查是否会更新该字段 .*我不认为这里需要“ajaxSingle”..
也许你可以得到一个新问题..使用
immediate
,bean值不会更新(MAYBE!) . 如果发生这种情况,请创建一个bean方法,手动设置bean值 .否则,如果bean值已更新且字段仍为空,请尝试将"job"字段放入
<a4j:outputPanel/>
并将reRender放入outputPanel .有关更多信息
<a4j:outputPanel/>
here .