Servlet之forward、sendRedirect、 include区别与使用

来源:互联网 发布:桌面软件图 编辑:程序博客网 时间:2024/06/07 18:53

servlet中的请求转发主要有三种方式:
1、 forward:是指转发,将当前request和response对象保存,交给指定的url处理。并没有表示页面的跳转,所以地址栏的地址不会发生改变。
2、 redirect:是指重定向,包含两次浏览器请求,浏览器根据url请求一个新的页面,所有的业务处理都转到下一个页面,地址栏的地址会变发生改变。
3、 include:意为包含,即包含url中的内容,进一步理解为,将url中的内容包含进当前的servlet当中来,并用当前servlet的request和respose来执行url中的内容处理业务.所以不会发生页面的跳转,地址栏地址不会发生改变。

1、客户端跳转

        在Servlet中如果要想进行客户端跳转,直接使用HttpServletResponse接口的sendRedirect()方法即可,要注意的是:此跳转只能传递session范围的属性,无法传递request范围属性。
        这个过程也可叫做重定向。重定向是指页面重新定位到某个新地址,之前的请求失效,进入一个新的请求,且跳转后浏览器地址栏内容将变为新的指定地址。重定向是通过HttpServletResponse对象的sendRedirect()来实现,该方法相当于浏览器重新发送一个请求response.sendRedirect(path);





该图的交互过程如下:
① 浏览器访问Servlet1。
② Servlet1想让Servlet2为客户端服务。
③ Servlet1调用sendRedirect()方法,将客户端的请求重定向到Servlet2。
④ 浏览器访问Servlet2。
⑤ Servlet2对客户端的请求做出响应。这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web Container在将它发送到客户端前会把它转换成一个绝对的URL。

由于是客户端跳转,从运行程序结果可以发现,跳转后的地址栏是会发生变化的,只能接收session属性范围的内容,不能接收request属性范围的内容


2、服务器跳转

      服务器跳转也可叫做请求转发。请求转发是指将请求再转发到另一资源(一般为JSP或Servlet)。此过程依然在同一个请求范围内,转发后浏览器地址栏内容不变。请求转发使用RequestDispatcher接口中的forward()方法来实现,该方法可以把请求转发到另外一个资源,并让该资源对浏览器的请求进行响应

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. RequestDispatcher rd = request.getRequestDispatcher(path);  
  2. rd.forward(request,response);  

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. request.getRequestDispatcher(path) .forward(request,response);  



①浏览器访问Servlet1。
② Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法,将请求转发给Servlet2进行处理。
③ Servlet2对请求做出响应。
交互过程可以看出,调用forward()方法,对浏览器来说是透明的,浏览器并不知道为其服务的Servlet已经换成Servlet2了,它只知道发出了一个请求,获得了一个响应。显示的URL始终是原始请求的URL。

        服务器跳转后,地址栏不发生变化,而且此时在跳转后的JSP文件中接收到session及request范围的属性。此外,sendRedirect()方法和forward()方法还有一个区别,那就是sendRedirect()方法不但可以在位于同一主机上的不同Web应用程序之间进行重定向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。

3、二者区别总结


4、测试范例

本例子工程免费下载

在eclipse下新建一个web项目



首先编写三个servlet界面:分别是

登录验证:login.Java;

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.mucfc;  
  2. /**   
  3. *功能  登录验证 
  4. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)   
  5. *时间 2015.4.24  
  6. */  
  7. import java.io.IOException;  
  8. import java.io.PrintWriter;  
  9.   
  10. import javax.servlet.RequestDispatcher;  
  11. import javax.servlet.ServletException;  
  12. import javax.servlet.annotation.WebServlet;  
  13. import javax.servlet.http.HttpServlet;  
  14. import javax.servlet.http.HttpServletRequest;  
  15. import javax.servlet.http.HttpServletResponse;  
  16.   
  17. @WebServlet("/LoginCheck")  
  18. public class LoginCheck extends HttpServlet {  
  19.     private static final long serialVersionUID = 1L;  
  20.   
  21.     public LoginCheck() {  
  22.         super();  
  23.     }  
  24.   
  25.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  26.         request.setCharacterEncoding("gbk");    
  27.         response.setCharacterEncoding("gbk");    
  28.         response.setContentType("text/html;charset=gbk");    
  29.         String username = request.getParameter("username");    
  30.         String password = request.getParameter("password");    
  31.         PrintWriter pw = response.getWriter();    
  32.         pw.write("include包含。");    
  33.         if(username.equals("lin")&&password.equals("123")){    
  34.         //include测试    
  35.             request.getRequestDispatcher("/success").include(request, response);    
  36.        //forward测试  
  37.         //RequestDispatcher dispatcher=request.getRequestDispatcher("/success");  
  38.        // dispatcher.forward(request, response);   
  39.         }else{    
  40.             //在sendRedict中url前必须加上当前web程序的路径名.....    
  41.             response.sendRedirect(request.getContextPath()+"/fail");    
  42.         }    
  43.     }  
  44.   
  45.   
  46.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  47.       doGet(request, response);  
  48.     }  
  49.   
  50. }  
登录成功:success.java;

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.mucfc;  
  2. /**   
  3. *功能  登录成功 
  4. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)   
  5. *时间 2015.4.24  
  6. */  
  7. import java.io.IOException;  
  8.   
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.annotation.WebServlet;  
  11. import javax.servlet.http.HttpServlet;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15.   
  16. @WebServlet("/success")  
  17. public class success extends HttpServlet {  
  18.     private static final long serialVersionUID = 1L;  
  19.          
  20.   
  21.     public success() {  
  22.         super();  
  23.     }  
  24.   
  25.   
  26.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  27.         
  28.         //设置编码格式    
  29.         response.setContentType("text/html;charset=GBK");             
  30.         //返回html页面    
  31.         response.getWriter().println("<html>");    
  32.         response.getWriter().println("<head>");       
  33.         response.getWriter().println("<title>登录信息</title>");        
  34.         response.getWriter().println("</head>");      
  35.         response.getWriter().println("<body algin=center>");       
  36.         response.getWriter().println("欢迎登录成功!!!");      
  37.         response.getWriter().println("</body>");      
  38.         response.getWriter().println("</html>");    
  39.     }  
  40.   
  41.   
  42.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  43.     doGet(request, response);  
  44.     }  
  45.   
  46. }  
登录失败:fail.java;

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.mucfc;  
  2. /**   
  3. *功能  登录失败 
  4. *作者 林炳文(ling20081005@126.com 博客:http://blog.csdn.net/evankaka)   
  5. *时间 2015.4.24  
  6. */  
  7. import java.io.IOException;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.annotation.WebServlet;  
  10. import javax.servlet.http.HttpServlet;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14.   
  15. @WebServlet("/fail")  
  16. public class fail extends HttpServlet {  
  17.     private static final long serialVersionUID = 1L;  
  18.          
  19.    
  20.     public fail() {  
  21.         super();  
  22.     }  
  23.   
  24.   
  25.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  26.         //设置编码格式    
  27.         response.setContentType("text/html;charset=GBK");             
  28.         //返回html页面    
  29.         response.getWriter().println("<html>");    
  30.         response.getWriter().println("<head>");       
  31.         response.getWriter().println("<title>登录信息</title>");        
  32.         response.getWriter().println("</head>");      
  33.         response.getWriter().println("<body algin=center>");       
  34.         response.getWriter().println("登录失败!!!");      
  35.         response.getWriter().println("</body>");      
  36.         response.getWriter().println("</html>");    
  37.     }  
  38.   
  39.   
  40.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  41.     }  
  42.   
  43. }  

2、登录初始化界面Login.jsp

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <%@ page language="java" contentType="text/html; charset=GBK"  
  2.     pageEncoding="GBK"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=GBK">  
  7. <center><title>MVC登录实例</title></center>  
  8. </head>  
  9. <body>  
  10. <center><h2>用户登录程序</h2></center>  
  11. <center>  
  12. <form action="LoginCheck" method="post" >  
  13. 用户名:<input type="text" name="username"><br>  
  14.  密 码:<input type="password" name="password"><br>  
  15.  <input type="submit" value="登录">  
  16.  <input type="reset" value="重置">  
  17. </form>  
  18. </center>  
  19. </body>  
  20. </html>  
3、web.xml配置

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
  3.   <welcome-file-list>  
  4.     <welcome-file>Login.html</welcome-file>  
  5.     <welcome-file>Login.htm</welcome-file>  
  6.     <welcome-file>Login.jsp</welcome-file>  
  7.   </welcome-file-list>  
  8.     
  9.  <servlet>  
  10.     <servlet-name>LoginCheck</servlet-name>  
  11.     <servlet-class>com.mucfc.LoginCheck</servlet-class>  
  12.   </servlet>  
  13.   <servlet-mapping>  
  14.     <servlet-name>LoginCheck</servlet-name>  
  15.     <url-pattern>/servlet/LoginCheck</url-pattern>  
  16.   </servlet-mapping>  
  17.     
  18.     <servlet>  
  19.     <servlet-name>success</servlet-name>  
  20.     <servlet-class>com.mucfc.success</servlet-class>  
  21.   </servlet>  
  22.   <servlet-mapping>  
  23.     <servlet-name>success</servlet-name>  
  24.     <url-pattern>/servlet/success</url-pattern>  
  25.   </servlet-mapping>  
  26.     
  27.      <servlet>  
  28.     <servlet-name>fail</servlet-name>  
  29.     <servlet-class>com.mucfc.fail</servlet-class>  
  30.   </servlet>  
  31.   <servlet-mapping>  
  32.     <servlet-name>fail</servlet-name>  
  33.     <url-pattern>/servlet/fail</url-pattern>  
  34.   </servlet-mapping>   
  35.     
  36. </web-app>  

运行后的界面,输入后会先跳转到LoginCheck


运行后如果输入正确的用户名密码,则执行include方法,界面显示:include包含。 登录成功!并且地址栏地址未改变,若是输入错误登录名或者密码,界面显示:登录失败! 并且地址栏地址改变。其中要注意的是sendRedirect方法中在要跳转的页面url前必须加上当前web程序路径名,这个路径通过request.getContextPath()可以得到。

 

登录时输入正确信息,则跳转的页面地址不变,显示:登录成功!不包含url中的内容。

如果把其中include方法改为forward方法:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. RequestDispatcher dispatcher=request.getRequestDispatcher("/success");  
  2. dispatcher.forward(request, response);   




 登录时输入正确信息,则跳转的页面地址不变,显示:登录成功!不包含url中的内容。


登录时输入错误信息,则跳转的页面地址改变,显示:登录失败!包含url中的内容。

总结如下:

redirect与include、forward的区别在于是不是同一个Request,redirect会有两次交互。

include与forward的区别在于输出的内容,include包含本身servlet与跳转页面内容的结果,而forward不包含本身servlet的内容。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 吊带长裙有点透怎么办 收割机过桥吐麦怎么办 德牧不吃东西怎么办 摩托车头盔太重怎么办 摩托车头盔起雾怎么办 真皮沙发太软了怎么办 老师硬让换班怎么办 同事经常要换班怎么办 怀孕在家没钱花怎么办 摩托车车把歪了怎么办 摩旅 手机不防水怎么办 头盔镜片花了怎么办 踏板摩托车速度底怎么办 摩托车头盔小了怎么办 房东和租客纠纷怎么办 租客与房东纠纷怎么办 乙肝打了瘦脸针怎么办 去绣水搞到手上痛怎么办 脚破了皮很痛怎么办 脚被车撞了肿了怎么办 ps4光盘花了怎么办 耳后总是长孑子怎么办 孩孑高三总是玩手机怎么办 摩托车被收了怎么办 摩托车的手续都怎么办 摩托车罚单掉了怎么办 行人遇到黄灯该怎么办 长辈借钱不还怎么办 不绣刚电梯轿壁有凹槽怎么办 电梯下限位故障怎么办 卫生间夏天太热怎么办 07大檐帽变形了怎么办 税务局不批发票怎么办 进项发票太多了怎么办 发票报销联丢失怎么办 发票领用簿没有怎么办 发票购买本遗失怎么办 销售方遗失发票怎么办 增值税发票发票联丢失怎么办 苹果购买发票丢失怎么办 空白增值税发票发票丢失怎么办