关于
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中的数据会丢失。 不知道,是我的代码有问题,还是说“曾经的帖子”说的不够到位呢?
望,有大虾出来指点一二
直迷糊~~
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中的数据会丢失。 不知道,是我的代码有问题,还是说“曾经的帖子”说的不够到位呢?
望,有大虾出来指点一二
直迷糊~~
解决方案 »
- 我如何得到上次请求的地址?
- 急!高手帮帮忙,N个复选框提交的问题!谢谢了
- 关于jfreechart生成柱状图的两个问题!~~~~~~~~`急啊~~~~~~~~
- 请问我写一个jsp登录界面,在jsp运行时提示:boolean型变量loginOK不可见,请问怎回事?
- 高分请教:关闭窗口问题
- ResultS next()报错
- 急!javascript中可以用jsp中的变量吗?大虾请进!
- 数组的使用 高手请进
- 一个关于bean的小问题.我运行通了马上给分
- 在sun的SOlaris下怎样用jsp实现计数器?(服务器是netscape的suitspot)?
- EL中参数和字符一同显示的问题
- ssh json jar 问题
你把帖子转移下。
request.getRequestDispatcher(url).forward(request,response)是直接将请求转发到指定URL,所以该请求能够直接获得上一个请求的数据,
也就是说采用请求转发,request对象始终存在,不会重新创建。而sendRedirect()会新建request对象,所以上一个request中的数据会丢失。”
上面的说话没错,道理也是这样的,你的代码也没错。
②用request.getRequestDispatcher(url).forward(request,response)时,request的ID不一样的啊,(见为什么2这句),为什么却可以通过request.getAttribute("styles")取得值呢?
一个是一个request请求,一个是两个request请求。
HttpServletRequest并没有重写该方法。
request.getRequestURI()你再试试。
得到的结果不一样,分别是:
Servlet-request /Test/servlet/dd
Request : /Test/form.jsp
两个URI都不一样,这两个request会相同吗,你得到的仅仅是Object的toString()方法
return getClass().getName() + "@" + Integer.toHexString(hashCode());
类的名字加上◎再加hashCode(),hashCode() HttpServletRequest还是没有重写
所以你得到相同。
第一个问题解决
可以用session传,或者用转发
我估计是在这里做了手脚,将request的类型转化了。
1,能否取得到request通过setAttribute的值,前者不可,后者可.
2.转向后显示的地址.后者不变
3.前者可以转向到本web应用之外的页面
4.前者速度较低于后者速度. 用sendRedirect的情况用户刚刚做完更新的操作
用forward则是要保存用户信息(不是SESSION)的情况下使用 简单点说 两种方式的区别在于 一个是用来保证数据的更新安全 另一个则是便于我们平时操作方便的
view.forward(request, response)的时候,
request被转换了,也就是hashCode()值变了?
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对象啊?
应该是tomcate为了节约时间,提高效率,用的是同一个对象,但是引用对象的内容不一样了.
但是使用forward()的时候;
tomcate用的确是不同的对象,但是引用对象的内容一样;我们平时说用了几个request,相同不相同,指的是对象里边的内容相同不相同,而不是说是不是同一个对象。
这里说的引用对象的内容说的是,该对象设置的属性。
setAttribute(String,Object);
返回该对象在堆中的地址。
---用sendRedirect()的时候;
---应该是tomcate为了节约时间,提高效率,用的是同一个对象,但是引用对象的内容不一样了.
也就是对象是一样的,引用不一样?---但是使用forward()的时候;
---tomcate用的确是不同的对象,但是引用对象的内容一样;
也就是对象是不同的,引用却是一样的?这里的引用和引用对象是同一概念吗?
e62a39
是某个request对象的地址,我们引用该对象的地址,
但是该对象里边的内容可能不一样。
从java基础来说,还是有点不明白。引用对象的内容这个概念还是不明白。
引用和引用对象是同一概念吗?
地址是一样的,地址指向的内容不一样又是怎么回事?
在一次编译运行时,同一地址能指向不同的内容?
因为 request 的作用域问题 。。你已经再次 重定向了。。request 只作用于 开始的请求, 这个感觉 就像 redirect 只能用 http1.1协议中的 get 方法 请求数据 不能用post ~!~
引用和引用对象是同一概念吗?
地址是一样的,地址指向的内容不一样又是怎么回事?
在一次编译运行时,同一地址能指向不同的内容?
----------可以理解为就拷贝一份request要传递的数据给你
2.request.getRequestDispatcher(url).forward(request,response)只请求一次,即使后面再有新的请求,也会结束!
request.getRequestDispatcher(url).forward(request,response)这个是服务器内部的传送,将(request,response)对象都传送给getRequestDispatcher(url)url这个jsp或者java类,包含了原来的request对象自然包含参数
request.getRequestDispatcher(url).forward(request,response)这个转发式服务器干活,request还是你先前请求,当然可以返回。
对应的redirect相当于两次请求
1、request.getRequestDispatch("xx.jsp").forward - 用于把处理的控制权从一个页面转移到另一个页面,在转移的过程中,没有离开服务器,内部控件(如:request, session 等)的保存的信息不变,因此,你能从页面 A 跳到页面 B 而不会丢失页面 A 中收集的用户提交信息。此外,在转移的过程中,浏览器的 URL 栏不变。 2、Response.sendRedirect - 发送一个 HTTP 响应到客户端,告诉客户端跳转到一个新的页面,客户端再发送跳转请求到服务器。使用此方法时,将无法保存所有的内部控件数据,页面 A 跳转到页面 B,页面 B 将无法访问页面 A 中 Form 提交的数据。