1. 程式人生 > >IT兄弟連 JavaWeb教程 請求重定向案例

IT兄弟連 JavaWeb教程 請求重定向案例

沒有 tomcat ner 表示 輸出 返回 extends 組件 cati

Check2Servlet類與Output2Servlet類之間為請求轉發關系。在web.xml文件中,為Check2Servlet映射的URL為"/check2",為Output2Servlet映射的URL為"/outout2"。

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教程 請求重定向案例