Jsf 无法理解<;h:头>;行为

Jsf 无法理解<;h:头>;行为,jsf,primefaces,Jsf,Primefaces,我有一个模板组合按钮。xhtml包含一个: 最后一个是Template.xhtml,它在中插入MainContent模板定义 当我将放在模板.xhtml中时,则中的按钮停止工作。xhtml停止工作,但页面的CSS工作正常。当我移除或将其替换为时,开始工作,但CSS停止工作 这是如何造成的,我如何解决它?在您放置的Button.xhtml中 <h:commandLink value="View" action="#{printClass.printPdf}"/> 您需要禁

我有一个模板组合
按钮。xhtml
包含一个

最后一个是
Template.xhtml
,它在
中插入
MainContent
模板定义


当我将
放在
模板.xhtml
中时,则
中的
按钮停止工作。xhtml
停止工作,但页面的CSS工作正常。当我移除
或将其替换为
时,
开始工作,但CSS停止工作

这是如何造成的,我如何解决它?

在您放置的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> 


将自动包含用于ajax行为的所有必要JavaScript文件和用于布局的CSS文件。当您删除它时,CSS将不会自动包含,ajax行为也不会启用。然后,
将充当普通的链接

对于JSF和PrimeFaces组件的正常运行以及PrimeFaces外观的应用是绝对必要的。因此,您不应该移除或替换它

让我们专注于失败的
问题。可能的原因相对较多,这些都在回答中提到:

您没有显示完整的版本,因此不可能复制“粘贴”并运行代码来查看问题本身(在以后的问题中也要这样做)。因此,我只想根据症状来说明这个问题最可能的原因:您正在相互嵌套
组件。将
放置在主模板中也是一种设计味道。您应该将其放在模板客户端中。Als注意到
应该有自己的形式,但是
本身不应该嵌套在另一种形式中


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

您不能通过ajax下载文件。您必须关闭ajax。在
的情况下,基本上有两种解决方案:

  • 使用
    ajax=“false”

    
    
  • 只需使用

    <h:commandLink ... />
    
    
    

  • 你在用冰面吗?或者,您是否在没有实际测试的情况下,粗心地将代码片段过度简化了(例如,您最初使用了PrimeFaces
    ,但由于某些不清楚的原因,您将其过度概括为
    ?否则,阿米尔的答案就毫无意义了。默认情况下,
    上根本没有ajax。是的,我使用了它,这就是它开始工作的原因。我错误地忘记了提到-1,因为在问问题时粗心大意,导致了一个根本没有问题的问题。一旦你解决了这个问题,我就取消否决票。aamir的答案可能暗示了解决方案,但考虑到您实际使用的是PrimeFaces,这在技术上也是错误的。在以后的问题中,自己在一个空白的操场环境中测试代码片段;最简单的做法是,假设您自己是答案者,并试图根据问题中迄今为止提供的信息重现问题。thx提供了如此有用的答案,但我想知道为什么我的代码在我将
    放入
    时开始工作。我仍然无法理解第一个问题:你是如何定义“工作”的?这在终端用户的视角中是“视觉上发生的事情”,还是在开发人员的视角中是“方法被调用”。换句话说,如果您是从最终用户的角度来描述这一点的(尽管您是一名开发人员),那么“不工作”就意味着“视觉上什么都没有发生”,但这并不一定意味着从未发送HTTP请求和/或从未调用该方法。因此,作为一名自尊心强的开发人员,您能否明确确认是否调用了该方法?毕竟,重新考虑方法名称
    printPdf()
    ,我相信目的是向最终用户提供一个具体的PDF文件作为下载,对吗?您正在将整个PDF文件写入HTTP响应?如果是这样的话,那么您的答案是:您不能通过ajax下载文件。您必须关闭ajax。另请参阅我对这个问题的回答,以获得更详细的解释:确切地说,我正在浏览器中打印此方法调用的pdf。现在我知道了原因:)非常感谢:)这个答案在多个方面都是错误的。首先,Q是关于
    p:commandLink
    的,并且默认情况下
    h:commandLink
    没有启用ajax,因此无需首先禁用它
    <h:commandLink value="View" action="#{printClass.printPdf}"/> 
    
    <h:commandLink value="View" action="#{printClass.printPdf}">
    <f:ajax disabled="true"></f:ajax>
    </h:commandLink> 
    
    <p:commandLink ... ajax="false" />
    
    <h:commandLink ... />