2013-08-03 10 views
0

以下JSF页面JSF/Primefaces发送两个请求,以更新的输入表单和发送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"/> 
</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. 进入没有txt - >有关所需值的错误消息显示
  2. Ent在TXT ER值 - >错误信息将被删除,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提前,马库斯

回答

0

在JSF的验证阶段所需的属性进行评价时,在服务器上处理。所以输入组件需要重新验证以消除消息。

我并不确定在Primefaces上,但看着文档,看起来“更新”基本上等同于f:ajax的“render”属性。

如果我正确理解使用“process”属性将提交指定的组件处理到服务器和“更新”将强制重新渲染。

因此,AJAX标签更改为: <p:ajax event="click" process="txt" update="txt"/>

此外,更改事件keyUp事件将给予及时的反馈和清除消息马上而不是等待点击。

编辑: 再一次澄清,ajax调用需要移动到输入标记并远离commandButton。

+0

感谢,实际上这是一种更好的解决方法,因为最初我不想立即进行验证(确实希望在打印前点击确认)。但实际上我会用这个解决方法。谢谢。 – markush81

相关问题