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之後執行。