1

次を含むテンプレート構成Button.xhtmlがあります<p:commandLink>

<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:p="http://primefaces.org/ui">
    <p:commandLink value="View" action="#{printClass.printPdf}"/>
</ui:composition>

リンクの目的は PDF を生成することです。

が含まれているテンプレート クライアントdefaultPage.xhtmlがありButton.xhtmlます。

<ui:composition template="../../WebPages/MasterPage/Template.xhtml">
    <ui:define name="MainContent">
        <ui:include src="../../WebPages/Facelets/Button.xhtml"/>
    </ui:define>
</ui:composition>

最後の 1 つは、テンプレート定義を a 内Template.xhtmlに挿入するものです。MainContent<h:form>

<html 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">
    <h:body>
        <h:form>
            <ui:insert name="MainContent" />
        </h:form>
    </h:body>
</html>

に配置<h:head></h:head>するTemplate.xhtmlと、<p:commandLink>inButton.xhtmlが機能しなくなりますが、ページの CSS は完全に機能します。それまでに削除<h:head></h:head>または交換すると<head></head><p:commandLink>動作を開始しますが、CSS は動作を停止します。

これはどのように発生し、どうすれば解決できますか?

4

2 に答える 2

4

<h:head>、ajax 動作に必要なすべての JavaScript ファイルとレイアウト用の CSS ファイルを自動的に含めます。削除すると、CSS は自動的に組み込まれず、ajax の動作は有効になりません。は、プレーンなバニラ リンクの<p:commandLink>ように機能します。

これ<h:head>は、JSF および PrimeFaces コンポーネントを適切に機能させ、PrimeFaces ルックアンドフィールを適用するために絶対に必要です。したがって、取り外したり交換したりしないでください。

失敗の問題に集中しましょう<p:commandLink>。考えられる原因は比較的多くありますが、これらはすべてこの回答に記載されています: commandButton/commandLink/ajax アクション/リスナーメソッドが呼び出されていないか、入力値が更新されていません

完全な SSCCEを表示しなかったため、コードをコピーして貼り付けて実行し、問題を自分で確認することはできません (今後の質問でも同様に作業してください)。したがって、症状に基づいて、この問題の最も可能性の高い原因について説明します。つまり、<h:form>コンポーネントを互いに入れ子にしています。をマスターテンプレートに配置するの<h:form>もデザインの匂い。テンプレートクライアントに配置する必要があります。<p:dialog>また、は独自の形式を持つ必要がありますが、<p:dialog>は単独で別の形式にネストしてはならないことに注意してください。


更新:コメントに基づいて、PDF ファイル全体を ajax 要求への応答として返そうとしています。これは実際には機能しません。ajax エンジンは、HTML DOM ツリーの変更に関する情報を含む XML 応答を期待しています。PDF ファイルは有効な情報ではありません。また、JavaScript には明らかにセキュリティ上の理由から、任意のコンテンツが提供される可能性のある [名前を付けて保存]ダイアログをプログラムでトリガーする機能がありません。

ajax でファイルをダウンロードすることはできません。ajaxをオフにする必要があります。<p:commandLink>基本的に2つの解決策がある場合:

  1. を使用しajax="false"ます。

    <p:commandLink ... ajax="false" />
    
  2. <h:commandLink>代わりに使用してください。

    <h:commandLink ... />
    
于 2012-11-21T13:10:07.857 に答える
-1

配置したButton.xhtml

<h:commandLink value="View" action="#{printClass.printPdf}"/> 


ajax を無効にする必要があります。したがって、新しいコードは次のようになります。

<h:commandLink value="View" action="#{printClass.printPdf}">
<f:ajax disabled="true"></f:ajax>
</h:commandLink> 


于 2012-11-21T10:28:50.897 に答える