HttpServlet RequestDispatcher sendredirect和forward
RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。RequestDispatcher接口中定义了两个方法:include/forward
由于<jsp:include>只能指定固定的jsp文件名,不能动态指定jsp文件名。我们需要把<jsp:include>翻译为Javacode – RequestDispatcher.include();
用法:
<% request.getRequestDispatcher(filename).include(request, response); />
服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法.
HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如response.sendRedirect("http: //Java.sun.com")也可以使用相对的URL。如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置 HTTP响应头信息的实现。
RequestDispatcher.forward()方法将当前的request和response重定向到该 RequestDispacher指定的资源。这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。这样看起来类似于Servlet链的功能,但是还有一些区别。一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。 include()方法将把Request Dispatcher资源的输出包含到当前输出中。
注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。否则将抛出一个IllegalStateException异常。
简单用法:
RequestDispatcher rd;
rd = getServletContext().getRequestDispatcher("/Expired.jsp");
rd.forward(request,response);
SendRedirect 和 forward 区别
SendRedirect | Forward |
---|---|
不同的request | 不同的对象,但是可以取到上一个页面的内容 |
send后面的语句会继续执行,除非return | Forward后面的语句不会继续发送给客户端 |
速度慢 | 速度快 |
需要到客户端的往返,可以跳转到任何页面 | 服务器内部转换 |
地址栏有变化 | 地址栏没有变化 |
可以传参数,直接写在URL后面 | 可以传参数 |
“/” 代表的是http://127.0.0.0/ <%response.sendRedirect();%> |
“/” 代表的是 http://127.0.0.1/test this.getServletContext().getRequestDispatcher |
-
ITeye sendRedirect和forward原理及区别总结
ITeye forward与sendRedirect区别
CSDN forward和sendRedirect的区别
HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源。
sendRedirect实现请求重定向,forward实现的是请求转发。
在web服务器内部的处理机制也是不一样的。
1.forward方法只能转发给同一个web站点的资源,而sendRedirect方法还可以定位到同一个web站点的其他应用,甚至可以通过传入绝对路径定位到别的web站点,这事forward的方法所不能比拟的优势。
可以看到这两种方法的用法,如果传给RequestDispatcher 的参数以"/"开头,则访问的是当前web应用的根目录
加入当前web的根目录是myweb。如果传给sendRedirect方法以"/"开头,访问的是整个web站点的根目录。
- RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
- rd.forward(request, response);
- response.sendRedirect("/index.jsp");

2.forward重定向后,浏览器url地址不变,sendRedirect转发后,浏览器url地址变为目的url地址。
3. 使用forward重定向的过程,是浏览器先向目的Servlet发送一次Request请求,然后再服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回Response到浏览器端。浏览器和服务器一次请求响应。
使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。浏览器和服务器两次请求响应。
4. forward方法的调用者与被调用者之间共享Request和Response
sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。
如果使用request.setAttribute传递一些属性就需要用forward,如果想要跳转到别的应用的资源,就需要用sendRedirect。
5.无论是forward方法还是sendRedirect方法调用前面都不能有PrintWriter输出到客户端。
forward方法报错: Java.lang.IllegalStateException: Cannot forward after response has been committed
sendRedirect报错:java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
----------------------------------------------------------------------------------------------------------------------------------------------
SendRedirect() 与 Forward() 区别
Respose.sendRedirect()
Request.getRequestDispacher().forward()
sendRedirece() Forward()
属于不同的请求 属于同一请求
重定向后地址栏发生变化 重定向后地址栏不变
重定向可转到本WEB程序以外 重定向只能在本WEB程序内
“/”:表示服务器根目录 “/”:web程序根目录
网路摘录:
1.sendRedirect 和forward的区别
简而言之,sendRedirect()相当于做一次客户端跳转,而forward则是服务端跳转。
sendRedirect是由浏览器来做的事情。当调用sendRedirect,服务端返回一个response,里面包含了跳转的内容,由浏览器获得后,进行跳转,我们可以看到浏览器中的URL是改变的。而forward则是在服务端直接做的事情,浏览器并不知道,这也就是为什么forward后浏览器的URL还是保持不变的原因。
2.实现页面跳转的方法
方式1: <jsp:forward>
jsp:forward 是一种JSP动作,使用语法如下:
CODESTYLE:<jsp:forward page="Relative URL">
在使用此动作时,主页不可以有任何的输出,它所起到的作用与SERVLET中使用的RequestDispatcher方法的作用是一致的.这种跳转是由服务器执行的,因此跳转的页面可以放在WEB-INF目录中,提高程序的安全性.
方式2 response.sendRedirect()
用此方法做跳转其实是向浏览器发送一个特殊的HEADER,然后又浏览器来做转向,装到指定的页面.所以用此方法时,浏览器上的地址栏里可以明显看到地址的变化.这与方式1动作不同,它是由服务器来做转向的.因此,使用sendRedirect做转向时,转向的页面不能放在WEB-INF下.
方式3 使用页面自动刷新
代码如下: CODESTYLE:<meta http-equiv="Refresh" content="秒数";url="跳转的文件或者地址">
方式4 请求转发与重定向
jsp:forword 是转发请求,所以在转发过程中,请求作用域的参数在转发页面是有效的response.sendRedirect 和页面刷新实际上都是重定向,所以请求作用域的参数在转到下一页面时回失效.
HttpServlet RequestDispatcher sendredirect和forward的更多相关文章
- java 中sendredirect()和forward()方法的区别
一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...
- sendRedirect和forward区别
参考来源:http://www.educity.cn/develop/158970.html 12.6.4 sendRedirect()和forward()方法的区别 HttpServletResp ...
- sendredirect()和forward()的区别 (转)
sendRedirect() 和forward()的区别 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应UR ...
- sendRedirect()和forward()方法的区别
sendRedirect()和forward()方法的区别 之前好像曾经整理过,但忘了放在哪里了,好像压根就没整理过,博客里也没有,故今天重新整理一下. 我们知道页面之间的跳转有两种方式:重定向与转发 ...
- SendRedirect和forward差分
(1)重定向JSP实现JSP/Servlet跳转到目标资源的方法中,基本的想法是:server目标资源完成URL通过HTTP 在回答本报发client浏览器.收到的浏览器URL更新到地址栏后,而目标资 ...
- Servlet跳转方式sendReDirect()和forward()
在web应用服务中,经常会面对不同SERVLET之间的跳转,目前我们可以通过以下两种方式实现: 1.RequestDispatcher.forward() 2.ServletResponse.send ...
- 【javaWeb】sendRedirect和forward原理及区别总结
一.原理. 1. Forward 该图的交互过程如下: ① 浏览器访问Servlet1. ② Servlet1想让Servlet2对客户端的请求进行响应,于是调用forward()方法 ...
- jsp/servlet 中sendRedirect,include,forward区别
1 sendRedirect response.sendRedirect(); 服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求新的地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以sess ...
- JSP页面跳转之sendRedirect()与forward()辨析
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6044817.html 在JSP中,要实现页面的跳转,主要有两种方式实现:forward和sendRedire ...
随机推荐
- auth_basic 认证
shell > yum -y install httpd-tools # 安装 htpasswd 工具 shell > cd /usr/local/nginx-/conf shell &g ...
- 【C#】.net 导出Excel功能
将DataSet对象导出成Excel文档 一.不带格式控制 void btnExport_Click(object sender, EventArgs e) { IList<string> ...
- Vue简单项目(页面跳转,参数传递)
一.页面跳转 1.和上篇文章一样的建文件的步骤 2.建立成功之后,在src文件夹下面添加新的文件夹pages 3.在pages里面添加新的文件Home.Vue和Detail.Vue 4.设Home.V ...
- Java类的静态块の一
类的静态块在类加载时候执行,执行早于构造函数,并且只执行一次. 下面这个例子可以帮助理解: package untility; public class A { // 静态块 static { A c ...
- uvm_verision——告诉我你几岁了?
uvm_version 定义了UVM相关的版本信息,而具体的uvm_revision则是通过在src/macros/uvm_version_defines.svh实现的. uvm_revision_s ...
- Sublime Text 3 使用小记
快捷键: [ // 代码对齐插件 { "keys": ["shift+alt+a"], "command": "alignment ...
- Linux远程连接及常用指令
一.远程连接 一般,服务器都是特别庞大的,会把它们用一个独立的小屋进行存放,如果有时候需要对服务器进行一些操作,离得近还好,离的远就会破费一些周折了,所以,这个时候我们就需要用到远程连接软件了.推荐使 ...
- debug1: expecting SSH2_MSG_KEX_ECDH_REPLY解决
设置mtu ifconfig en1 mtu 1200 代理工具 退出lantern,退出shadowsocks
- SQLite C/C++ 教程
目录 1安装 2 C/C++ Interface APIs 3连接到数据库 4创建表 5插入操作 6更新操作 7删除操作 安装 在我们开始使用SQLite在C / C++程序,我们需要确保SQLite ...
- java导入Excel表格数据
首先导入Excel数据需要几样东西 第一需要两个依赖包,这里直接是在pom注入依赖 <!--excel--> <dependency> <groupId>org.a ...