【问题标题】:Action of <p:commandButton> inside <ui:fragment rendered> is not invoked<ui:fragment render> 内的 <p:commandButton> 的动作未被调用
【发布时间】:2013-06-25 12:23:27
【问题描述】:

我想做这样的事情(根据某些情况重定向到不同的页面!):

<ui:fragment rendered="#{projectPageBean.availableMethods}">
    <p:commandButton id="test"
        value="View Instrument"
        action="instrumentLayout?faces-redirect=false"/>                                 
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
    <p:commandButton id="test1"
        value="View Instrument"
        action="methodLayout?faces-redirect=false"/>       
</ui:fragment>

但是这种构造似乎不起作用;永远不会执行action属性中的页面重定向!

我怎样才能正确处理这种行为?

【问题讨论】:

  • @cobalt:&lt;ui:fragment&gt;&lt;h:panelGroup&gt; 都不是 RichFaces/PrimeFaces 特有的。它们只是标准 JSF 的一部分。

标签: jsf primefaces


【解决方案1】:

在处理表单提交期间,输入/命令组件及其所有父组件的rendered 属性将被重新评估,以防止被篡改请求。如果它评估false,那么任何子输入/命令组件都不会被解码,提交的值不会被设置,调用的动作也不会被排队。

显然这就是这里发生的事情。将 bean 放在视图范围内应该可以解决它。

@ManagedBean
@ViewScoped
public class ProjectPageBean {}

这样,只要您通过 (ajax) 回发与同一个视图交互,bean 就会一直存在。

另见:


与具体问题无关,但是使用命令按钮进行简单的页面到页面导航是很奇怪的。最好使用常规按钮。

<ui:fragment rendered="#{projectPageBean.availableMethods}">
    <p:button id="test"
        value="View Instrument"
        outcome="instrumentLayout"/>
</ui:fragment>
<ui:fragment rendered="#{not projectPageBean.availableMethods}">
    <p:button id="test1"
        value="View Instrument"
        outcome="methodLayout"/>
</ui:fragment>

这也将解决具体问题。它只会在指定的 URL 上发送一个普通的 GET 请求,而不是执行回发,从而导致所有 JSF 表单处理运行,进而最终发送另一个 GET 请求作为重定向。这样就不会那么笨拙了。请注意,您可以通过这种方式安全地将这些按钮放在&lt;h:form&gt; 之外。

如果您将它们设为 &lt;h:link styleClass="ui-button ui-state-default ui-corner-all"&gt; 而不是 &lt;p:button&gt;,那么它对 SEO 更加友好(即像 Googlebot 这样的搜索机器人可以更好地找到它们并将它们编入索引)。

另见:

【讨论】:

  • 非常非常感谢您的解释和建议!顺便说一句,我对 JSF 还很陌生,并且仍在寻找一本涵盖该主题的好书!非常欢迎任何建议!
  • 至于书;如果正确理解了基本的 HTTP 和 HTML,并且您知道这些 JSF 组件生成的 HTML 是什么,那么大部分 JSF 都可以很容易地理解。然后,要进一步深入 JSF,请考虑“Core JavaServer Faces”,或者如果您想考虑 JPA/EJB(推荐!),然后是“Beginning Java EE 6/7”。
  • 再次感谢,我一定会考虑这些建议!
猜你喜欢
  • 2014-12-25
  • 2015-09-04
  • 1970-01-01
  • 2017-11-23
  • 2013-07-24
  • 2016-06-02
  • 2011-10-09
  • 2015-04-16
  • 2013-07-28
相关资源
最近更新 更多