最常见的一个功能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》
后面开始将介绍组件的开发,供组件开发者参考。