0

次の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. txt を入力しない -> 必要な値に関するエラー メッセージが表示される
  2. txt に値を入力 -> エラー メッセージが削除され、PDF がブラウザに送り返されます

何が起こるのですか:

  1. txt を入力しない -> 必要な値に関するエラー メッセージが表示される
  2. txt に値を入力 -> エラー メッセージ IS NOT REMOVED が表示され、PDF がブラウザに送り返されます

サーバーに送信されたリクエストは 1 つだけなので、その理由は明らかです。

だから私は試しました:

<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>

ただし、サーバーに送信されるリクエストは 1 つだけです。

補足: PDF の表示はページ内で正常に機能しますが、フォームを PDF に挿入すると表示されなくなりました。しかし、まず、2 つのリクエストを送信するソリューションに興味があります。

前もって、マーカス

4

1 に答える 1

0

必須属性は、jsf の検証段階で評価され、サーバーで処理されます。そのため、メッセージを取り除くために、入力コンポーネントを再検証する必要があります。

Primefacesについてはよくわかりませんが、ドキュメントを見ると、「更新」は本質的にf:ajaxの「レンダリング」属性と同等のようです。

「プロセス」属性を正しく使用すると、処理のために指定されたコンポーネントがサーバーに送信され、「更新」により再レンダリングが強制されることを理解していれば。

したがって、ajax タグを次のように変更します。 <p:ajax event="click" process="txt" update="txt"/>

また、イベントをキーアップ イベントに変更すると、クリックを待たずにすぐにフィードバックが返され、メッセージがすぐにクリアされます。

編集:もう1つ明確にするために、ajax呼び出しをinputタグに移動し、commandButtonから離す必要があります。

于 2013-08-03T15:37:38.273 に答える