关于
request.getRequestDispatcher("")

response.sendRedirect("")的迷惑!现有程序:
Servlet代码片段:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    System.out.println("Servlet-request  " + request);
    request.setAttribute("styles", "ssssssss");//跳转1
    response.sendRedirect("form.jsp");
}
form.jsp内容如下:<html>
<body>
<h1 align="center">AAA Page</h1>
<center>
Request : <%= request %><br>
Attribute : <%= request.getAttribute("styles") %><br>
</center>
</body>
</html>
运行后可以发现:
Servlet代码中request对象和jsp代码中所输出的request对象为同一个值,但是属性却取不出来,显示为null。(为什么1?)而,如果我把“//跳转1”处的代码改为:
RequestDispatcher view = request.getRequestDispatcher("form.jsp");
view.forward(request, response);
运行后可以发现:
Servlet代码中request对象和jsp代码中所输出的request对象为不同的两个值,但是属性却取出来了。(为什么2?)
这我就比较不懂了,
以前曾经看过一个贴子说:
response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参数,如:url?id=1. 
request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求能够直接获得上一个请求的数据,
也就是说采用请求转发,request对象始终存在,不会重新创建。而sendRedirect()会新建request对象,所以上一个request中的数据会丢失。 不知道,是我的代码有问题,还是说“曾经的帖子”说的不够到位呢?
望,有大虾出来指点一二
直迷糊~~

解决方案 »

  1.   

    这个基本问题,还是发到web开发人气比较高。。
    你把帖子转移下。
      

  2.   

    “response.sendRedirect(url)跳转到指定的URL地址,产生一个新的request,所以要传递参数只有在url后加参数,如:url?id=1. 
    request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求能够直接获得上一个请求的数据, 
    也就是说采用请求转发,request对象始终存在,不会重新创建。而sendRedirect()会新建request对象,所以上一个request中的数据会丢失。”
    上面的说话没错,道理也是这样的,你的代码也没错。
      

  3.   

    ①可是我用response.sendRedirect(url)转发时,request的ID(也就是hashcode)是一样的啊,(见为什么1这句),并没有新的对象(request)产生啊?
    ②用request.getRequestDispatcher(url).forward(request,response)时,request的ID不一样的啊,(见为什么2这句),为什么却可以通过request.getAttribute("styles")取得值呢?
      

  4.   

    一个是客户端跳转,一个是服务端跳转
    一个是一个request请求,一个是两个request请求。
      

  5.   

    一个客户端的URL会改变,一个不会改变
      

  6.   

    你是如何判断是同一个request对象的,简单的通过request,toString()方法码?
    HttpServletRequest并没有重写该方法。
    request.getRequestURI()你再试试。
      

  7.   

    我在我的机器上边用request.getRequestURI()试了下,
    得到的结果不一样,分别是:
    Servlet-request  /Test/servlet/dd
    Request : /Test/form.jsp
    两个URI都不一样,这两个request会相同吗,你得到的仅仅是Object的toString()方法
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
    类的名字加上◎再加hashCode(),hashCode() HttpServletRequest还是没有重写
    所以你得到相同。
    第一个问题解决
      

  8.   


    可以用session传,或者用转发
      

  9.   

    view.forward(request, response); 
    我估计是在这里做了手脚,将request的类型转化了。
      

  10.   

    我知道sendRedirect和forward的区别,有以下四点 
    1,能否取得到request通过setAttribute的值,前者不可,后者可. 
    2.转向后显示的地址.后者不变 
    3.前者可以转向到本web应用之外的页面 
    4.前者速度较低于后者速度. 用sendRedirect的情况用户刚刚做完更新的操作 
    用forward则是要保存用户信息(不是SESSION)的情况下使用 简单点说 两种方式的区别在于 一个是用来保证数据的更新安全 另一个则是便于我们平时操作方便的
      

  11.   

    楼上的意思是说在做
    view.forward(request, response)的时候,
    request被转换了,也就是hashCode()值变了? 
      

  12.   

    用view.forward(request, response)方法:
    Servlet的request URI:/beerv1/SelectBeer.do
    JSp的Request URI : /beerv1/form.jsp同样的,response.sendRedirect("form.jsp")方法:
    Servlet的request URI:/beerv1/SelectBeer.do
    JSp的Request URI : /beerv1/form.jsp也就是说两个getRequestURI()处理的比较结果是一样的啊。并不能用来判断request对象啊?
      

  13.   

    说的是这个问题,用sendRedirect的时候
      

  14.   

    使用sendRedirect()的时候;
    应该是tomcate为了节约时间,提高效率,用的是同一个对象,但是引用对象的内容不一样了.
    但是使用forward()的时候;
    tomcate用的确是不同的对象,但是引用对象的内容一样;我们平时说用了几个request,相同不相同,指的是对象里边的内容相同不相同,而不是说是不是同一个对象。
      

  15.   

    引用对象的内容
    这里说的引用对象的内容说的是,该对象设置的属性。
    setAttribute(String,Object);
      

  16.   

    如何判断是不是同一个request对象,是hashCode()函数,他调用的是object的hashCode,自己并没有重写
    返回该对象在堆中的地址。
      

  17.   


    ---用sendRedirect()的时候; 
    ---应该是tomcate为了节约时间,提高效率,用的是同一个对象,但是引用对象的内容不一样了. 
    也就是对象是一样的,引用不一样?---但是使用forward()的时候; 
    ---tomcate用的确是不同的对象,但是引用对象的内容一样; 
    也就是对象是不同的,引用却是一样的?这里的引用和引用对象是同一概念吗?
      

  18.   

    举个例子:
    e62a39
    是某个request对象的地址,我们引用该对象的地址,
    但是该对象里边的内容可能不一样。
      

  19.   


    从java基础来说,还是有点不明白。引用对象的内容这个概念还是不明白。
    引用和引用对象是同一概念吗?
    地址是一样的,地址指向的内容不一样又是怎么回事?
    在一次编译运行时,同一地址能指向不同的内容?
      

  20.   


     因为 request 的作用域问题 。。你已经再次 重定向了。。request 只作用于 开始的请求,   这个感觉 就像  redirect 只能用 http1.1协议中的 get 方法 请求数据  不能用post  ~!~  
      

  21.   

    从java基础来说,还是有点不明白。 引用对象的内容这个概念还是不明白。 
    引用和引用对象是同一概念吗? 
    地址是一样的,地址指向的内容不一样又是怎么回事? 
    在一次编译运行时,同一地址能指向不同的内容? 
    ----------可以理解为就拷贝一份request要传递的数据给你 
      

  22.   

    1.response.sendRedirect("forward.jsp")这个相当于请求响应了两次,直到请求结束,而如果想得到相应的这种跳转方式的数据的话,需要把相应的数据对象放放到session当中;
    2.request.getRequestDispatcher(url).forward(request,response)只请求一次,即使后面再有新的请求,也会结束!
      

  23.   

    response.sendRedirect("forward.jsp")这个就好像是服务器端给客户端发送的一个命令,要在浏览器中跳转到forward.jsp这个页面,浏览器地址栏会变化。一旦到客户端request对象就销毁了
    request.getRequestDispatcher(url).forward(request,response)这个是服务器内部的传送,将(request,response)对象都传送给getRequestDispatcher(url)url这个jsp或者java类,包含了原来的request对象自然包含参数
      

  24.   


    request.getRequestDispatcher(url).forward(request,response)这个转发式服务器干活,request还是你先前请求,当然可以返回。
      

  25.   

    对应的forward一次请求
    对应的redirect相当于两次请求
      

  26.   

    它们之间的区别在于:
      1、request.getRequestDispatch("xx.jsp").forward - 用于把处理的控制权从一个页面转移到另一个页面,在转移的过程中,没有离开服务器,内部控件(如:request, session 等)的保存的信息不变,因此,你能从页面 A 跳到页面 B 而不会丢失页面 A 中收集的用户提交信息。此外,在转移的过程中,浏览器的 URL 栏不变。  2、Response.sendRedirect - 发送一个 HTTP 响应到客户端,告诉客户端跳转到一个新的页面,客户端再发送跳转请求到服务器。使用此方法时,将无法保存所有的内部控件数据,页面 A 跳转到页面 B,页面 B 将无法访问页面 A 中 Form 提交的数据。