先來看個請求轉發的實例: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應用程序資源。