给定以下jsf页面
<h:form id="#{cc.clientId}>
<p:inputText id="txt" value="#{controller.property}" required="true"/>
<p:message for="txt"/>
<p:commandButton actionListener="#{controller.print()}" update="@form" value="Print"/>
</h:form>
控制器
@Named
public Controller {
private String property;
public void setProperty() ...
public String getProperty() ...
public void print() {
org.omnifaces.util.Faces.sendFile("".getBytes(), "file.pdf", true);
}
}
其成果是:
- 输入no txt->显示关于所需值的错误消息
- 在txt中输入值->错误消息将被删除,PDF将被发送回浏览器
发生了什么:
- 输入no txt->显示关于所需值的错误消息
- 在txt中输入值->错误消息"未删除",并将PDF发送回浏览器
原因我很清楚,因为只向服务器发送了一个请求。
所以我尝试了:
<h:form id="#{cc.clientId}>
<p:inputText id="txt" value="#{controller.property}" required="true"/>
<p:message for="txt"/>
<p:commandButton actionListener="#{controller.print()}" update="@form" value="Print">
<p:ajax event="click" update="@form"/>
</p:commandButton>
</h:form>
但仍然只有一个请求被发送到服务器。
附带说明:在页面中显示PDF很好,但将表单放入不显示的PDF中。但首先,我对发送两个请求的解决方案感兴趣。
Thx提前,markus
所需属性在jsf的验证阶段进行评估,并在服务器上进行处理。因此,需要重新验证输入组件,以消除消息。
我真的不确定Primefaces,但从文档中可以看出,"update"本质上等同于f:ajax的"render"属性。
如果我正确理解,使用"process"属性将向服务器提交指定的组件进行处理,"update"将强制重新渲染。
因此,将ajax标记更改为:<p:ajax event="click" process="txt" update="txt"/>
此外,将事件更改为keyup事件将立即提供反馈并立即清除消息,而不是等待单击。
编辑:还有一点需要说明的是,ajax调用需要移到input标记,并远离commandButton。