1. 程式人生 > >Java Web開發6___包含 Web 資源----RequestDispatcher.include 方法

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  方法並沒有生效。