深入浅出Java 重定向和请求转发的区别

来源:互联网 发布:清华同方录音笔软件 编辑:程序博客网 时间:2024/05/01 05:16

接上文,聪明的你肯定会发现上篇文章的这个内容,见Servlet控制层代码:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:FangSong_GB2312;font-size:18px;">import java.text.*;  
  2. import java.util.*;  
  3. import java.io.*;  
  4. import javax.servlet.http.*;  
  5. import javax.servlet.*;  
  6.   
  7. import com.bjpowernode.exam.model.*;  
  8. import com.bjpowernode.exam.manager.*;  
  9.   
  10. public class SearchStudentServlet extends HttpServlet {  
  11.   
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)   
  13.     throws ServletException, IOException {  
  14.         doPost(request, response);  
  15.     }  
  16.       
  17.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  18.     throws ServletException, IOException {  
  19.           
  20.         String sBeginDate = request.getParameter("beginDate");  
  21.         String sEndDate = request.getParameter("endDate");  
  22.           
  23.         Date beginDate = new Date();  
  24.         Date endDate = new Date();  
  25.         try {  
  26.             beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(sBeginDate);  
  27.             endDate = new SimpleDateFormat("yyyy-MM-dd").parse(sEndDate);  
  28.          }catch(Exception e) {  
  29.             e.printStackTrace();           
  30.          }     
  31.           
  32.         StudentManager studentManager = new StudentManagerImpl();  
  33.         List<Student> studentList = studentManager.findStudentList(beginDate, endDate);  
  34.           
  35.         //将学生列表设置到requet范围中  
  36.         //request.setAttribute("student_list", studentList);  
  37.           
  38.         //转发,转发是在服务器端转发的,客户端是不知道的  
  39.         //request.getRequestDispatcher("/student_list.jsp").forward(request, response);  
  40.           
  41.           
  42.         //将studentList放到session中  
  43.         HttpSession session = request.getSession();  
  44.         session.setAttribute("student_list", studentList);  
  45.           
  46.         //重定向,不会共享request  
  47.         //以下写法错误,该 "/"代表了8080端口  
  48.         //response.sendRedirect("/student_list.jsp");  
  49.         response.sendRedirect(request.getContextPath() + "/student_list.jsp");  
  50.     }  
  51. }</span>  

这个里面尝试了两种调到后面的Jsp方法,在servlet中调用转发、重定向的语句如下:


    实现转发:


[html] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:FangSong_GB2312;font-size:18px;">//转发,转发是在服务器端转发的,客户端是不知道的  
  2. request.getRequestDispatcher("/student_list.jsp").forward(request, response);</span>  


分析:请求转发是服务器内部把对一个request/response的处理权,移交给另外一个对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。


    实现重定向:


[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:FangSong_GB2312;font-size:18px;">//重定向,不会共享request  
  2. //以下写法错误,该 "/"代表了8080端口  
  3. response.sendRedirect("/student_list.jsp");  
  4. response.sendRedirect(request.getContextPath() + "/student_list.jsp");</span>  



深入(分析理解)


    转发过程


    客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。


    重定向过程

    客户发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。


浅出(表象)


    转发

    当用RequestDispatcher请求转发后,地址栏为http://localhost:8080/test/TestServlet
这真好应正了上面的分析,我们起初请求的就一个servlet,至于你服务器端怎么转,流程怎么样的,我客户端根本就不知道,我发了请求后我就等着响应,那你服务器那边愿意怎么转就怎么转,我客户端不关心也没法知道,所以当服务器端转发到jsp后,它把结果返回给客户端,客户端根本就不知道你这个结果是我真正访问的servlet产生的,还是由servlet转发后下一个组件产生的。

    重定向

    当用sendRedirect重定向后,地址栏为http://localhost:8080/test/student_list.jsp
因为这个时候,客户端已经知道了他第二次请求的是student_list.jsp,服务器已经告诉客户端要去访问student_list.jsp了,所以地址栏里会显示想要访问的结果。


总结


转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢

转发的是同一次请求;重定向是两次不同请求

转发不会执行转发后的代码;重定向会执行重定向之后的代码

转发地址栏没有变化;重定向地址栏有变化

转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成


    Forward是在服务器端的跳转,就是客户端一个请求发给服务器,服务器直接将请求相关的参数的信息原封不动的传递到该服务器的其他jsp或servlet去处理,而sendredirect是在客户端的跳转,服务器会返回给客户端一个响应报头和新的URL地址,原来的参数什么的信息如果服务器端没有特别处理就不存在了,浏览器会访问新的URL所指向的servlet或jsp,这可能不是原先服务器上的webservce了。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 海水腐蚀的手机怎么办 买回来海胆苦怎么办 被海胆刺了怎么办 长刺海胆刺伤怎么办 耳钉容易掉怎么办 皮球鱼产卵了怎么办 孩子在家太孤独怎么办 宝宝老是挠头是怎么办 猫脸花浇水多了怎么办 夏天钓鲫鱼小杂鱼闹窝怎么办 家里养花生虫子怎么办 生鸡蛋拌饭怎么办 出柜家里人会怎么办 百灵鸟怕人撞笼怎么办 乌鸫雏鸟撞笼返生怎么办 泥石流来了怎么办教案 墙壁插座不通电怎么办 当前目录不能用怎么办 海鲜过敏怎么办没有药 哺乳后胸变小怎么办 有脑出血前兆该怎么办 体检发现甲状腺结节怎么办 月子里宝宝感冒怎么办 10天新生儿感冒怎么办 20天新生儿感冒怎么办 新生儿20天鼻塞怎么办 25天新生儿感冒怎么办 42天新生儿感冒怎么办 上呼吸道感染怎么办比较好 小猫咪太调皮怎么办 水晶彩泥弄到衣服上怎么办 进境动植物检疫许可怎么办 跳舞不会听拍子怎么办 税盘丢了注销公司怎么办 认缴资金不到位怎么办 同一单元有凶宅怎么办 有地皮没房产证怎么办 社保资金被侵吞怎么办? 集体计件手脚慢怎么办 发票当月没用完怎么办 非工业用地怎么办环评