jsp中如何设定attribute的范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jsp中如何设定attribute的范围相关的知识,希望对你有一定的参考价值。

jsp的范围就2个..request 和session

你放session在那里都能得到...即拿即用

request就只能从下一个请求中获得..过了这村子就没这店了
参考技术A JSP的隐式对象
RequestJavax.servlet.ServletRequest它包含了有关浏览器请求的信息.通过该对象可以获得请求中的头信息、Cookie和请求参数。
Enumeration getHeaderNames()String getHeader(name)Cookie[] getCookies()Enumeration GetParameterNames()String getParameter(name)String[] GetParametervalues(name)HttpSession getSession(flag)
responseJavax.servlet.ServletResponse作为JSP页面处理结果返回给用户的响应存储在该对象中。并提供了设置响应内容、响应头以及重定向的方法(如cookies,头信息等)
Void setContentType(type)String getCharacterEncoding()Void addCookie(cookie)Void sendRedirect(url)
outJavax.servlet.jsp.JspWriter用于将内容写入JSP页面实例的输出流中,提供了几个方法使你能用于向浏览器回送输出结果。
pageContextJavax.servlet.jsp.PageContext描述了当前JSP页面的运行环境。可以返回JSP页面的其他隐式对象及其属性的访问,另外,它还实现将控制权从当前页面传输至其他页面的方法。
Void forward(path)PAGE_SCOPEREQUEST_SCOPESESSION_SCOPEAPPLICATION_SCOPEVoid setAtrribute(key,value,scope)Enumeration getAttributeNamesInScope(scope)Object getAttribute(key,scope)Void RemoveAttribute(key,scope)Object findAttribute(name)Int getAttributeScope(name)
sessionjavax.servlet.http.HttpSession会话对象存储有关此会话的信息,也可以将属性赋给一个会话,每个属性都有名称和值。会话对象主要用于存储和检索属性值。
Void setAttribute(name,data)Object getAttribute(name)
applicationjavax.servle.ServletContext存储了运行JSP页面的servlet以及在同一应用程序中的任何Web组件的上下文信息。
pageJava.lang.Object表示当前JSP页面的servlet实例
configjavax.servlet.ServletConfig该对象用于存取servlet实例的初始化参数。
Enumeration getInitParameterNames()String getInitParameter(name)
ExceptionJavax.lang.Throwable在某个页面抛出异常时,将转发至JSP错误页面,提供此对象是为了在JSP中处理错误。
String getMessage()Void printStackTrace(out)<%@ page errorPage=”error.jsp”%><%@ page isErrorPage=”true” %>

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

【中文标题】如何在jsp的会话范围内存储请求对象【英文标题】:how to store request object in session scope in jsp 【发布时间】:2014-10-17 01:05:34 【问题描述】:

我只是在我的jsp 页面中进行随机技巧和测试。我想使用Attributesrequest 范围对象存储在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@ 对象已消失……是这样吗?如果我错了,请澄清。 它并没有消失,因为您已经在会话中存储了对它的引用。但是你不能再依赖这个对象的功能了,因为当它不能再被使用时,你会在上下文中使用它。如果您在过期日期后饮用牛奶,您就不能指望它有良好的口感和健康。您不能指望请求在处理后仍然可用。 【参考方案1】:

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

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

当您检索请求值时,您必须这样做:

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

毕竟:如果你想在会话中存储一个对象,更好的方法是将它直接存储到会话中,而不是将请求作为属性存储在会话中。见以下代码:

存储属性:

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");

【讨论】:

Http Status 500 发生异常。 但是,兄弟,如果Object 是任何对象,那么为什么不是request 对象。另外,我如何将键值对存储在Object【参考方案2】:

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

您可以使用方法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(控制器)中设置一些参数,然后在 same 请求被转发到的 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,但这个主题需要另外讨论 :)。

【讨论】:

谢谢@Gas。非常好的代码解释。 JB Nizet 也谢谢你。是的,我肯定会学习 EL。【参考方案3】:

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

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

【讨论】:

如果你使用 forward,你不需要在任何地方存储请求,因为相同的对象在你的起始页面和转发的页面中可用(因为它仍然是相同的请求)。

以上是关于jsp中如何设定attribute的范围的主要内容,如果未能解决你的问题,请参考以下文章

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

<jsp:attribute>是啥

jsp页面中<input type="text">设定value的取值范围,文本框的取值范围是5000到1000000。

JSP页面如何使用JavaBean?JavaBean的访问范围有几种

jsp 中获取自定义变量

getattibute 与 getparameter区别