JAVA学习——forward和sendRedirect区别总结

request.setAttribute()怎么用的?

JSP1代码

String [] test=new String[2];

test[0]="1";

test[1]="2";

request.setAttribute("test",test) ;

response.sendRedirect("jsp2.jsp");

JSP2代码

String test[]=(String[])request.getAttribute("test");

out.print(test);

但在JSP2中会找不到test。

Why?

首先解释一下reques周期:setAttribute用来在同一个request周期中保存变量使用。比如servlet调用后,并调出JSP页面,这是一个request周期,如果要在JSP页面需要servelet中的一些处理结构,就从request.getAttribute中获取。

而对于上面的sendRedirect()方法是通过浏览器重定向的,所以第二个JSP页面中获得的request并非是前一个页面的request(两次请求生成了前后两个不同的request对象)

request.getAttribute()与request.setAttribute()

request.getAttribute("nameOfObj")可得到JSP页面表单中控件的value。表单控件中的object的name和value是存放在一个哈希表中的,所以可以根据object的name找到对应的value

而不同页面传值使用request.setAttribute("nameOfObj","valueOfObj")时,只会从jsp1到jsp2一次传递,之后这个request就会失去它的作用范围,再传就要再设置一个request.setAttribute()。而使用session.setAttribute()会在一个过程中始终保有这个值,但是session的使用要符合其他规范,具体要求再google。

用RequestDispatcher接口的forward()方法试试看

List list = new CommonsDao().getAllCommons();

request.setAttribute("CommonsList", list);

request.getRequestDispatcher("View.jsp").forward(request, response);

request.getRequestDispatcher()和response.sendRedirect()区别

request.getRequestDispatcher()是请求转发,前后页面共享一个request

response.sendRedirect()是重新定向的,前后页面不是一个requst

sendRedirect通知浏览器再次提交一个http请求

dispatcher是直接转到目的地址,最直接的表现是dispatcher后的url地址是改变的

request.getRequestDispatcher()是服务器端跳转

response.sendRedirect()是客户端跳转

我的理解是:

sendRedirect()请求重定向,类似于超链接。比如在A页面写一个request.setAttribute,sendRedirect到B页面:

服务器------response---->A页面 ------request---->B页面

真实情况是:

A页面 ------request---->服务器 (sendRedirect操作) ------response---->A页面(然后浏览器)------request------> 服务器------response-------> B页面

即包含了两次request和response,因此是不能再B页面取到request.setAttribute里的值,能从url看到改变

request.getRequestDispatcher().forwar(request,reponse)是请求分发器,比如你在A页面中写一个reuqest.setAttribute, request.getRequestDispatcher().forwar(request,reponse)到B页面,那就是说服务器给你的response是B页面的,并且只有一次request和response,所以只能在B页面取到request.setAttribute里的值,url仍是A页面的。

总结:

sendRedirect实现请求重定向,forward实现的是请求转发。

1.跳转方式

运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何URL。

表单form的action= "/uu ";sendRedirect( "/uu ");表示相对于服务器根路径。

如http://localhost:8080/Test应用(则提交至http://localhost:8080/uu); forward代码中的 "/uu "则代表相对与WEB应用的路径。如http://localhost:8080/Test应用(则提交至http://localhost:8080/Test/uu);

2.参数传递方式

forward重定向后,浏览器url地址不变,sendRedirect转发后,浏览器url地址变为目的url地址。

forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。

forward的form参数跟着传递,可以使用setAttribute来传递参数到下一个页面。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。

3.服务器端和浏览器端

使用forward重定向的过程,是浏览器先向目的Servlet发送一次Request请求,然后在服务器端由Servlet再将请求发送到目的url,再由服务器端Servlet返回response到浏览器端。浏览器和服务器一次请求响应。

使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回response到浏览器。浏览器和服务器两次请求响应。

4.request和response

forward方法的调用者与被调用者之间共享Request和Response

sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。

如果使用request.setAttribute传递一些属性就需要用forward,如果想要跳转到别的应用的资源,就需要用sendRedirect。

5.都不能有PrinterWriter输出到客户端

无论是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)

两张图简单直接:

forward:                                                  sendRedirect:

                          

ps:他人对forward的看法

今天在调试一个Servlet程序的时候,报了以下错误!

java.lang.IllegalStateException: Cannot forward after response has been committed

根据字面理解的话,意识是在response已经提交后程序不能再一次的跳转!

研究代码以后发现,是因为前面已经执行过一次request.request.getRequestDispatcher().forward()

但是后面的request.request.getRequestDispatcher().forward()依然被执行到了!

那么很有理由相信request.request.getRequestDispatcher().forward()跳转本身是不会返回什么,也不会终止程序体的执行!

程序体后面该执行的还是会执行!

参考:

https://my.oschina.net/abbchina/blog/649274

http://blog.csdn.net/yoxibaga/article/details/8624056

时间: 2024-08-06 22:42:24

JAVA学习——forward和sendRedirect区别总结的相关文章

java web基础学习 Forward和Redirect区别

Forward和Redirect代表了两种请求转发方式:直接转发和间接转发.对应到代码里,分别是RequestDispatcher类的forward()方法和HttpServletRequest类的sendRedirect()方法. 对于间接方式,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的.它本质上是两次HTTP请求,对应两个request对象. 对于直接方式,客户端浏览器只发出一次请求,Servlet把请求转发给Servlet.HTML.JSP或其它

java 中sendredirect()和forward()方法的区别

 一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重定向,forward实现的是请求转发. 在web服务器内部的处理机制也是不一样的. 1. 跳转方式 运用forward方法只能重定向到同一个Web应用程序中的一个资源.而sendRedirect方法可以让你重定向到任何URL. 表单form的action= "/uu ";sendRedir

java 学习之List 的 add 与set方法区别

/** * 在List集合中众多方法中,add(int index,Object obj)方法与set(int index,Object e)方法不易区分 * ,通过下面实例,可以看出两个方法中的区别 */ package gao; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class CollectionDemo { public static void main(

【JAVA学习】拦截器与过滤器的区别

过滤器 它是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符 拦截器 它是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单

Java学习-036-JavaWeb_005 -- JSP 动作标识 - forward

JSP 动作主要作用是根据指定的动作进行相应的处理. 一.param 动作 用来给 HTML 文件和 JSP 文件传递参数的,经常和 forward.include.plugin 动作结合使用,语法格式为:<jsp:param name="username" value="admin"/> 二.forward 动作 forward 动作是用来请求信息转发到另一个页面的,它只有一个 page 属性,语法格式为:<jsp:forward page=&q

Java学习之道:Java构造器和方法的区别

摘要 要学习Java,你必须理解构造器.因为构造器可以提供许多特殊的方法,这个对于初学者经常混淆.但是,构造器和方法又有很多重要的区别. 原作者:Robert Nielsen 原站:www.javaworld.com 我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物.(按:老外喜欢打比喻,我也就照着翻译).要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别.同样地,要理解构造器,那么就要了解构造器和方法的区别.所有学习java的人,尤其是对那些要认证考试的,理解构造器是非常重要的.下

Java学习笔记4

1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库. ③.JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.

JAVA学习篇--javaweb之Filter详解

在DRP项目中,多次提到了Filter,它解决了字符集的统一设置以及统一控制简单WebCache,从中我们可以体会到,它给我们带来的好处不仅仅是减少代码量这么简单,它的出现避免了我们每个页面重复的编写相同的代码,减少了我们的工作量,而且给维护带来了极大的便利,那么它是如何实现统一管理的呢?既然它能统一管理某些重复的操作,那么它和AOP有什么关系呢? Filter简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过

转载 java学习注意点

原文地址http://www.cnblogs.com/xrq730/p/5260294.html 前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向咱们Java程序员的. 简单先说一下,LZ坐标杭州,13届本科毕业,算上年前在阿里巴巴B2B事业部的面试,一共有面试了有6家公司(因为LZ不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少),其中成