JSF2.0实战 - 3、onPageLoad

最常见的一个功能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》

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

你可能感兴趣的:(框架,前端,JSF,jsf2,JSF2.0)