如何在jsp中的会话范围中存储请求对象

时间:2014-08-23 07:26:45

标签: java jsp

我只是做随机技巧&在我的jsp页面中进行测试。我想使用requestsession范围对象存储在Attributes范围对象中。在尝试从请求属性中提取值(存储在会话属性中)后存储后,我得到了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

............................................... ..........

我需要你在这个问题上的指导。

3 个答案:

答案 0 :(得分:1)

您可以使用以下代码执行此操作:

HttpSession session = request.getSession();
session.setAttribute("req1", request);

当您检索请求值时,您必须执行以下操作:

<%= ((HttpServletRequest) rrrr.getAttribute("req1")).getAttribute("request1") %>

完成所有这些之后:如果要在会话中存储Object,更好的方法是将其直接存储到会话中,而不是将请求作为属性存储在会话中。见下面的代码:

存储属性:

HttpSession session = request.getSession();
session.setAttribute("obj1", Object); //  Object is any object that you want to store

并将其检索为:

HttpSession session = request.getSession(false);
Object o = session.getAttribute("obj1");

答案 1 :(得分:1)

请求对象不应存储在会话中。正如JB Nizet所写,它不应该在当前请求的一边使用。例如,Container可以决定稍后重用该对象,同时处理不同的请求,重置其所有属性。

您可以使用方法request.getParameter()request.getAttribute()当前请求获取参数和属性,如果您以后需要它们,可以将它们存储在会话中。您还可以在会话中存储任意对象。例如像这样(片段):

String paramForLater = request.getParameter("p1");
// store parameter
session.setAttribute("paramForLater", paramForLater);

// store some data
Person personData = new Person();
session.setAttribute("personData", personData );

// you can retrieve these object later in different jsp like this
Person personData = (Person) session.getAttribute("personData");
String param = (String ) session.getAttribute("paramForLater");

方法request.set / getAttribute()仅在处理当前请求时使用。 例如,您可以在servlet(控制器)中设置一些参数,然后在转发相同请求的jsp(视图)中访问它们。像这样的模式:

// in servlet get your data e.g. from database
MyEntity entity = // code to get entity;
request.setAttribute("entity", entity);
request.getRequestDispatcher("view.jsp").forward(request, response);


// then in jsp you can access that paramter 
<%
MyEntity e = (MyEntity) request.getAttribute("entity");
... // do something in entity
%>

您可能应该使用EL表达式而不是scriplets,但这个主题用于另一个讨论:)。

答案 2 :(得分:0)

我得到了解决方案,当我用href动作替换jsp:forward代码时,它显示了完美的输出。

为每个服务器请求创建一个新的HttpServletRequest对象。因此,当我使用jsp2.jsp导航到href页面时,它为jsp2.jsp创建了新的HttpServletRequest对象。