request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别

本文详细介绍了HTTP请求中的request和session作用域下setAttribute与getAttribute方法的区别与应用技巧,对比了不同方法在数据传递方面的特点,并提供了具体的代码示例。

1.session.setAttribute()和session.getAttribute()配对使用,作用域是整个会话期间,在所有的页面都使用这些数据的时候使用。

2.request.setAttribute()和request.getAttribute()配对使用,作用域是请求和被请求页面之间。request.setAttribute()是只在此action的下一个forward需要使用的时候使用;request.getAttribute()表示从request范围取得设置的属性,必须要先setAttribute设置属性,才能通过getAttribute来取得,设置与取得的为Object对象类型。其实表单控件中的Object的 name与value是存放在一个哈希表中的,所以在这里给出Object的name会到哈希表中找出对应它的value。setAttribute()的参数是String和Object。

3.request.getParameter()表示接收参数,参数为页面提交的参数。包括:表单提交的参数、URL重写(就是xxx?id=1中的id)传的参数等,因此这个并没有设置参数的方法(没有setParameter()),而且接收参数返回的不是Object,而是String类型。

举例:

session.setAttribute("kindresult", result);    //result 为StringBuffer类型对象

response.sendRedirect("../manage_kind.jsp");


在manage_kind.jsp中:

<%   
 StringBuffer kindresult=new StringBuffer();
 kindresult=(StringBuffer)session.getAttribute("kindresult");
 %>

<%=kindresult%>

##################################################################

我在servlet中使用了request.setAttribute()存储信息。
 语法如下:request.setAttribute("user","1234");
 然后 response.sendRedirect("/hello.jsp");
 但是在我的hello.jsp中 request.getAttribute("user");
 返回值为null,为什么没有取到String "1234"?

在这里就要注意了,sendRedirect不能传递request对象。使用request.setAttribute时不能使redirect而是forward。即是将请求转发而不是重定向。

你可以使用getServletContext().getRequestDispatcher("/hello.jsp").forward(request,response)转到hello.jsp页面,对客户端而言它意识不到是hello.jsp页面响应它。
 request对象和response对象是一样的,当然你的参数就可以传递过去了。

你使用response.sendRedirect("/hello.jsp");转到hello.jsp之后,request对象是新建的,你的属性值自然没有了。但是如果你使用session代替request就还是可以的。
 session.setAttribute("user","1234");
 session.getAttribute("user");

#####################################################################################

4.request.getParameter() 和request.getAttribute() 区别

(1)request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据,request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。

(2)request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。request.getParameter()方法返回String类型的数据。

request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容器内部

还有一点就是,HttpServletRequest类有setAttribute()方法,而没有setParameter()方法。

拿一个例子来说一下吧,假如两个WEB页面间为链接关系时,就是说要从1.jsp链接到2.jsp时,被链接的是2.jsp可以通过getParameter()方法来获得请求参数.

假如1.jsp里有

<form name="form1" method="post" action="2.jsp">
 请输入用户姓名:<input type="text" name="username">
 <input type="submit" name="Submit" value="提交">
 </form>

的话在2.jsp中通过request.getParameter("username")方法来获得请求参数username:

< % String username=request.getParameter("username"); %>

但是如果两个WEB间为转发关系时,转发目的WEB可以用getAttribute()方法来和转发源WEB共享request范围内的数据,也还是说一个例子吧。

有1.jsp和2.jsp

1.jsp希望向2.jsp传递当前的用户名字,如何传递这一数据呢?先在1.jsp中调用如下setAttribute()方法:

<%
 String username=request.getParameter("username");
 request.setAttribute("username",username);
 %>

<jsp:forward page="2.jsp" />

在2.jsp中通过getAttribute()方法获得用户名字:
 <% String username=(String)request.getAttribute("username"); %>

5.request.getAttribute()与request.setAttribute()

request.getAttribute("nameOfObj")可得到JSP页面一表单中控件的Value。其实表单控件中的Object的 name与value是存放在一个哈希表中的,所以在这里给出Object的name会到哈希表中找出对应它的value。

而不同页面间传值使用request.setAttribute(position, nameOfObj)时,只会从a.jsp到b.jsp一次传递,之后这个request就会失去它的作用范围,再传就要再设一个 request.setAttribute()。而使用session.setAttribute()会在一个过程中始终保有这个值。

P.S:JavaScript与JSP中不能相互传值,因为JavaScript运行在客户端,而JSP运行在服务器端。若想使它们之间可以相互传递参数,可以在JSP中设置一个hidden控件,用它的value结合上面所说的用法来传递所需的数值。

 

 

FROM:http://blog.163.com/magicc_love/blog/static/185853662201111124510916/

 

 

另:

B/S架构中,客户端与服务器连接,在服务端就会自动创建一个session对象. session.setAttribute("username",username); 是将username保存在session中!session的key值为“username”value值就是username真实的值,或者引用值.这样以后你可以通过session.getAttribute("username")的方法获得这个对象. 比如说,当用户已登录系统后你就在session中存储了一个用户信息对象,此后你可以随时从session中将这个对象取出来进行一些操作,比如进行身份验证等等. 
--------------------------------------------------------------------------- 
1、request.getSession()可以帮你得到HttpSession类型的对象,通常称之为session对象,session对象的作用域为一次会话,通常浏览器不关闭,保存的值就不会消失,当然也会出现session超时。服务器里面可以设置session的超时时间,web.xml中有一个session time out的地方,tomcat默认为30分钟 2、session.setAttribute("key",value);是session设置值的方法,原理同java中的HashMap的键值对,意思也就是key现在为“user”;存放的值为userName,userName应该为一个String类型的变量吧?看你自己的定义。 3、可以使用session.getAttribute("key");来取值,以为着你能得到userName的值。 4、注意:getAttribute的返回值类型是Object,需要向下转型,转成你的userName类型的,简单说就是存什么,取出来还是什么。 5、setAttribute和getAttribute就是基于HashMap的put方法和get方法实现的,一般叫键值对或者key-value,即通过键找到值。例如你的名字和你的人的关系,只要一叫你的名字,你就会喊到,通过你的名字来找你的人,简单说这就是键值对的概念。 

 

FROM:http://stevenjohn.iteye.com/blog/891177

<think>首先,用户的问题是:“我想获取关于 request.session 的使用或问题解决方案 请问request.session 的作用使用方法”。这涉及到Java Web开发中requestsession的使用。 从系统指令中,我需要: - 所有行内数学表达式用$...$格式(但这里可能不涉及数学,所以可能不需要)。 - 独立公式用$$...$$格式并单独成段。 - LaTeX语法正确(但用户问题不涉及数学,所以可能跳过)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 参考提供的引用内容。 提供的引用: - [^1]: request.getSession().setAttribute("usr",username); 把username返回值保存到session当前会话中,名称为usr,只要当前会话不过期,任何地方都可以访到。 - [^2]: request.setAttribute()session.setAttribute()request.getParameter()的联系区别。使用response.sendRedirect("/hello.jsp");转到hello.jsp之后,request对象是新建的,属性值自然没有了。但使用session代替request就还是可以的。session.setAttribute("user","1234"); session.getAttribute("user"); - [^3]: request对象是javax.servlet.httpServletRequest类型的对象。代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。作用域为一次请求。 - [^4]: request.getAttribute()request.setAttribute()session.setAttribute()。httpservletrequest封装了客户端浏览器的请求,包括地址、参数、数据等。 用户的问题焦点是request.session,但正确的术语应该是request.getSession(),因为session是通过HttpServletRequest的getSession()方法获取的。 关键点: - **request对象**:代表一次HTTP请求,作用域仅限于当前请求。请求结束后,request对象销毁。 - **session对象**:代表用户会话,作用域跨越多个请求,直到会话过期或失效。 - **方法**: - request.getSession(): 获取当前会话的HttpSession对象。如果没有会话,则创建一个。 - session.setAttribute(String name, Object value): 设置属性到会话中。 - session.getAttribute(String name): 从会话中获取属性。 - request.setAttribute(String name, Object value): 设置属性到request对象中,仅限当前请求。 - request.getParameter(String name): 获取请求参数(如查询字符串或表单数据)。 回答结构: 1. **解释request.session的含义**:澄清request.session不是直接存在的;正确方式是request.getSession()来获取session对象。 2. **session的作用**:存储用户会话数据,跨多个请求。 3. **使用方法**: - 如何获取session。 - 如何设置获取属性。 - 作用域生命周期。 4. **request区别**:强调request的作用域是单次请求,session是会话级别。 5. **问题解决方案**:常见问题如数据丢失(使用request.setAttribute后重定向会丢失数据,建议使用session)。 6. **生成相关问题**:在最后添加相关问题。 使用引用: - 在解释时,自然地引用提供的引用内容。例如,当谈到session作用域时,引用[^1][^2]。 - 引用标识放在段落末尾。 回答语言:中文。 生成相关问题:类似于示例,添加“§§相关问题§§”部分。 大纲: 1. 引言:解释request.getSession()的作用。 2. session的作用:详细说明。 3. 使用方法:代码示例。 4. request区别:对比request.setAttributesession.setAttribute。 5. 常见问题解决方案:如重定向时数据丢失。 6. 相关问题。</think>### request.getSession() 的作用使用方法 在 Java Web 开发中,`request.getSession()` 是 `HttpServletRequest` 对象的一个核心方法,用于管理用户会话(session)。它允许服务器在多个 HTTP 请求之间存储共享用户数据,确保用户在浏览网站时保持状态。以下我将逐步解释其作用、使用方法、常见问题解决方案,并结合引用内容说明。 #### 1. **request.getSession() 的作用** - **会话管理**:`request.getSession()` 获取或创建一个 `HttpSession` 对象,该对象代表用户服务器的会话。会话数据存储在服务器端,并通过唯一的 session ID 客户端关联(通常通过 Cookie 或 URL 重写实现)。 - **数据持久化**:会话数据(如用户登录信息、购物车内容)在多个请求中保持可用,只要会话未过期(默认超时时间通常为 30 分钟)。这 `request` 对象不同,`request` 仅在一次 HTTP 请求内有效,请求结束后数据即销毁[^3]。 - **应用场景**:适合存储跨页面或跨请求的数据,例如用户认证后保存用户名,避免每次请求都重新验证[^1][^2]。 #### 2. **request.getSession() 的基本使用方法** 以下是典型的使用代码示例(基于 Java Servlet): ```java // 获取当前会话(如果不存在则创建) HttpSession session = request.getSession(); // 设置会话属性(存储数据) session.setAttribute("username", "user123"); // "username" 是键,"user123" 是值 // 获取会话属性(读取数据) String username = (String) session.getAttribute("username"); // 需要类型转换 // 删除会话属性 session.removeAttribute("username"); // 使会话失效(如用户登出时) session.invalidate(); ``` - **关键点**: - 使用 `setAttribute(String name, Object value)` 存储数据,支持任意对象类型。 - 使用 `getAttribute(String name)` 读取数据,返回 `Object` 类型,需强制转换。 - 会话超时可通过 `session.setMaxInactiveInterval(int seconds)` 设置,或在 `web.xml` 中全局配置。 - ** request区别**: - `request.setAttribute()` 用于在当前请求内传递数据(如转发到 JSP),但重定向(`response.sendRedirect()`)后 request 对象会重建,数据丢失[^2][^3]。 - `session.setAttribute()` 数据在会话期间持久化,适合重定向场景[^2]。 #### 3. **常见问题解决方案** - **问题:重定向后数据丢失** - **原因**:使用 `request.setAttribute()` 后调用 `response.sendRedirect()`,request 对象被销毁。 - **解决方案**:改用 `session.setAttribute()` 存储数据,确保数据在重定向后仍可访问[^2]。 ```java // 错误示例:request.setAttribute 后重定向,数据丢失 request.setAttribute("message", "Hello"); response.sendRedirect("/result.jsp"); // request 重建,message 消失 // 正确示例:使用 session 避免数据丢失 session.setAttribute("message", "Hello"); response.sendRedirect("/result.jsp"); // 在 result.jsp 中可通过 session.getAttribute 获取 ``` - **问题:会话数据未更新或过期** - **原因**:会话超时或未正确设置属性。 - **解决方案**: - 检查会话超时时间:通过 `session.getMaxInactiveInterval()` 确认。 - 确保属性名称一致:如 `session.setAttribute("user", name)` `session.getAttribute("user")` 使用相同键名。 - 在用户登出时调用 `session.invalidate()` 清理会话[^1]。 - **问题:性能开销** - **原因**:会话数据存储在服务器内存,过多数据会影响性能。 - **解决方案**:只存储必要数据(如用户 ID),避免大型对象;使用数据库或缓存管理会话状态。 #### 4. **最佳实践** - **作用域选择**: - 单次请求内共享数据:用 `request.setAttribute()`(如转发到 JSP)。 - 跨请求共享数据:用 `session.setAttribute()`(如用户会话)。 - **安全考虑**:会话数据可能被窃取,建议使用 HTTPS 设置 `HttpOnly` Cookie 保护 session ID。 - **引用说明**:`request.getSession().setAttribute("usr",username)` 将用户名保存到会话中,任何页面或请求在会话有效期内均可访问[^1]。而 `request` 对象仅封装单次请求信息,如参数或头数据[^3][^4]。 通过合理使用 `request.getSession()`,您可以高效管理用户状态,避免常见的数据丢失问题。如果您有具体代码场景,我可以进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值