javaweb转发和重定向的区别_servlet转发和重定向

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

接上文深入浅出Java MVC(Model View Controller) —- (JSP + servlet + javabean实例)
,聪明的你肯定会发现上篇文章的这个内容,见Servlet控制层代码:


import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; import com.bjpowernode.exam.model.*; import com.bjpowernode.exam.manager.*; public class SearchStudentServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sBeginDate = request.getParameter("beginDate"); String sEndDate = request.getParameter("endDate"); Date beginDate = new Date(); Date endDate = new Date(); try { beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(sBeginDate); endDate = new SimpleDateFormat("yyyy-MM-dd").parse(sEndDate); }catch(Exception e) { e.printStackTrace(); } StudentManager studentManager = new StudentManagerImpl(); List<Student> studentList = studentManager.findStudentList(beginDate, endDate); //将学生列表设置到requet范围中 //request.setAttribute("student_list", studentList); //转发,转发是在服务器端转发的,客户端是不知道的 //request.getRequestDispatcher("/student_list.jsp").forward(request, response); //将studentList放到session中 HttpSession session = request.getSession(); session.setAttribute("student_list", studentList); //重定向,不会共享request //以下写法错误,该 "/"代表了8080端口 //response.sendRedirect("/student_list.jsp"); response.sendRedirect(request.getContextPath() + "/student_list.jsp"); } }


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


    实现转发:


//转发,转发是在服务器端转发的,客户端是不知道的 request.getRequestDispatcher("/student_list.jsp").forward(request, response);


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


    实现重定向:


//重定向,不会共享request //以下写法错误,该 "/"代表了8080端口 response.sendRedirect("/student_list.jsp"); response.sendRedirect(request.getContextPath() + "/student_list.jsp");



深入(分析理解)


    转发过程


    客户首先发送一个请求到服务器端,服务器端发现匹配的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了。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/196127.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 一起学JAVA API Object String StringBuffer/StringBuilder

    一起学JAVA API Object String StringBuffer/StringBuilder1前言亲爱的小伙伴萌,目前我们看到的是Java基础部分的一个新的部分API,这是个啥,又能做啥呢?其实可以概括成一句话:帮助我们站在巨人的肩膀上,实现更加高效的开发,那么我们来一探究竟吧~2什么是APIAPI(ApplicationProgrammingInterface,应用程序接口)是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节.API是一种通用功能集,有时公司会将API作为其公共开放系统,也就是公司制定自己的

  • OpenCv中 width 和 widthStep的区别「建议收藏」

    OpenCv中 width 和 widthStep的区别「建议收藏」前者是表示图像的每行像素数,后者指表示存储一行像素需要的字节数。在OpenCV里边,widthStep必须是4的倍数,从而实现字节对齐,有利于提高运算速度。如果8U单通道图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空着。也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。

  • Spring事务隔离级别与数据库隔离级别不一致时,该以谁为准?

    Spring事务隔离级别与数据库隔离级别不一致时,该以谁为准?项目中,以Spring事务为准,因为他重写了数据库的隔离级别,但没有直接修改数据库的隔离级别

  • Java中&0xFF是什么意思?计算机的原码、补码和反码

    Java中&0xFF是什么意思?计算机的原码、补码和反码公司项目中有向MCU发数据的代码,新来的同事对其中的&0xFF很不理解,我解释了很多遍他还是蒙圈状态,可能我的表达能力太差,想想还是用一篇博客来详细说明吧,代码如下:更新:07月10日,有个小伙伴对这种操作各种不习惯,怎么解释他都想不明白,所以增加了代码注释为什么要加上“&0xFF”?拆分理解下0xFF是16进制的表达方式,F是15;十进制为:255,二进制为:11111111

  • 服务降级的概念及应用手段

    服务降级的概念及应用手段什么是服务降级服务降级,就是对不怎么重要的服务进行低优先级的处理。说白了,就是尽可能的把系统资源让给优先级高的服务。资源有限,而请求是无限的。如果在并发高峰期,不做服务降级处理,一方面肯定会影响整体服务的性能,严重的话可能会导致宕机某些重要的服务不可用。所以,一般在高峰期,为了保证网站核心功能服务的可用性,都要对某些服务降级处理。服务降级手段拒绝服务判断应用来源,高峰时段拒

  • C/C++开发人员要了解的几大著名C/C++开源库[通俗易懂]

    C/C++开发人员要了解的几大著名C/C++开源库[通俗易懂]本文详细讲述C/C++开发人员需要了解的几大著名C/C++开源库。

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号