ADF Faces: 避免使用<jsp:include>標籤

在使用ADF進行應用程序的開發時,應該避免使用<jsp:include>標籤來包含子的ADF Faces頁面,因爲:

1. 子頁面中的控件ID有可能會和父頁面的控件ID衝突;

2. 不能將子頁面作爲一個局部刷新對象,因爲不支持partialTriggers屬性;

3. 不能使用JSF的表達式語言動態傳遞參數給子頁面,因爲<jsp:param/>是爲JSP設計的,不支持動態傳遞參數;

4. 不能使用MDS來客戶化<jsp:include/>標籤。

 

所以,應該使用ADF提供的<af:declarativeComponent>標籤,因爲:

1. 該標籤是一個有自己ID的命名容器,父子頁面不會發生控件ID衝突;

2. 該標籤支持partialTriggers屬性,所以可以將其設置爲一個局部刷新對象;

3. 可以使用<f:attribute/>標籤,動態傳遞參數給子頁面;

4. 可以使用MDS客戶化該標籤。

 

所以,替換下面的代碼

<jsp:include page="/includes/myIncludeFragment.jsff">
  <jsp:param name="myParam" value="myValue"/>
</jsp:include>

<af:declarativeComponent id="dc0" viewId="/includes/myIncludeFragment.jsff" myParam="myValue"/>

 

注意,標籤中使用了myParam屬性,這個屬性必須定義到申明式控件的定義文件中,如下:

<?xml version='1.0' encoding='UTF-8'?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:f="http://java.sun.com/jsf/core"
          xmlns:af="http://xmlns.oracle.com/adf/faces/rich" version="2.1">
    <af:componentDef var="attrs">
        <af:xmlContent>
            <component xmlns="http://xmlns.oracle.com/adf/faces/rich/component">
                <description>my fragment</description>
                <attribute>
                    <attribute-name>myParam</attribute-name>
                    <attribute-class>java.lang.String</attribute-class>
                    <required>true</required>
                </attribute>
            </component>
        </af:xmlContent>
        <!-- Actual content goes here-->
        <af:outputText value="#{attrs.myParam}"/>
    </af:componentDef>
</jsp:root>

 

補充說明:

關於上面提到的控件ID衝突的問題,也可以通過使用<f:subview/>標籤包含子頁面來解決。但是不論使用<af:declarativeComponent/>標籤還是<f:subview/>標籤,都會有另外一個問題:子頁面的頁面定義文件(Page Definition File)不會被讀取,也就是說,子頁面和父頁面共享父頁面的頁面定義文件,而沒有單獨的頁面定義文件。

所以如果子頁面需要單獨的頁面定義文件,那麼就需要使用ADF template或者Region了。

 

原文來自以下鏈接:

https://blogs.oracle.com/jheadstart/entry/avoid_use_of_jspinclude_where

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章