009_02sendRedirect() forward() include()

先來看個請求轉發的實例:html

  在這個例子中,咱們編寫一個PortalServlet,在這個Servlet中,首先判斷訪問用戶是否已經登陸,若是沒有登陸,則調用RequestDispatcher接口的include()方法,將請求轉發給LoginServlet2,LoginServlet2在響應中發送登陸表單;若是已經登陸,則調用RequestDispatcher接口的forward()方法,請求轉發給WelcomeYou界面,向用戶顯示歡迎信息。java

  1,PortalServlet.java瀏覽器

 1 package com.woodrow.outputInfo;
 2 import javax.servlet.http.*;
 3 import javax.servlet.*;
 4 import java.io.*;
 5 
 6 public class PortalServlet extends HttpServlet
 7 {
 8     public void doGet(HttpServletRequest req, HttpServletResponse resp)
 9                throws ServletException,IOException
10     {
11         resp.setContentType("text/html;charset=gb2312");
12         
13         PrintWriter out=resp.getWriter();
14         
15         out.println("<html><head><title>");
16         out.println("登陸頁面");
17         out.println("</title></head><body>");
18         
19         String name=req.getParameter("user");
20         String pwd=req.getParameter("password");
21         
22         if("zhangsan".equals(name) && "1234".equals(pwd))
23         {
24             ServletContext context=getServletContext();
25             RequestDispatcher rd=context.getRequestDispatcher("/welcome");
26             rd.forward(req,resp);
27         }
28         else
29         {
30             RequestDispatcher rd=req.getRequestDispatcher("login2");
31             rd.include(req,resp);
32         }
33         out.println("</body></html>");
34         out.close();
35     }
36     public void doPost(HttpServletRequest req, HttpServletResponse resp)
37                 throws ServletException,IOException
38     {
39         doGet(req,resp);
40     }
41 }

 

  2,LoginServlet2.java服務器

 1 package com.woodrow.outputInfo;
 2 import javax.servlet.*;
 3 import java.io.*;
 4 import javax.servlet.http.*;
 5 
 6 public class LoginServlet2 extends HttpServlet
 7 {
 8     public void doGet(HttpServletRequest req, HttpServletResponse resp)
 9                throws ServletException,IOException
10     {
11         
12         resp.setContentType("text/html;charset=gb2312");
13         
14         PrintWriter out=resp.getWriter();
15 
16         out.println("<form method=post action=portal>");
17         
18         out.println("<table>");
19         
20         out.println("<tr>");
21         out.println("<td>請輸入用戶名</td>");
22         out.println("<td><input type=text name=user></td>");
23         out.println("</tr>");
24         
25         out.println("<tr>");
26         out.println("<td>請輸入密碼</td>");
27         out.println("<td><input type=password name=password></td>");
28         out.println("</tr>");
29         
30         out.println("<tr>");
31         out.println("<td><input type=reset value=重填></td>");
32         out.println("<td><input type=submit value=登陸></td>");
33         out.println("</tr>");
34         
35         out.println("</table>");
36         
37         out.println("</form>");
38     }
39     
40     public void doPost(HttpServletRequest req, HttpServletResponse resp)
41                throws ServletException,IOException
42     {
43         doGet(req,resp);
44     }
45 }

 

  3,WelcomeYou.javaapp

 1 package com.woodrow.outputInfo;
 2 import java.io.IOException;
 3 import java.io.PrintWriter;
 4 import javax.servlet.*;
 5 import javax.servlet.http.*;
 6 
 7 public class WelcomeYou extends HttpServlet
 8 {
 9     public void doGet(HttpServletRequest req, HttpServletResponse resp)
10                throws ServletException,IOException
11     {
12         String user=req.getParameter("user");
13         String welcomeInfo="Welcome you, "+user;
14         
15         resp.setContentType("text/html");
16         
17         PrintWriter out=resp.getWriter();
18         
19         out.println("<html><head><title>");
20         out.println("Welcome Page");
21         out.println("</title></head>");
22         out.println("<body>");
23         out.println(welcomeInfo);
24         out.println("</body></html>");
25         out.close();
26     }
27     
28     public void doPost(HttpServletRequest req, HttpServletResponse resp)
29                throws ServletException,IOException
30     {
31         doGet(req,resp);
32     }
33 }

 

 1       <servlet>
 2         <servlet-name>welcome</servlet-name>
 3         <servlet-class>com.woodrow.outputInfo.WelcomeYou</servlet-class>
 4     </servlet>
 5     <servlet>
 6         <servlet-name>PortalServlet</servlet-name>
 7         <servlet-class>com.woodrow.outputInfo.PortalServlet</servlet-class>
 8     </servlet>
 9     
10     <servlet>
11         <servlet-name>LoginServlet2</servlet-name>
12         <servlet-class>com.woodrow.outputInfo.LoginServlet2</servlet-class>
13     </servlet>
14     
15     <servlet-mapping>
16         <servlet-name>welcome</servlet-name>
17         <url-pattern>/welcome</url-pattern>
18     </servlet-mapping>
19     
20     
21     <servlet-mapping>
22         <servlet-name>PortalServlet</servlet-name>
23         <url-pattern>/portal</url-pattern>
24     </servlet-mapping>
25     
26     <servlet-mapping>
27         <servlet-name>LoginServlet2</servlet-name>
28         <url-pattern>/login2</url-pattern>
29     </servlet-mapping>

 

  啓動Tomcat服務器,打開IE瀏覽器,在地址欄中輸入http://localhost:8080/OutputInfo/portal,你將看到以下圖:jsp

  第一次訪問時,用戶尚未登陸,PortalServlet會先輸出一部分HTML代碼,而後利用include()方法調用LoginServlet2對請求進行響應,LoginServlet2輸出登陸表單後PortalServlet繼續輸出剩餘的HTML代碼,最後關閉輸出流對象,提交響應。post

 

  在登陸表單中輸入用戶名zhangsan和密碼1234,單擊「登陸」提交按鈕,你將看到以下圖:url

  當用戶輸了正確的用戶名和密碼,PortalServlet利用forwrd()方法將請求轉發給WelcomeYou進行處理,而WelcomeYou想用戶發回了歡迎信息。在PortalServlet中調用forward()方法以前輸出的沒有提交的HTML代碼被清除,而在調用forward()方法以後,執行的控制權轉到WelcomeYou,PortalServlet中剩餘的代碼也再也不有效。spa

  HttpServletResponse接口的sendRedirect()方法和RequestDispatcher接口的forward()方法均可以利用另外的資源(Servlet,jsp頁面或HTML文件)來爲客戶端進行服務,可是這兩種方法有着本質上的區別。code

sendRedirect()方法的工做原理圖:

 

交互過程以下:

  1,瀏覽器訪問Servlet1;

  2,Servlet1想讓Servlet2爲客戶端服務;

  3,Servlet1調用sendRedirect()方法,將客戶端的請求重定向到Servlet2;

  4,瀏覽器訪問Servlet2;

  5,Servlet2對客戶端的請求作出響應

forward()方法的工做原理圖:

  

交互過程以下:

  1,瀏覽器訪問Servlet1;

  2,Servlet1想讓Servlet2對客戶端的請求進行響應,因而調用forward()方法,請求轉發給Servlet2處理;

  3,Servlet2對請求作出響應。

 

  sendRedirect()方法和forward()方法還有一個區別,那就是sendRedirect()方法不但能夠在位於同一主機上的不一樣Web應用程序之間進行重定向,並且還能夠將客戶端重定向到其餘服務器上的Web應用程序資源。

相關文章
相關標籤/搜索