Java_Servlet笔记:转发与重定向
2016-03-27 15:44
369 查看
在Servlet中调用转发、重定向的Java代码如下:
转发
重定向
简单的举个例子来说:
**重定向的过程:**A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己无法完成,就立即告诉A情况,并向A推荐C可以完成该项工作,于是A就找C帮忙,C最终完成该项工作,返回给A。
**转发的过程:**A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己完成不了,于是B请C帮忙,C接收到B的请求后最终完成了该项工作,并把最后的结果返回给A。此过程A只发送了一次请求给B,A只知道把请求发给B,至于B是怎么完成的A并不关心,他只等待最终的结果。
![](http://img.blog.csdn.net/20160327162508803)
由此呢,我们也可以看到转发和重定向之间的区别,
1、表面区别:浏览器地址栏显示不同
无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;
如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址,当然,这只是表面上看到的不同地方。
2、本质区别:组件之间可否共享信息不同
从本质上来讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每次请求可以访问他之前请求中的参数和属性的值。
而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。
3、实现方式的不同
3.1、请求转发的实现步骤:
1)说明将要转发的资源
2)获取请求转发的对象
3)调用请求转发对象中的forward()方法
综合:
3.2、重定向的实现步骤
1)说明要重定向的资源;
2)调用response对象中sendRedirect方法
综合:
4、知情人不同
请求转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给了哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。
而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当然WEB服务器也很明白。
总结:
什么情况下使用重定向,什么情况下请求转发,这个不是看我们的习惯,而是什么情况下必须用什么;
重定向:之前的request中存放的变量全部失效并进入一个新session的作用域;
转发:之前的request中存放的变量没有失效,就想把两个页面拼在一起。
转发
request.getRequestDispatcher("new.jsp").forword(req,res);//转发到new.jsp
重定向
response.sendRedirect("new.jsp");//重定向到new.jsp
简单的举个例子来说:
**重定向的过程:**A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己无法完成,就立即告诉A情况,并向A推荐C可以完成该项工作,于是A就找C帮忙,C最终完成该项工作,返回给A。
**转发的过程:**A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己完成不了,于是B请C帮忙,C接收到B的请求后最终完成了该项工作,并把最后的结果返回给A。此过程A只发送了一次请求给B,A只知道把请求发给B,至于B是怎么完成的A并不关心,他只等待最终的结果。
由此呢,我们也可以看到转发和重定向之间的区别,
1、表面区别:浏览器地址栏显示不同
无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;
如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址,当然,这只是表面上看到的不同地方。
2、本质区别:组件之间可否共享信息不同
从本质上来讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每次请求可以访问他之前请求中的参数和属性的值。
而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。
3、实现方式的不同
3.1、请求转发的实现步骤:
1)说明将要转发的资源
String forward ="/a.jsp";
2)获取请求转发的对象
RequestDispatcher rd = request.getRequestDispatcher(forward);
3)调用请求转发对象中的forward()方法
rd.forward(request,response);
综合:
request.getRequestDispatcher("/a.jsp").forward(request,response);
3.2、重定向的实现步骤
1)说明要重定向的资源;
String resource = request.getContextPath()+"/a.jsp";
2)调用response对象中sendRedirect方法
response.sendRedirect(resource);
综合:
response.sendRedirect(request.getContextPath()+"/a.jsp");
4、知情人不同
请求转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给了哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。
而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当然WEB服务器也很明白。
总结:
什么情况下使用重定向,什么情况下请求转发,这个不是看我们的习惯,而是什么情况下必须用什么;
重定向:之前的request中存放的变量全部失效并进入一个新session的作用域;
转发:之前的request中存放的变量没有失效,就想把两个页面拼在一起。
相关文章推荐
- Spring的设计目标
- 【转】spring - ioc和aop
- Java中LinkedList原理解析
- java.lang.InstantiationException
- 快速排序(java)
- 【Android】Eclipse自动编译NDK/JNI的三种方法
- eclipse设置打印GC
- 详解spring-MVC DispatcherServlet运行
- java线程同步——CountDownLatch
- Java-LinkedHashMap源码解读
- Java接受输入参数
- 【Java解惑】表达式问题
- Spring注解事务的学习
- spring的AOP
- MyEclipse------快速写入内容到指定目录下的文件(字节输出流)
- java事务学习笔记(七)--像Spring一样使用Transactional注解(Annotation)
- 关于“单元组”数量的计算
- RxJava使用场景小结
- Spring学习笔记(二)
- Java-HashSet源码解读