1.重新導向和請求指派
(1)請求的重新導向
HttpServletResponset介面提供的sendRedirect()方法用於產生302響應碼和Location回應標頭,從而通知用戶端去重新訪問Location回應標頭中指定的URL,其完整的定義文法如下:
public void sendRedirect(String location) throws IOException;
其中的location參數指定了重新導向的URL,它可以使用絕對URL和相對URL,Servlet容器會自動將相對URL轉換成絕對URL後,再產生location頭欄位。
重新導向的例子 response.sendRedirect(“secuse“);
註:重新導向是兩個servlet類結合而使用的,即是兩次向伺服器提交請求。一個servlet類不能完成操作,當使用者運行到sendRedirect()時,會產生302響應碼,意思是再次提交請求,在localtion的url的帶領下,去訪問secuess的servlet類,從而完成實現,但是在secuess中不能再次提交request的請求,否則返回的是null。因為每一次請求都是獨一的。
(2)請求的指派
1.Servlet API中定義了一個RequestDispatcher介面,俗稱請求指派器。它定義了如下兩個方法:
(1)public void forward(ServletRequest request, ServletResponse response) throws ServletException,IOException;
(2)public void include(ServletRequest request, ServletResponse response) throws ServletException,IOException
2.請求的轉寄:
調用ServletContext介面提供的getRequestDispatcher(String url)方法。
調用ServletRequest介面提供的getRequestDispatcher(String url)方法
3.例子:
RequestDispatcher rd = request.getRequestDispatcher("fail");
//請求的轉寄,向前 ------------ 一個請求對象
rd.forward(request, response);
//請求的轉寄
rd.include(request, response);
forwrod和include的區別:forword是在頁面跳轉之後直接輸出,不會再返回,而include則是把我當前的目錄包含,輸出
(3)兩者比較:
1.請求轉寄只能是同一個web網站
重新導向不僅可以定向到當前的web程式,還可以訪問其他的網站的資源
2. 重新導向在完成操作後,地址欄會發生變化,由初始的URL地址變成重新導向的目標URL
請求轉寄過程結束後,瀏覽器地址欄保持初始的URL地址不變。
3.請求指派的發起者和被調用者之間共用相同的request執行個體和response執行個體,它們屬於同一個“請求/響應”過程;而重新導向的發起者和被調用者使用各自的request執行個體和response執行個體,它們各自屬於獨立的“請求/響應”過程
(4)利用請求域擷取屬性傳遞對象資料
HttpServletRequest介面中提供了幾個方法用來操作請求執行個體中儲存的對象:
– public void setAttribute(String name, Object obj):將Object Storage Service進HttpServletRequest執行個體中。
– public Object getAttribute(String name):檢索儲存在HttpServletRequest執行個體中的對象。
– public Enumeration getAttributeNames():返回包含HttpServletRequest執行個體中的所有屬性名稱的Enumeration對象
例子:
設定:
request.setAttribute("var1", "var1");
request.setAttribute("var2", "var3");
讀取:
//枚舉類型的擷取
Enumeration enum1 = request.getAttributeNames();
//擷取每一個名稱所對應的值
while(enum1.hasMoreElements()){
//得到屬性的名稱
String s= (String) enum1.nextElement();
//得到屬性的值
String var = (String) request.getAttribute(s);
System.out.println(s+"::"+var);
}
(5) ServletConfig和servletContext
系統在建立servlet執行個體之前,先讀取xml檔案,並封裝給ServletConfig對象,來進行初始化
<!-- 在部署檔案xml中必須有兩個標籤,分別為《servlet》和《servlet-map》
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
*.do是可以把訪問的名字隨便寫
-->
servletConfig對象封裝了web.xml初始化的值