好的,在这里你是核心问题。JSF:如何在ajax请求中刷新必填字段
页面。我有两个必需的“输入文本”。 一个命令按钮,用于更改bean值并重新调用“作业”对象。
<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请求的 验证期间-avoiding JSF生命周期处理的终止执行; - 定义事件发送的不同策略 (immediate =“true/false”) - 显示ajax状态的单独指示器 - 提高呈现处理的性能 (selfRendered =“true/false”, renderRegionOnly =“真/假”)
下面的两个例子示出了 情况时验证错误并 不允许处理一个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>
Form1中:该行为是不正确。我需要填写这份工作,然后填写姓名。 Form2:行为是正确的。我不需要填写这份工作来查看正确的价值。
不幸的是,使用Ajax区域并没有帮助(事实上我用它糟糕的方式...),因为我的字段都是必需的。这是主要的不同。
有什么想法?
非常感谢。
我不是在无效组件上工作。我只需要改变一个有效的组件的值...我改变了bean的值,我不能强制更新(immediate,reRender,ajaxRegion等等)。我发现的唯一方法是使用process属性。在这种情况下,组件被正确更新,但是如果并且仅当它具有初始值(我的意思是:组件具有非空值)。因此,无法强制... – Tama 2011-01-12 09:18:44
将ajaxSingle =“true”放在按钮上,然后重新渲染输入组件。 – 2011-01-13 00:24:55