最常见的一个功能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; @Override public void afterPhase(PhaseEvent e) { UIViewRoot viewRoot = e.getFacesContext().getViewRoot(); viewRoot.removePhaseListener(this); } @Override public void beforePhase(PhaseEvent e) { FacesPage.this.onPageLoad(); } @Override public 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; @ManagedBean public class Hello extends FacesPage { private HtmlInputText text; @Override protected 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》
后面开始将介绍组件的开发,供组件开发者参考。