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,我更新了问题中的代码。
尝试将<f:event type="preRenderView"
放在<h:body>
标签上方
@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 && !ajaxRequest
可以换成!fc.isPostback()
。但毕竟,如果 OP 实际所做的只是将 @RequestScoped
替换为 @ViewScoped
(除非他也将 @ManagedProperty
替换为 @987654329 @,但这没有明确提到,因此我对这个问题的评论也是如此)。以上是关于JSF。在每个页面加载时调用支持 bean 方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Spring 安全性和 JSF:在登录时调用支持 bean 的方法?
javascript在启动时调用托管bean的方法,而不是在命令按钮单击时调用它们
如何在 JSF 页面加载之前在支持 bean 中启动特殊的 init 事件?