【问题标题】:Unable to understand <h:head> behaviour无法理解 <h:head> 行为
【发布时间】:2012-11-07 07:13:38
【问题描述】:

我有一个模板组合Button.xhtml,其中包含一个&lt;p:commandLink&gt;

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

最后一个是Template.xhtml,它将MainContent模板定义插入到&lt;h:form&gt;中。

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

当我将&lt;h:head&gt;&lt;/h:head&gt; 放入Template.xhtml 时,&lt;p:commandLink&gt; 中的&lt;p:commandLink&gt; 停止工作,但页面的 CSS 工作正常。当我删除 &lt;h:head&gt;&lt;/h:head&gt; 或将其替换为 &lt;head&gt;&lt;/head&gt; 时,&lt;p:commandLink&gt; 开始工作,但 CSS 停止工作。

这是怎么引起的,我该如何解决?

【问题讨论】:

  • 您在使用 ICEfaces 吗?或者您是否在没有实际测试的情况下粗心地过度简化了代码 sn-ps(即您最初使用例如 PrimeFaces &lt;p:commandLink&gt; 但由于某些不清楚的原因您将其过度概括为 &lt;h:commandLink&gt;)?否则,阿米尔的回答毫无意义。在&lt;h:commandLink&gt;默认没有 ajax bahvaiour。
  • 是的,我使用了 这就是它开始起作用的原因。我错误地忘记提及了
  • -1 因为在提出问题时粗心,导致问题根本没有显示 任何 问题。一旦你解决了这个问题,我就会删除反对票。 aamir 的回答可能暗示了解决方案,但考虑到您实际上使用的是 PrimeFaces,这在技术上也是错误的。在以后的问题中,将代码 sn-ps 自己测试到一个空白的游乐场环境中;最简单的做法是您自己就是回答者,并尝试根据问题中提供的信息重现问题。

标签: jsf primefaces


【解决方案1】:

&lt;h:head&gt; 将自动包含所有必需的 ajax 行为的 JavaScript 文件和布局的 CSS 文件。当您删除它时,CSS 将不会被自动包含并且 ajax 行为将不会被启用。然后&lt;p:commandLink&gt; 就像一个普通的链接。

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

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

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


更新:根据 cmets,您尝试返回整个 PDF 文件作为对 ajax 请求的响应。这确实行不通。 ajax 引擎需要一个 XML 响应,其中包含有关 HTML DOM 树中更改的信息。 PDF 文件不是有效信息。此外,出于明显的安全原因,JavaScript 没有任何工具可以以编程方式触发 Save As 对话,从而可能提供任意内容。

您不能通过 ajax 下载文件。你必须关闭ajax。对于&lt;p:commandLink&gt;,基本上有两种解决方案:

  1. 使用ajax="false"

    <p:commandLink ... ajax="false" />
    
  2. 只需改用&lt;h:commandLink&gt;

    <h:commandLink ... />
    

【讨论】:

  • 感谢这样有用的答案,但我想知道为什么当我将 &lt;f:ajax disabled="true"&gt;&lt;/f:ajax&gt; 放入 &lt;p:commandLink&gt; 时我的代码开始工作。我仍然无法理解这一点
  • 首先:你是如何定义“工作”的?这是从最终用户的角度来看“视觉上发生的事情”,还是从开发人员的角度来看是“方法被调用”。换句话说,如果您是从最终用户的角度来描述这一点(尽管您是开发人员),那么“不工作”因此意味着“视觉上没有任何事情发生”,但这并不一定意味着 HTTP 请求永远不会发送和/或该方法永远不会被调用。那么,作为自尊的开发者,您能否明确确认是否调用了该方法?
  • 毕竟,重新考虑方法名称printPdf(),我相信目的是为最终用户提供一个具体的PDF文件作为下载,对吗?您正在将整个 PDF 文件写入 HTTP 响应?如果是这样,那么您的答案就在这里:您无法通过 ajax 下载文件。你必须关闭ajax。另请参阅我对这个问题的回答以获得更详细的解释:stackoverflow.com/q/12660179
  • 正是我在这个方法调用的浏览器中打印 pdf ..现在我明白了原因:) 非常感谢 :)
【解决方案2】:

在您放置

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> 


【讨论】:

  • 这个答案在不止一个方面是错误的。从 Q 大约是 p:commandLinkh:commandLink 默认情况开始 not 启用 ajax,因此无需首先禁用它
猜你喜欢
  • 1970-01-01
  • 2020-01-02
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2012-11-05
  • 1970-01-01
相关资源
最近更新 更多