页面一<%@ 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>页面二<%@ 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")就取不到值了?
<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>页面二<%@ 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")就取不到值了?
session..setAttribute("a","aaa");
在页面二采用session.getAttribute("a");
<%
request.setAttribute("a","aaa");
out.write(request.toString());
%>
在服务器端就已经被执行,你可以再客户端查看源码肯定是看不到的,其实可以很简单的解释就似乎IE只能识别HTML给你,这部分是WEB服务器解析的,在WEB服务器上可以经历很多中间过程,requset的生命周期是从请求发送到WEB服务器开始创建,当服务器向客户端输出数据后,也就是这个页面反馈给客户端浏览器的时候,就注销了,相当于在一个线程中创建的,此为9个内置对象之一。当你通过反馈回来的页面,再次提交时,此为第二次请求WEB服务器(第一次是请求页面内容,第二次为请求服提交内容),所以创建的根本不是一个request,前者早已经注销。使用session可以解决此类问题,但是善用SESSION,涉及全局变量的使用都要注意其相互的影响我们一般讲需要暂存的数据,作为页面隐藏项目,Struts内部有专门的隐藏标签,将常用的隐藏标签封装到一个小页面内部,其余界面include进来即可,尽量避开SESSION的泛滥使用。
out.write(request.toString());
当页面加载时就已经执行了,执行完后request注销。之后通过submit提交,只是提交表单中的元素。就如xieyuooo说的,第一次是请求页面内容,第二次为请求服提交内容
所以你两个页面里的request一定不是同一个
1、第一次是加载页面,这个请求的是一个request
2、第二次是提交页面,这个请求是第二个request
<input type="hidden" name="name" value="<%=request.getAttribute("a") %>" />
然后在ss.jsp中request.getParameter("name")这样拿。你去看看request的生命周期。
有错的地方请大家指点。
你可以放到session或者application中
我也学完没多久,我是这么理解的,这是一个重定向的过程,
首先你提交了一个请求页面给服务器,服务器返回给你第一个页面,此时产生一个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("...")来获取参数,为什么你要在表单中加入这样的代码呢?很费解....
a.aciton ? aaa=+"aaa";
在action里面request.getParameter(aaa);
然后request.setAttribute("aaa",aaa);
跳到第二个页面的时候就可以取到咯!session毕竟范围大了点,浪费哟!
以后就用session的存储方式吧。request实在不好掌握,但是request也有自己的优点,因为他的生命周期很短暂,如果只是用到一次,那么正好符合它的特性,还节省了服务器的资源。