IT兄弟連 JavaWeb教程 請求重定向案例
public class Check2Servlet extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{ PrintWriter out = response.getWriter(); String username = request.getParameter("username"); String message = null; if(username == null){ message = "Please input username"; }else{ message = "Hello," + username; } request.setAttribute("msg",username); out.println("Output from Check2Servlet before redirecting."); System.out.println("Output from Check2Servlet before redirecting"); response.sendRedirect("/helloapp/output2?msg="+message); out.println("Output from Check2Servlet after redirecting."); System.out.println("Output from Check2Servlet after redirecting."); }
}
public class Output2Check extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException,IOException{ String message = (String)request.getAttribute("msg"); System.out.println("請求範圍內的消息:" + message); message = request.getParameter("message"); System.out.println("請求參數中的消息:" + message); PrintWriter out = response.getWriter(); out.println("message"); out.close(); }
}
Check2Servlet與上個例子中的CheckServlet有些相似,Check2Servlet先檢查客戶端是否提供username請求參數,在依據此生成一條消息,用變量message表示,接下來把這條消息作為屬性保存到ServletRequest對象中,在重定向到Output2Servlet。與重定向相關的代碼為:
response.sendRedirect("/helloapp/output2?msg="+message);
response.sendRedirect(String location)方法具有以下特點:
Servlet源組件生成的響應結果不會被發送到客戶端。request.sendRedirect(String location)方法一律返回狀態碼為302的響應結果,瀏覽器端接收到的這種響應結果後,再立即自動請求訪問重定向的目標Web組件,客戶端最後接收到的是目標Web組件的響應結果。
如果源組件在進行重定向之前,已經提交了響應結果(例如調用ServletResponse的flushBuffer()方法,或者調用與SerlvetResponse關聯的輸出流的close()方法),那麽sendRedirect()方法會掏出IllegalStateException。為了避免該異常,不應該在源組件中提交響應結果。
在Servlet源組件中調用response.sendRedirect()方法之後的代碼塊也會被執行。
源組件和目標組件不共享同一個ServletRequest對象,因此不共享請求範圍內的共享數據。
對於response.sendRedirect(String location)方法中的參數location,如果以"/"開頭,表示相對於當前服務器根路徑的URL,如果以http://開頭,表示一個完整的URL。
目標組件不必是同一個服務器上的同一個Web應用中的組件,它可以是Interner上的任意一個有效的網頁。
sendRedirect()方法是在HttpSerlvetResponse接口中定義的,而在ServletResponse接口中沒有sendRedirect()方法,因此重定向機制是由HTTP協議規定的。
在瀏覽器中訪問http://localhost:8080/helloapp/check2,其中helloapp是項目名稱,/check2是請求路徑,瀏覽器中會出現"Please input username"。
瀏覽器實際上發出了兩次請求,第一次請求訪問Check2Servlet,第二次請求訪問Output2Servlet,瀏覽器最終展示的是Output2Servlet生成的HTML頁面。
Check2Servlet在調用sendRedirect()方法之前和之後,都試圖向瀏覽器端及服務器的控制臺輸出一些數據:
out.println("Output from Check2Servlet before redirecting.");
System.out.println("Output from Check2Servlet before redirecting");
response.sendRedirect("/helloapp/output2?msg="+message);
out.println("Output from Check2Servlet after redirecting.");
System.out.println("Output from Check2Servlet after redirecting.");
從瀏覽器中顯示的頁面可以看出,Check2Servlet作為源組件,它所生成的響應結果不會被發送到客戶端。
此外,在Tomcat服務器的控制臺,會顯示調用response.sendRedirect()方法之前及之後的System.out.println()語句的打印結果。由此可見,在Servlet源組件中調用response.sendRedirect()方法之後的代碼也會被執行。
另外,Output2Servlet也向控制臺打印了如下內容:
請求範圍內的消息: null
請求參數中的消息:Please input username.
由於Output2Servlet與Check2Servlet不共享請求範圍內的數據,因此盡管Check2Servlet向請求範圍內存放了消息,Output2Servlet卻無法從請求範圍內獲得該消息。Check2Servlet還把消息作為請求參數傳給Output2Servlet,Output2Servlet能獲得該請求參數。
IT兄弟連 JavaWeb教程 請求重定向案例