当前位置: 代码迷 >> Java Web开发 >> request.setAttribute()有关问题
  详细解决方案

request.setAttribute()有关问题

热度:9562   发布时间:2013-02-25 21:11:42.0
request.setAttribute()问题
页面一
HTML code
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>        <title>My JSP 'MyJsp.jsp' starting page</title>      </head>    <body>    <form action="${pageContext.request.contextPath }/temp/ss.jsp" method="get">        <%            request.setAttribute("a","aaa");            out.write(request.toString());        %>        <input type="submit"/>    </form>  </body></html>

页面二
HTML code
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>        <title>My JSP 'ss.jsp' starting page</title>      </head>    <body>    ---------------[<%=request.getAttribute("a") %>]---------------    ---------------[<%out.write(request.toString()); %>]---------------  </body></html>

请问为什么在页面二用request.getAttribute("a")就取不到值了?


------解决方案--------------------------------------------------------
又不是同一个request
------解决方案--------------------------------------------------------
在页面一应将request.setAttribute("a","aaa")改成HttpServlet session = request.getSession();
session..setAttribute("a","aaa");
在页面二采用session.getAttribute("a");
------解决方案--------------------------------------------------------
method="get" 换成post试试
------解决方案--------------------------------------------------------
不是一个request的原因很简单,首先你要明白客户端向服务器断请求的整个过程和request的生命周期,你在请求第一个页面的时候,一下代码:
<%
request.setAttribute("a","aaa");
out.write(request.toString());
%>
在服务器端就已经被执行,你可以再客户端查看源码肯定是看不到的,其实可以很简单的解释就似乎IE只能识别HTML给你,这部分是WEB服务器解析的,在WEB服务器上可以经历很多中间过程,requset的生命周期是从请求发送到WEB服务器开始创建,当服务器向客户端输出数据后,也就是这个页面反馈给客户端浏览器的时候,就注销了,相当于在一个线程中创建的,此为9个内置对象之一。

当你通过反馈回来的页面,再次提交时,此为第二次请求WEB服务器(第一次是请求页面内容,第二次为请求服提交内容),所以创建的根本不是一个request,前者早已经注销。

使用session可以解决此类问题,但是善用SESSION,涉及全局变量的使用都要注意其相互的影响。。。我们一般讲需要暂存的数据,作为页面隐藏项目,Struts内部有专门的隐藏标签,将常用的隐藏标签封装到一个小页面内部,其余界面include进来即可,尽量避开SESSION的泛滥使用。
------解决方案--------------------------------------------------------
request.setAttribute("a","aaa");
out.write(request.toString());
当页面加载时就已经执行了,执行完后request注销。之后通过submit提交,只是提交表单中的元素。就如xieyuooo说的,第一次是请求页面内容,第二次为请求服提交内容
------解决方案--------------------------------------------------------
不是一个request
------解决方案--------------------------------------------------------
同楼上的 不是一个request

建议楼主去读一下jsp内置对象的书籍资料。


------解决方案--------------------------------------------------------
session.getAttribute("a");
------解决方案--------------------------------------------------------
这样讲吧,当你下载第一个页面时,产生了一个reqeust对象。当你点击submit按钮时,对第二个页面发起请求,产生第二个request对象,两个request对象是不一样的。
------解决方案--------------------------------------------------------
request的生命期为你点击按钮到新页面出现为止
所以你两个页面里的request一定不是同一个
------解决方案--------------------------------------------------------
探讨
  相关解决方案