request.setAttribute()问题页面一HTML code%@ page languagejava importjava.util.* pageEncoding
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一定不是同一个
[解决办法][解决办法]我的理解是这样的,看看对你有没帮助。
这么说吧,你的request从你打开MyJsp.jsp的时候创建,你可以在MyJsp.jsp里任意使用它。
当你点击button的时候,request转到服务器,从服务器转到ss.jsp时,这个request已经销毁,当ss.jsp这个页面打开时你设的这个request已经不存在了,在ss.jsp这个页面的已经是一个新的request了。所以你拿不到他的值。
如果你一定要这样拿的话,可以试试隐藏域,在MyJsp.jsp中
<input type="hidden" name="name" value="<%=request.getAttribute("a") %>" />
然后在ss.jsp中request.getParameter("name")这样拿。
你去看看request的生命周期。
有错的地方请大家指点。
[解决办法]并非是同一request对象,当然取不到了!
[解决办法]上面已经解析得非常清楚了。。。路过接分
如果还不明白,那真的...
[解决办法]上面已经解析得非常清楚了。。。路过接分
如果还不明白,那真的...
[解决办法]不是同一个request当然获取不到了
你可以放到session或者application中
[解决办法]request存在只对forward的页面有效
[解决办法]学习了……
session 是个好东西……
[解决办法]学习一下!
[解决办法]要搞懂request内置对象的生命周期和属性范围!根本就不是同一个
[解决办法]这么说吧,重定向和转发理解吧?
我也学完没多久,我是这么理解的,这是一个重定向的过程,
首先你提交了一个请求页面给服务器,服务器返回给你第一个页面,此时产生一个request对象,
你将a对象放入了这个request,然后点击提交!
关键就是在这里了,服务器根据表单中的action="${pageContext.request.contextPath }/temp/ss.jsp"
告诉浏览器,让浏览器重新发送一个${pageContext.request.contextPath }/temp/ss.jsp的请求,
当浏览器向服务器发送了ss.jsp页面请求时,又产生了一个request对象,也就是你在ss.jsp页面中所用的request
这便是一个重定向,重定向是不能共享request隐含对象的,
所以在ss.jsp页面中通过request当然是得不到a这个对象的
我奇怪的是你为什么要这么写呢,表单一般是用来提交数据的,然后通过request.getParemater("...")来获取参数,为什么你要在表单中加入这样的代码呢?很费解....
[解决办法]request生命周期的问题,请翻看教材。。。
[解决办法]你真的要这么做,将这个值跟着Action一起带过去
a.aciton ? aaa=+"aaa";
在action里面request.getParameter(aaa);
然后request.setAttribute("aaa",aaa);
跳到第二个页面的时候就可以取到咯!session毕竟范围大了点,浪费哟!