<jsp:include>、<jsp:forward> 標籤


在〈指示元素〉介紹過 include 指示元素,它可以在 JSP 轉譯為 Servlet 時,將另一個 JSP 包括進來進行轉譯的動作,這是靜態地包括另一個 JSP 頁面,也就是被包括的 JSP 與原 JSP 將合併在一起,轉譯為一個 Servlet 類別,你無法在執行時期依條件動態地調整想要包括的 JSP 頁面。

如果想要在執行時期,依條件動態地調整想要包括的 JSP 頁面,則可以使用 <jsp:include> 標籤。例如:

<jsp:include page="add.jsp">
    <jsp:param name="a" value="1" />
    <jsp:param name="b" value="2" />
</jsp:include>

在這個片段中使用了 <jsp:param> 標籤,指定了動態包括 add.jsp 時所要給該頁面的請求參數。如果在 JSP 頁面中包括以上的標籤,則會將 add.jsp 動態包含進來,目前的頁面會自己生成一個 Servlet 類別,而被包括的 add.jsp 也會自己獨立生成一個 Servlet 類別,事實上,目前頁面轉譯而成的 Servlet 中,會取得 RequestDispatcher 物件,並執行 include() 方法,也就是將請求時轉交給另一個 Servlet,而後再回到目前的 Servlet。

如果想要將請求轉發給另一個 JSP 頁面作處理,則可以使用另一個標準標籤 <jsp:forward>。例如:

<jsp:forward page="add.jsp">
    <jsp:param name="a" value="1" />
    <jsp:param name="b" value="2" />
</jsp:forward>

同樣地,目前頁面會生成一個 Servlet,而被轉發的 add.jsp 也是生成一個 Servlet。目前頁面轉譯而成的 Servlet 中,會取得 RequestDispatcher 物件,並執行 forward() 方法,也就是將請求時轉發給另一個 Servlet,而後再回到目前的 Servlet。

所以,<jsp:include><jsp:forward> 標籤,在轉譯為 Servlet 原始碼之後,底層也是取得 RequestDispatcher 物件,並執行對應的 forward()include() 方法,因此在使用時的作用以及注意事項,與〈調派請求〉 說明如何使用 RequestDispatcher 物件進行請求轉發時的作用及注意事項,都是相同的。

pageContext 隱含物件其實也具有 forward()include() 方法,使用的時機是方便在 Scriptlet 中撰寫。