JSF/Primefaces发送两个更新输入表单的请求,并将PDF发送回浏览器



给定以下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);
     }
}

其成果是:

  1. 输入no txt->显示关于所需值的错误消息
  2. 在txt中输入值->错误消息将被删除,PDF将被发送回浏览器

发生了什么:

  1. 输入no txt->显示关于所需值的错误消息
  2. 在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。

相关内容

  • 没有找到相关文章

最新更新