JSF on page load 的实现

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要控制好。

编程中,什么是最难的,就是如何把代码写的天然,流畅。就如同李煜的词同样。
相关文章
相关标签/搜索