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.xhtmlButton.xhtml

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

最后一个是Template.xhtmlMainContent模板定义插入到<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

它将自动包含所有必需的 ajax 行为的<h:head>JavaScript 文件和布局的 CSS 文件。当您删除它时,CSS 将不会被自动包含并且 ajax 行为将不会被启用。然后<p:commandLink>它将充当普通的香草链接。

<h:head>对于 JSF 和 PrimeFaces 组件的正常运行以及 PrimeFaces 外观的应用是绝对必要的。所以你不应该删除或更换它。

让我们专注于失败的问题<p:commandLink>。可能的原因比较多,这个答案都提到了:commandButton/commandLink/ajax action/listener method not invoked or input value not updated

您没有展示完整的SSCCE,因此无法复制'n'paste'n'run 您的代码来自己查看问题(在您未来的问题中也可以解决这个问题)。因此,我将根据症状仅提及导致此问题的最可能原因:您将<h:form>组件相互嵌套。将<h:form>放在主模板中也是一种设计气味。您应该将其放在模板客户端中。另请注意,<p:dialog>应该有自己的形式,但<p:dialog>应该本身嵌套在另一种形式中。


更新:根据评论,您尝试返回整个 PDF 文件作为对 ajax 请求的响应。这确实行不通。ajax 引擎需要一个 XML 响应,其中包含有关 HTML DOM 树中更改的信息。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 回答