【发布时间】:2014-10-17 01:05:34
【问题描述】:
我只是在我的jsp 页面中进行随机技巧和测试。我想使用Attributes 将request 范围对象存储在session 范围对象中。在尝试从请求属性中提取值(存储在会话属性中)存储后,我得到了null。为什么会这样?
以下是我的jsp 文件:
index.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%request.setAttribute("request1", "requestValue"); %>
<%session.setAttribute("req1", request); %>
<br>
<a href="jsp2.jsp">link</a>
</body>
</html>
jsp2.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<br>
<%HttpServletRequest rrrr=(HttpServletRequest)session.getAttribute("req1"); %><br>
<%=rrrr.getAttribute("request1")%><br>
</body>
</html>
浏览器输出
null
预期输出
requestValue
.................................................. ..........
在这个问题上我需要你的指导。
【问题讨论】:
-
您不应该在请求被处理后尝试使用请求。请求一旦被处理就不应被使用。定义您自己的对象,包含来自第一个请求的相关信息,并将这些对象存储在会话中。
-
抱歉,我无法理解您的意思。你能进一步解释一下吗?
-
每次向服务器发出请求时,都会创建一个新的 HttpServletRequest,并将其传递给为该请求生成响应的 servlet 和 JSP。发送响应后,将请求对象视为不可用。不要将其存放在任何地方以备日后使用。
-
我想我明白了,你的意思是说,当我调用
jsp2.jsp时,将创建一个全新的HttpServletRequest,这就是我得到null的原因,因为之前的@ 987654334@ 对象已消失……是这样吗?如果我错了,请澄清。 -
它并没有消失,因为您已经在会话中存储了对它的引用。但是你不能再依赖这个对象的功能了,因为当它不能再被使用时,你会在上下文中使用它。如果您在过期日期后饮用牛奶,您就不能指望它有良好的口感和健康。您不能指望请求在处理后仍然可用。