Java Servlet API中的forward()方法和redirect()方法的区别
forward():是容器中控制权的转让,在客户端浏览器地址栏不会显示转向后的地址。forward会将 request state、bean、等信息带到下一个jsp页面;使用getAttribute()来取得前一个jsp所放的信息。默认的都是采用forward方法。
redirect():重定向,浏览器将会得跳转的地址,并重新发送请求链接。从浏览器的地址栏里可以看到跳转后的地址信息。redirect()可以避免表单的重复提交,对当前页面进行刷新时只是相当于重新去数据库去了一次数据,而不是从新发送一个servlet请求。
所以前者更加高效,并且有助于隐藏实际的链接。但是却会带来表单的重复提交
而后者redirect等于客户端向服务器端发出两次request,因此上一个jsp的信息不被保留。但是当我们需要重新定向到另一台服务器上面时,则必须使用redirect()方法来实现。
总结:技巧: 其实,通过浏览器就可以观察到服务器端使用了那种请求转发方式,当单机某一个超链接时,浏览器的地址栏会出现当前请求的地址,如果服务器端响应完成以后,发现地址栏的地址变了,则证明是间接的请求转发。相反,如果地址没有发生变化,则代表的是直接请求转发或者没有转发。
深入(分析理解)
转发过程
客户首先发送一个请求到服务器端,服务器端发现匹配的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了。
Java Servlet API中的forward()方法和redirect()方法的区别相关推荐
- BeautifulSoup中的.text方法和get_text()方法的区别
转自https://www.crifan.com/python_beautifulsoup_string_vs_text/ [背景] 是别人问我的: BeautifulSoup 4中,soup.str ...
- java——Scanner中nextLine()方法和next()方法的区别
遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...
- Java 8 辣么大(lambda)表达式不慌之—–(四)示例-Collectors中的中的joining 方法和mapping方法
Java 8 辣么大(lambda)表达式不慌之-–(四)示例-Collectors中的joining 方法和mapping方法 joining 方法 mapping方法 先定义好后面做示例要用的数据 ...
- 浅谈BufferedReader中的read()方法和readLine()方法
浅谈BufferedReader中的read方法和readLine方法 前言:本人比较菜啦,如果有错误,还请大佬指正. 1. read方法 查看API文档我们可以发现BufferedReader类中的 ...
- Java Persistence API中的FetchType LAZY和EAGER之间的区别?
我是Java Persistence API和Hibernate的新手. Java Persistence API中的FetchType.LAZY和FetchType.EAGER什么区别? #1楼 我 ...
- asp.net TemplateField模板中的Bind方法和Eval方法
TemplateField模板中为了能够有限制的或者取出数据库中某列的值时,可以用Bind和Eval方法来实现.以下是Bind方法的格式,Eval的格式也是和Bind一样的. Bind("列 ...
- Java并发编程—schedule方法和scheduleAtFixedRate方法的区别
原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...
- ExtJS中listener方法和handler方法的区别
listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...
- python predict_对Keras中predict()方法和predict_classes()方法的区别说明
1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...
最新文章
- 《Science》基因组比对的革命性技术
- redhat 禁止selinux步骤
- Jsp-request与requestScope的区别
- 昨天服务器出现问题,解决过程如下所述
- 动态规划——01背包问题
- vb.net form 最大化按钮 代码_【React】利用antd的form自定义表单控件
- html放缩都让内容处于正中间
- CMFCTabCtrl 切换页面闪烁问题
- 端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)
- 使用Hibernate加载或保存图像-MySQL
- JAVA TCP通信练习
- python所有变量更新_在python中,如何动态更新变量?
- 魅族16T刚发布就被锤!德国莱茵TÜV:它没通过我的认证
- [心跳] 互联网推送服务原理:长连接+心跳机制
- 绝了!RNN 还会写藏头诗!
- 聊聊ConcurrentHashMap
- CCF论文会议 IEEE 如何查询某个会议期刊的所有文章
- matplotlib.colors(ListedColormap)
- 托福高频真词List17 // 附托福TPO阅读真题
- 面包板入门电子制作(class1)视频 全套30集高清
热门文章
- 前端学习(1797):前端调试之css伪元素
- oracle之单行函数之分组函数
- 前端学习(512):两列布局的第一种方式的优缺点
- sqlserver:(2):window下SQL server数据库数据源的配置
- java学习(84):object常用方法tostring,equals,hashcode
- Linux 源码编译安装过程-以安装XZ解压为例
- o_rdonly_O_RDWR, O_CREAT等open函数标志位在哪里定义? | 学步园
- 三个不等_2道真题,讲透「基本不等式」的使用原则 | 真题精讲-11
- 儿童学文字编程python_手把手教你python数字知识
- Pro ASP.NET 4 CMS