社区
Web 开发
帖子详情
RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
hongseyouyang
2010-09-03 01:53:22
这两个方法有什么区别? 具体是怎么回事?
getServletContext().getRequestDispatcher("/xxxx.jsp");
这句话什么意思????
...全文
3878
15
打赏
收藏
RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
这两个方法有什么区别? 具体是怎么回事? getServletContext().getRequestDispatcher("/xxxx.jsp"); 这句话什么意思????
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
nvrenbumeigaga
2010-09-03
打赏
举报
回复
[Quote=引用楼主 hongseyouyang 的回复:]
这两个方法有什么区别? 具体是怎么回事?
getServletContext().getRequestDispatcher("/xxxx.jsp");
这句话什么意思????
[/Quote]
#1就已经很通俗了。顶下,学习了
hongseyouyang
2010-09-03
打赏
举报
回复
response.sendRedirect是重定向
request.getRequestDispatcher().forward是请求转发
Servlet中的两种跳转方法:
方法一:response.sendRedirect("../success.jsp")
利用这个方法如果跳转前有request.setAttribute("a","b")的话,那么参数是传不到success.jsp,因为它在客户端重定向到success.jsp了,本质上跳了2次。所以参数失效,使用这个的时候会发现浏览器的URL地址发生了变化。
方法二:RequestDispatcher rd = getServletContext().getRequestDispatcher("/login.jsp"); rd.forward(request,response); 利用这个方法跳转,参数可以被正确传送,而且效率比第一种高,IE的URL地址不变。
最简单的区别:
一个地址栏会变
一个地址栏不变
2:
一个能保持同一个 request
一个保存不了
yearnqiao
2010-09-03
打赏
举报
回复
RequestDispatcher.forward
一次请求
转发
参数可从开始到最后
地址栏会改变
例如:我给你一个东西给你,你告诉我说给错了,但是你帮我传给我另外一个人
HttpServletResponse.sendRedirect
多次请求
重定向
参数只带一步就没了
地址栏不会改变
例如:我给你一个东西给你,你告诉我说给错了,并且又把那东西还给我,让我自己再去给另外一个人
hongseyouyang
2010-09-03
打赏
举报
回复
[Quote=引用 5 楼 yusixdou 的回复:]
就是说一个能传递request参数 一个不能
[/Quote]
什么意思????
lnner
2010-09-03
打赏
举报
回复
通俗的说:response.sendRedirect("");请求地址会改变
request.getRequestDispatcher("");地址不会变
zhminghu
2010-09-03
打赏
举报
回复
一个在地址栏看得到,一个在地址栏看不到
super_stan
2010-09-03
打赏
举报
回复
(1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
(2)调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
(3)HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器 ”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复,“ 浏览器”也知道他借到的钱出自李四之手。RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。
(4)RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。
(5)无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。
这个系统吗?
jason69181
2010-09-03
打赏
举报
回复
Sendredirect
1.是不同的request
2.send后的语句会继续执行,除非return
3.速度慢
4.需要到客户端的往返,可以转到任何页面,
5.地址栏有变化
6.可以传参数,直接写在url后面
/代表的是http://127.0.0.1/
<%response.sendRedirect("/test/ServletToJSP");%>
<form action="/test/ServletToJSP">
<a href="/test/ServletToJSP">test</a>
Forward
1.虽然是不同的对象,但是,可以取到上一个页面的内容
2.forward后的语句不会继续发送给客户端
3.速度快
4.服务器内部转换,
5.地址栏没有变化
6.可以传参数
/代表的是http://127.0.0.1/test
this.getServletContext().getRequestDispatcher ("/servlet_jsp/ServletUseJsp.jsp")
.forward(req, resp);
并且只能以/开头
javabm
2010-09-03
打赏
举报
回复
1.RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递. 但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个页面. 重定向后浏览器地址栏URL不变.
例:在servlet中进行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html; charset=gb2312");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp"); //定向的页面
rd.forward(request, response);
}
通常在servlet中使用,不在jsp中使用。
2.response.sendRedirect() 是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件. 重定向后在浏览器地址栏上会出现重定向页面的URL
例:在servlet中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html; charset=gb2312");
response.sendRedirect("/index.jsp");
}
由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。 注意:
(1).使用response.sendRedirect时,前面不能有HTML输出。 这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的 HTML输出也是允许的。
(2).response.sendRedirect之后,应该紧跟一句return; 我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
比较:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。 前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法. 注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。
javabm
2010-09-03
打赏
举报
回复
getRequestDispatcher("/xxxx.jsp").forward(request,response);
取得Servlet上下文,并根据给出的path将请求转移到令一个处理单元,主要完是成请求转移和分发的功能.
yusixdou
2010-09-03
打赏
举报
回复
就是说一个能传递request参数 一个不能
kaida_7
2010-09-03
打赏
举报
回复
[Quote=引用 1 楼 hijiankang 的回复:]
RequestDispatcher.forward()是服务器端跳转 response.sendRedirect()是客户端跳转
[/Quote]
服务器端跳转的话,你的浏览器上的URL是不会改变的,比如你请求的是一个LoginServlet,要登入到main.jsp,这样的话,你的浏览器的url还是LoginServlet,
而客户端跳转的话,你的URL会是你要跳转去的页面地址:main.jsp;
服务器端跳转,同用一个request,而客户端跳转则不能共用一个request。。。。
jinggangy
2010-09-03
打赏
举报
回复
RequestDispatcher.forward()是服务器端跳转,跳转是同一个request。response.sendRedirect()是客户端跳转,是告诉浏览器重新发送请求的地址,浏览器会重新发送一个request
hongseyouyang
2010-09-03
打赏
举报
回复
有没有通俗的具体解释一下。。。。。
hijiankang
2010-09-03
打赏
举报
回复
RequestDispatcher.forward()是服务器端跳转 response.sendRedirect()是客户端跳转
java中dispcter和
forward
的
区别
dispcter和
forward
的
区别
RequestDispatcher
.
forward
()
方法
和
Http
Servlet
Response
.
send
Redirect
()
方法
的
区别
是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.
forward
()
方法
,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用
Http
Servlet
Response
.
send
Request()
方法
。 1、
forward
与include共亨Request范围内的对象,而
redirect
则不行,即:如果一个javabean被声明为request范围的话,则被
forward
到的资源也可以访问这个javabean,而redriect则不行。2、
forward
与include基本上都是转发到context内部的资源,而
redirect
可以重定向到外部的资源,如: req.
send
Redriect
转发与重定向
区别
尽管
Http
Servlet
Response
.
send
Redirect
方法
和
RequestDispatcher
.
forward
方法
都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的
区别
。下面是
Http
Servlet
Response
.
send
Redirect
方法
实现的请求重定向与
RequestDispatcher
.
forward
方法
实现的请求转发的总结比较
jsp跳转的五种方式
实现jsp页面间的跳转 public void doPost(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception,IOException {
response
.setContentType("text/html; charset=gb2312");
Servlet
Context sc = get
Servlet
Context();
RequestDispatcher
rd = null; rd = sc.get
RequestDispatcher
("/index.jsp"); //定向的页面 rd.
forward
(request,
response
); } 通常在
servlet
中使用,不在jsp中使用。 2.
response
.
send
Redirect
() 是在用户的浏览器端工作,
send
Redirect
()可以带参数传递,比如
servlet
?name=frank传至下个页面,同时它可以重定向至不同的主机上,
send
Redirect
()可以重定向有frame.的jsp文件. 重定向后在浏览器地址栏上会出现重定向页面的URL 例:在
servlet
中重定向 public void doPost(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception,IOException {
response
.setContentType("text/html; charset=gb2312");
response
.
send
Redirect
("/index.jsp"); } 由于
response
是jsp页面中的隐含对象,故在jsp页面中可以用
response
.
send
Redirect
()直接实现重定位。 注意: (1) 使用
response
.
send
Redirect
时,前面不能有HTML输出 这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说 JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用
send
Redirect
之前,有少量的HTML输出也是允许的。 (2)
response
.
send
Redirect
之后,应该紧跟一句return; 我们已经知道
response
.
send
Redirect
是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。 比较: (1) Dispatcher.
forward
()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址; (2)
response
.
send
Redirect
()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。 前者更加高效,在前者可以满足需要时,尽量使用
RequestDispatcher
.
forward
()
方法
. 注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用
Http
Servlet
Response
.
send
Request()
方法
。 3. 它的底层部分是由
RequestDispatcher
来实现的,因此它带有
RequestDispatcher
.
forward
()
方法
的印记。 如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。 另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交 4.修改
HTTP
header的Location属性来重定向 通过设置直接修改地址栏来实现页面的重定向。 jsp文件代码如下: 5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面 在html文件中,下面的代码:
http-e
jsp跳转get
RequestDispatcher
()和
send
Redirect
()的
区别
1.request.get
RequestDispatcher
()是请求转发,前后页面共享一个request ;
response
.
send
Redirect
()是重新定向,前后页面不是一个request。 2.
RequestDispatcher
.
forward
()是在服务器端运行;
Http
Servlet
Response
.
send
Redirect
()是通过向客户浏览器发送命令来完成.所以
RequestDispatcher
.
forward
()对于浏览器来说是“透明的”;而
Http
Servlet
Response
.
send
Redirect
()则不是。 3.
Servlet
Context.getRequest
数据库测试test.sql
package com.bjsxt.
servlet
; import com.bjsxt.entity.User; import com.bjsxt.service.UserService; import com.bjsxt.service.impl.UserServiceImpl; import javax.
servlet
.
RequestDispatcher
; import javax.
servlet
.
Servlet
Context; import javax.
servlet
.
Servlet
Exception; import javax.
servlet
.
http
.*; import java.io.IOException; import java.net.URLEncoder; import java.sql.Date; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class User
Servlet
extends Base
Servlet
{ // @Override // protected void service(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception, IOException { // //解决POST表单的中文乱码问题 // request.setCharacterEncoding("utf-8"); // //接收method属性的值 // String methodName = request.getParameter("method"); // // //根据method属性的值调用相应的
方法
// if("login".equals(methodName)){ // this.login(request,
response
); // }else if("register".equals(methodName)){ // this.register(request,
response
); // }else if("logout".equals(methodName)){ // this.logout(request,
response
); // } // // } public void show(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception, IOException { //获取表单的数据 String userId = request.getParameter("userId"); if(userId == null){ userId = ""; } String strAge = request.getParameter("minAge"); int minAge = 0; try{ minAge = Integer.parseInt(strAge); //"12" "abc" }catch(NumberFormatException e){ e.printStackTrace(); } //调用业务层完成查询操作 UserService userService = new UserServiceImpl(); //List
userList = userService.findAll(); List
userList = userService.find(userId,minAge); //List
userList = null; //List
userList = new ArrayList
(); //跳转到show.jsp显示数据 request.setAttribute("userId",userId); request.setAttribute("minAge",strAge); request.setAttribute("ulist",userList); request.get
RequestDispatcher
("/admin/show.jsp").
forward
(request,
response
); } public void logout(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception, IOException { //结束当前的session request.getSession().invalidate(); //跳转回登录页面
response
.
send
Redirect
(request.getContextPath()+"/admin/login.jsp"); } public void register(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception, IOException { //request.setCharacterEncoding("utf-8"); //1.接收来自视图层的表单数据 String userId = request.getParameter("userId"); String realName = request.getParameter("realName"); String pwd = request.getParameter("pwd"); String rePwd = request.getParameter("repwd"); int age = Integer.parseInt(request.getParameter("age"));// "23" String [] hobbyArr = request.getParameterValues("hobby"); String strDate = request.getParameter("enterDate");//"1999-12-23" Date enterDate = Date.valueOf(strDate); //util.Date SimpleDateFormat //判断两次密码是否相同 if(pwd == null || !pwd.equals(rePwd)){ request.setAttribute("error","两次密码必须相同"); request.get
RequestDispatcher
("/admin/register.jsp").
forward
(request,
response
); return; } //2.调用业务层完成注册操作并返回结果 User user = new User(userId,realName,pwd,age, Arrays.toString(hobbyArr),enterDate); UserService userService = new UserServiceImpl(); int n = userService.register(user); //3.根据结果进行页面跳转 if(n>0){
response
.
send
Redirect
(request.getContextPath()+"/admin/login.jsp"); }else{ request.setAttribute("error","注册失败"); request.get
RequestDispatcher
("/admin/register.jsp").
forward
(request,
response
); } } public void login(
Http
Servlet
Request request,
Http
Servlet
Response
response
) throws
Servlet
Exception, IOException { //解决POST表单的中文乱码问题 //request.setCharacterEncoding("utf-8"); //获取用户名和密码 request 内建对象 请求 String username = request.getParameter("username"); String password = request.getParameter("password"); String rememberme = request.getParameter("rememberme"); //调用下一层判断登录是否成功,并返回结果 //进行服务器端的表单验证 if(username ==null || "".equals(username)){ request.setAttribute("error","用户名不能为空JSP"); request.get
RequestDispatcher
("/admin/login.jsp").
forward
(request,
response
); return; } if (username.length()<=6){ request.setAttribute("error","用户名长度必须大于6JSP"); request.get
RequestDispatcher
("/admin/login.jsp").
forward
(request,
response
);//后面语句还会执行 return; //后面的语句不再执行 } // boolean flag = false;//默认失败 // if(username.indexOf("sxt")>=0 || username.contains("尚学堂")){ // flag = true; // } User user = null;//默认登录失败 // UserDao userDao = new UserDaoImpl(); // user = userDao.find(username,password); UserService userService = new UserServiceImpl(); user = userService.login(username,password); //userService.addOrder("shoppingCart"); //输出结果 if(user != null){ //登录成功才记住我 //1.办理会员卡 String username2 = URLEncoder.encode(username,"utf-8"); Cookie cookie1 = new Cookie("uname",username2); Cookie cookie2 = new Cookie("password",password); //2.指定会员卡的作用范围,默认范围是当前目录 /
servlet
/Login
Servlet
/admin/login.jsp //cookie1.setPath("/"); //当前服务器 cookie1.setPath("/my
servlet
2/"); //当前项目 cookie2.setPath("/my
servlet
2"); //3.指定会员卡的作用时间 if("yes".equals(rememberme)){ cookie1.setMaxAge(60*60*24*10); //默认的时间浏览器不关闭的时间;-1 表示一直有效 cookie2.setMaxAge(60*60*24*10); }else{ cookie1.setMaxAge(0); cookie2.setMaxAge(0); } //4.将会员卡带回家
response
.addCookie(cookie1);
response
.addCookie(cookie2); //成功跳转到成功页面 //out.println("登录成功"); // /
servlet
/Login
Servlet
// /
servlet
/success.jsp // request.get
RequestDispatcher
("/admin/success.jsp").
forward
(request,
response
);
Http
Session session = request.getSession(); // session.setAttribute("username",username); session.setAttribute("user",user); //
response
.
send
Redirect
("/my
servlet
2/admin/success.jsp"); //
response
.
send
Redirect
("
http
s://www.bjsxt.com:443/news/11377.html"); //
response
.
send
Redirect
("
http
://localhost:8080/my
servlet
2/admin/success.jsp"); //
response
.
send
Redirect
("/my
servlet
2/admin/success.jsp"); //
response
.
send
Redirect
("/my
servlet
2/admin/success.jsp"); //
response
.
send
Redirect
(request.getContextPath()+"/admin/success.jsp"); //
http
://192.168.58.250:8080/my
servlet
2/
servlet
/Login
Servlet
//
http
://192.168.58.250:8080/my
servlet
2/admin/success.jsp //登录成功后,网站的访问人数+1 //1.获取当前的访问人数
Servlet
Context context = this.get
Servlet
Context(); Integer count2 = (Integer) context.getAttribute("count"); //2.人数+1 if(count2 == null){ //第一个用户 count2 = 1; }else{ count2++; } //3.再存放到application作用域中 context.setAttribute("count",count2); //
http
://192.168.58.250:8080/my
servlet
2/
servlet
/admin/success.jsp
response
.
send
Redirect
("../admin/success.jsp"); }else{ //失败跳转回登录页面 //out.println("登录失败"); request.setAttribute("error","用户名或者密码错误"); //
RequestDispatcher
rd = request.get
RequestDispatcher
("/admin/login.jsp"); // rd.
forward
(request,
response
); //
RequestDispatcher
rd = request.get
RequestDispatcher
("
http
://localhost:8080/my
servlet
2/admin/login.jsp"); //
RequestDispatcher
rd = request.get
RequestDispatcher
("/admin/login.jsp"); //
http
://192.168.58.250:8080/my
servlet
2/
servlet
/admin/login.jsp
RequestDispatcher
rd = request.get
RequestDispatcher
("../admin/login.jsp"); rd.
forward
(request,
response
); } } }
Web 开发
81,094
社区成员
341,711
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章