【问题标题】:How to execute a method after loading the view in Pretty-Faces在 Pretty-Faces 中加载视图后如何执行方法
【发布时间】:2018-08-17 02:28:52
【问题描述】:

单击链接并加载新页面后,我想执行一个方法。我试过<action/>tag,但这也没有帮助:

<url-mapping id="myApp/seller/addProduct">
    <pattern value="/myApp/seller/addProduct" />
    <view-id value="/pages/seller/add_product.xhtml" />
    <action onPostback="false">#{myBean.barMethod}</action>
    <action>#{myBean.myMethod}</action>
</url-mapping>

@Bean
public class MyBean{
   //source code omitted
   public void myMehtod(){
      //source code omitted
   }
}

我尝试调试方法执行。加载页面后永远不会进行调用。 请问这个问题怎么解决?

更新:在调试这个问题几个小时后,我得出的结果是第一个动作 myBean.barMethod() 始终被执行,而第二个动作 myBean.myMethod() 从未被触发,我不太明白为什么??

【问题讨论】:

  • 你尝试了什么?
  • @Kukeltje :我已经更新了帖子并提供了我的源代码。
  • 为什么不直接执行视图中的方法?
  • 视图是从多源访问的(即原始视图)。可以说,这个特定的方法应该只针对这个特定的场景或来源执行。有没有办法在目标视图中对方法执行施加条件?

标签: jsf prettyfaces


【解决方案1】:

您不能使用 pretty-config.xml 直接将参数传递给操作方法,您需要将值绑定到 bean 属性,如下所示:

https://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.pathparams

<url-mapping id="viewItem"> <pattern value="/store/item/#{ iid : bean.itemId }/" /> <view-id value="/faces/shop/item.jsf" /> <action>#{bean.loadItem}</action> </url-mapping>

此外,如果导航已被先前的操作方法调用,则不会执行第一个操作方法之外的后续操作方法:

https://www.ocpsoft.org/docs/prettyfaces/3.3.3/en-US/html/Configuration.html#config.actions.navigation

也就是说,如果您不绑定来自 URL 的值,为什么不直接在 bean 中调用不同的方法,或者获取要以其他方式传递的值?

【讨论】:

    【解决方案2】:

    在 1.2x 及以后的 JSF 版本中,您可以在第一次呈现页面时调用的 bean 方法上使用 @PostConstruct。

    在您的情况下,将页面 add_product.xhtml 绑定到一个 bean 并使用 @PostConstruct 装饰要调用的方法

    【讨论】:

    • 这并不能解决我的问题。该方法不仅应该在第一次呈现页面时执行,而且应该在每次用户被转发到它时执行。
    • 如果 bean 在 RequestScope 中,那么它肯定每次都会被触发
    • 我必须为此目的创建一个新 bean,因为 MyBean 是会话范围的。我会说,这更像是一种黑客攻击而不是解决这个问题的方法。我的最终代码不会是干净的。
    猜你喜欢
    • 2020-03-02
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2021-12-20
    • 2012-12-28
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多