JSF on page load 的实现

被刻印的时光 ゝ 提交于 2019-12-05 22:57:12
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要控制好。

编程中,什么是最难的,就是如何把代码写的自然,流畅。就如同李煜的词一样。
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!