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》
后面开始将介绍组件的开发,供组件开发者参考。
- JSF2.0实战 - 3、onPageLoad
- JSF2.0实战
- JSF2.0实战 - 5、Button
- JSF2.0实战 - 6、TextBox
- JSF2.0实战 - 1、Hello World
- JSF2.0实战 - 2、AJAX体验
- JSF2.0实战 - 4、自定义组件
- JSF2.0实战 - 7、自定义<h:head>
- JSF2.0
- JSF2.0
- JSF2.0
- JSF2.0实战 - 8、实现换肤功能
- JSF2.0实战 - 10、自定义Ajax更新方式
- JSF2.0 fileupload
- 浅谈JSF2.0(一)
- JSF2.0应用FCKEditor
- JSF2.0学习笔记
- JSF2.0实战 - 9、自定义Filter处理资源文件依赖关系
- Cocos2dx 3.0 过渡篇(五) 随机数的获取
- 利用内存chunk充当数据buffer的vector的实现,和STL vector 有接口操作性能比较
- Spring中Controller和RequestMapping的详解
- [LeetCode] Permutations II
- php5.4配置Zend Guard Loader v3.3
- JSF2.0实战 - 3、onPageLoad
- Linux安装Tomcat7
- 通过网络访问adb
- error: Error retrieving parent for item: No resource found that matches the given name 'Widget.AppCo
- Android 数据库升级中数据保持和导入已有数据库
- C# UDP编程
- cocos2d-x 3.0正式版及android环境搭建详细教程
- OpenID 说明
- javascript基础知识