JSF2.0实战 - 3、onPageLoad

来源:互联网 发布:阿里云虚拟主机 mysql 编辑:程序博客网 时间:2024/04/29 20:29

最常见的一个功能onPageLoad,JSF没有提供,我们自己实现。

JSF的生命周期对于不熟悉JSF开发的人来说,是一个不容易理解的概念,包括我用了这么久,都没彻底记清楚,总是在需要的时候翻翻资料。我认为一线开发人员,使用JSF做业务开发的开发者根本不需要理解这个东西,只有开发组件的人需要理解一下。在前线使用JSF开发业务的开发者,只需要知道页面初始化的功能写在哪里,按钮触发时的功能写在哪里就行了,其它的东西没必要搞得太复杂。

页面初始化的功能写在哪,这个最常见的需求JSF就没提供出来,经过我们研究,在生命周期中插入一个监听器就可以搞定这个功能。

还是接上篇,考虑这样一个功能:页面首次打开时,文本框显示当前时间,点击按钮后文本框显示hello world!。这个功能写在managed bean的构造函数里不合适,因为文本框那时侯还是null,无法设置值。只有实现onPageLoad,才能实现这个功能。

提供一个通用的managed bean的父类Facespage.java,实现onPageLoad

package test;import javax.faces.component.UIViewRoot;import javax.faces.context.FacesContext;import javax.faces.event.PhaseEvent;import javax.faces.event.PhaseId;import javax.faces.event.PhaseListener;public class FacesPage {public FacesPage() {FacesContext.getCurrentInstance().getViewRoot().addPhaseListener(new PageLoadListener());}protected void onPageLoad() {}protected boolean isPostback() {return FacesContext.getCurrentInstance().isPostback();}private class PageLoadListener implements PhaseListener {private static final long serialVersionUID = 1602328501512626684L;@Overridepublic void afterPhase(PhaseEvent e) {UIViewRoot viewRoot = e.getFacesContext().getViewRoot();viewRoot.removePhaseListener(this);}@Overridepublic void beforePhase(PhaseEvent e) {FacesPage.this.onPageLoad();}@Overridepublic PhaseId getPhaseId() {return PhaseId.RENDER_RESPONSE;}}}
子类只需实现onPageLoad,在里面检查是否是isPostBack,即可判定是否是页面首次加载。JSF2.0实现了isPostBack方法,和ASP.NET相同,用来判断当前是首次打开页面还是二次提交。

Hello.java

package test;import java.text.SimpleDateFormat;import java.util.Calendar;import javax.faces.bean.ManagedBean;import javax.faces.component.html.HtmlInputText;@ManagedBeanpublic class Hello extends FacesPage {private HtmlInputText text;@Overrideprotected void onPageLoad() {if (!this.isPostback()) {Calendar now = Calendar.getInstance();text.setValue(new SimpleDateFormat("hh:mm:ss").format(now.getTime()));}}public void action() {Calendar now = Calendar.getInstance();text.setValue("hello world! " + new SimpleDateFormat("hh:mm:ss").format(now.getTime()));}public HtmlInputText getText() {return text;}public void setText(HtmlInputText text) {this.text = text;}}

下载示例代码


至此,JSF2.0最基本最常见的功能介绍到这,一线开发人员读过以后就可以上阵实际操作了,更多的内容参考公司的组件API和示例代码。其余的navigation、validation、converters、faceslet、composite components等就不用管了,这些功能把简单的事情搞复杂了,我们在实际应用中从来不用这些,一样工作得很好。

还想深入的了解JSF2.0,推荐两本书

《JavaServer Faces 2.0, The Complete Reference》

《Core.JavaServer.Faces.3rd.Edition》

后面开始将介绍组件的开发,供组件开发者参考。

0 0
原创粉丝点击