[轉]Seam增強了JSF

Seam採用的JSF作爲表現層技術,但是標準的jsf有很多的不足之處。

1. JSF對POST方法的http request的依賴太強了,只有POST請求的數據才能直接綁定到後臺的組件上,GET方法的則不可以。
2. 根據JSF的規範,當收到一個GET請求後,JSF走完RESTORE VIEW PHARSE 就會直接到RENDER RESPONSE PHARSE,而不會做INVOKE APPLICATION,所以GET方法的請求不能觸發業務邏輯。

這些限定讓JSF在某些方面不太方便,比如書籤功能。因爲瀏覽器的書籤都是記下當前頁的URL,而不會記下POST請求裏的參數。SEAM雖然採用了JSF,但是加入了Page parameter 和 page action,彌補了JSF在這方面的缺陷。

Page parameter是將GET請求時的參數直接綁定到組件上的技術。Page action則是在生成頁面之前調用業務邏輯的技術。這兩者的配置都可以在WEB-INF/pages.xml或者 *.page.xml裏完成。比如:

    <page view-id="/calculator.jsp" action="#{calculator.calculate}">
<param name="x" value="#{calculator.lhs}"/>
<param name="y" value="#{calculator.rhs}"/>
<param name="op" converter="#{operatorConverter}" value="#{calculator.op}"/>
</page>


上 面的配置,會讓用GET方法訪問/calculator.jsp時的參數x, y, op分別綁定到calculator的lhs, rhs和op屬性上,然後執行calculator的calculate()方法。如果你只需要在頁面上傳遞參數,而並不需要綁定到某個組件上,只需要寫成:

    <page view-id="/calculator.jsp" >
<param name="result" />
</page>


這樣以GET方法傳來的名爲result的參數將繼續以result爲名字在Page Scope內傳遞下去。

Page action 還可以按條件執行:

    <page view-id="/calculator.jsp" >
<param name="x" value="#{calculator.lhs}"/>
<param name="y" value="#{calculator.rhs}"/>
<param name="op" converter="#{operatorConverter}" value="#{calculator.op}"/>
<action execute="#{calculator.calculate}" if="#{calculator.op != null}" />
</page>


除了在pages.xml, *.page.xml裏配置,還可以用seam的組件s:link s:button來實現指定page action,例如:

    <s:link view="/calculator.jsp" action="#{calculator.calculate}" ></s:link>


這 樣,當這個鏈接被點擊後,會引發一個對/calculator.jsp的GET請求,並且在生成/calculator.jsp頁面之前執行 #{calculator.calculate} 方法。如果用普通的h:commandLink的話,則會提交表單,引發POST請求。

使用page action時要注意,在處理POST請求的時候,page action會在INVOKE APPLICATION PHARSE之後執行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章