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

編程中,什麼是最難的,就是如何把代碼寫的天然,流暢。就如同李煜的詞同樣。
相關文章
相關標籤/搜索