在〈指示元素〉介紹過 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 中撰寫。