Java Web開發6___包含 Web 資源----RequestDispatcher.include 方法
有時候為了實現程式碼重用, 需要將某些公用的程式碼 和 資料放到一個或幾個Servlet 中, 以供其他的 Servlet 使用,為這實現上述功能, Java Web 專門提供了RequestDispather.include 方法, 在具體使用該方法時,可以首先通過 getServletContext 方法獲取 ServletContext 物件, 然後通過 ServletContext.getRequestDispatcher 方法獲取RequestDispatcher 物件.
IncludingServlet 類演示瞭如何使用include 方法包含Web 資源, 程式碼如下:
//包含了一個 Servlet: IncludedServlet 和一個html 頁面 public class IncludingServlet extends HttpServlet { @Override protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/html; charset=gb2312"); PrintWriter out = response.getWriter(); out.println("中國<br/>"); //向客戶端輸出請求 out.println("IncludingServlet URI:" + request.getRequestURI() + "<p/>"); // RequestDispatcher物件封裝的資源路徑前必須加“/”, RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/IncludedServlet"); //包含 IncludedServlet rd.include(request, response); rd = getServletContext().getRequestDispatcher("/chp4/IncludedHtml.html"); //包含includedHtml.html頁面 rd.include(request, response); } }
在 上述程式碼中, 包含了兩個Web資源,對映路徑為 "/servlet/IncludedServlet" 的Servlet 類 和 名為IncludedHtml.html 的靜態頁面
getRequsetDispatcher 方法的引數必須以 "/" 開頭
IncludedServlet 類的程式碼如下:
public class IncludedServlet extends HttpServlet{ @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/plain; charset=utf-8"); PrintWriter out = response.getWriter(); out.println("<b>超人</b><br/>"); out.println("IncludedServlet URI:" + request.getRequestURI() + "<p/>"); } }
在WebRoot\chp4 目錄下建立一個IncludedHtml.html 檔案,程式碼如下:
<meta content="text/html; charset=utf-8">
<table border="1">
<tr>
<td>
Book Name
</td>
<td>
Publish Date
</td>
</tr>
<tr>
<td>
Java 程式設計思想
</td>
<td>
2006年12月
</td>
</tr>
</table>
在瀏覽器輸入 URL: http://localhost:8080/webdemo/servlet/IncludingServlet
執行效果如下包含了 Web 資源
使用include 方法時,Servlet 引擎並不會 調整HttpServletRequest 中的訊息, 因此,IncludingServlet 和 IncludedServlet都輸出了訪問IncludingServlet 時的URI. 從這一點可以看出,呼叫 include 方法就相當於 Servlet 引擎在IncludingServlet 的service 方法中又呼叫了IncludedServlet 的 service 方法, 並將IncludingServlet 的service 方法的兩個引數傳入了IncludedServlet 的service 方法, 因此才會得出同樣的URI 值。
在被呼叫都 中(在本例中為 IncludedServlet) 設定的響應訊息頭將被忽略。 讀者從IncludedServlet 類中可以看到, 已經將響應正文的編碼格式設定成了utf-8,
但是, 注意Servlet 引擎傳送的並不是utf-8編碼格式, 而是gb2312. 另外在IncludedServlet 類中設定了MIME 型別是"text/plain" 而在輸出“超人” 時變成了粗體, 而不是直接輸出"<b>超人</b><br/>". 因此可以斷定, 在IncludedServlet 中呼叫的setContentType 方法並沒有生效。