JSF。在每个页面加载时调用支持 bean 方法[重复]

Posted

技术标签:

【中文标题】JSF。在每个页面加载时调用支持 bean 方法[重复]【英文标题】:JSF. Call backing bean method on every page load [duplicate] 【发布时间】:2012-08-03 08:01:09 【问题描述】:

简而言之,这是我的情况。

我有一个带有数据表的页面和几个由 bean 支持的按钮。 Bean 应该使用一些默认属性进行初始化。该属性可以根据操作进行更改。 我从 RequestScoped bean 和 @PostConstruct 注释方法开始。但似乎数据表仅适用于视图(会话)范围。现在我的设置如下所示:

@ManagedBean
@ViewScoped
public class ProductsTableBean implements Serializable 

    private LazyDataModel<Products> productsData;
    @Inject
    private ProductsFacade model;


    public void onPageLoad() 
       // here some defaults are set
       // ...
       System.err.println("onPageLoad called");
    

    public void addRow() 
       // andhere some defaults redefined
       // ...
       System.err.println("addRow called");
    

    ...

和来自jsf页面的sn-p:

    <p:commandButton action="#productsTableBean.addRow()"
                     title="save"
                     update="@form" process="@form" >
    </p:commandButton>
    ...
    <f:metadata>
        <f:event type="preRenderView" listener="#productsTableBean.onPageLoad"/>
    </f:metadata>

这是调用顺序中出现的主要问题,我有以下输出:

onPageLoad called
addRow called
onPageLoad called <-- :(

但我希望 addRow 成为最后一个被调用的操作,如下所示:

onPageLoad called
addRow called

这里有什么简单的解决方案吗?

【问题讨论】:

您在使用f:ajax 吗?显示来自 JSF 的添加行命令按钮/链接代码 您好,我使用的是 primefaces,但它似乎只是在内部使用 f:ajax,我更新了问题中的代码。 尝试将&lt;f:event type="preRenderView" 放在&lt;h:body&gt; 标签上方 @PostConstruct 到底有多不足? @PostConstruct 仅在构造 bean 时调用,因此在 ViewScoped 中仅在重新加载页面时调用它,但我需要在每次单击按钮时调用它。 【参考方案1】:

检查此链接: http://www.mkyong.com/jsf2/jsf-2-prerenderviewevent-example/

您知道每个请求都会调用该事件:ajax,验证失败....您可以检查它是否是这样的新请求:

public boolean isNewRequest() 
        final FacesContext fc = FacesContext.getCurrentInstance();
        final boolean getMethod = ((HttpServletRequest) fc.getExternalContext().getRequest()).getMethod().equals("GET");
        final boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
        final boolean validationFailed = fc.isValidationFailed();
        return getMethod && !ajaxRequest && !validationFailed;
    

public void onPageLoad() 
       // here some defaults are set
       // ...
if (isNewRequest()) ...
       System.err.println("onPageLoad called");
    

【讨论】:

笨拙的getMethod &amp;&amp; !ajaxRequest可以换成!fc.isPostback()。但毕竟,如果 OP 实际所做的只是将 @RequestScoped 替换为 @ViewScoped (除非他@ManagedProperty 替换为 @987654329 @,但这没有明确提到,因此我对这个问题的评论也是如此)。

以上是关于JSF。在每个页面加载时调用支持 bean 方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spring 安全性和 JSF:在登录时调用支持 bean 的方法?

javascript在启动时调用托管bean的方法,而不是在命令按钮单击时调用它们

如何在 JSF 页面加载之前在支持 bean 中启动特殊的 init 事件?

java jsf 如何去重新加载bean

有没有办法在离开带有JSF或PrimeFaces的页面时调用方法?

JSF 页面元素无法从具有动作属性的支持 bean 触发方法。(JSF2.0 + primefaces)