JSF我也使用了一段时间了,总的感觉是,这是一个比较成熟的框架,对于应用来说,有着比较全面的组件实现。但是JSF不是一种新潮的框架,虽然全面。说它不怎么新潮是和很多ajax的框架去比较的,它的ajax其实也是基于组件的,总是不怎么纯粹。JSF的特点是屏蔽掉了所有的请求与相应操作,所有的页面组件都是基于事件的,他们工作的时候,通过action或者valuechangevent和后台绑定的一个backing bean通讯,backing bean中可以保持页面数据的状态。我们知道http本身是没有状态的,但是对于应用来说,维持状态是一件很正常的事情,原先的JSF靠刷新维持页面的状态,现在可以通过ajax维持了。
JSF工作的过程比一般的web框架,比如struts要复杂一些,但是这些复杂性,和我们没有太多的关系,我觉得使用起来还是很简单的。速度也还行,估计比较耗费服务器的内存。但我觉得这是一种很小的代价。
下面说说正题,on page load的问题。首先为什么有这个需求。JSF的后台bean的状态是稳定的,一般来说我们会把它声明成session的,这样可以最大限度的复用,也可以减少频繁创建对象的内存消耗。但是当页面加载的时候,我们往往需要做一些初始化的操作,可能是销毁一些数据,或者获得一些数据。而在页面中工作的时候,状态往往是稳定的,我们可以使用ajax的方式刷新页面的部分。但是bean的生命周期是session的,它不知道何时页面重新加载过了,因此我们需要通知我们的bean页面加载过了,你可以做初始化操作了,这就是on page load的含义。
在我原来的单位里面,on page load的实现采用的是phaseListener的方式,用了一种十分武断的命名模式来实现。这样做的优点,我觉得没有,这样做的缺点,多的很。首先,命名模式本身容易出错,因为依赖于人工检查,人工在编程领域里面是最不可靠的。另外,很有可能会有人重命名某个页面,这样就会让整个on page load机制失效。其次,phase listener在任何页面加载的时候都会工作,这是浪费的,因为很多页面不需要进行这个on page load过程。
其实最好的方法就是写一个组件来实现。也很简单。richefaces里面有一个标签是:<a4j:function ...../>这个标签是支持action的,我们用jquery的初始加载就ok。具体如下:
.....
<h:form>
<a4j:function name="init" action="#{xxxbackingbean.init}" render="panel" execute="@this"/>
<script>
$(function(){
init();
})
</script>
<h:panelgroup id="panel">
....
</h:panelgroup>
</h:form>
....
action中的init方法,其实就是我们的on page load的方法。在这个方法中你就可以做一些初始化工作了。最后,我们可以把上面的代码组织成一个复合组件。这样做的好处是:
自然
。缺点是,不是真正的在生命周期内的on-pageload,会多走一次生命周期,这样要求你的BackingBean要控制好。
编程中,什么是最难的,就是如何把代码写的自然,流畅。就如同李煜的词一样。
来源:oschina
链接:https://my.oschina.net/u/55364/blog/35980