servlet里Map对象存进Session,在JSP里取出来以后Map里面值为空,这是为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet里Map对象存进Session,在JSP里取出来以后Map里面值为空,这是为啥?相关的知识,希望对你有一定的参考价值。

servlet中的代码:

try
HttpSession session = request.getSession(true);
Map cart = request.getParameterMap(); //这里的Map是有数据的。

//这里来输出cart的话是没有问题的。

session.setAttribute("cart", cart);
response.sendRedirect("gouwuche.jsp");
finally
out.close();


gouwuche.jsp页面代码:

<%

Map cart = (Map)session.getAttribute("cart");

Iterator iter= cart.entrySet().iterator();

while(iter.hasNext())



Map.Entry entry = (Map.Entry)iter.next();

String key = (String)entry.getKey();

String val = null;

Object obj = entry.getValue();

if (obj instanceof String[])


String[] strs = (String[])obj;
val = Arrays.toString(strs);
else
val = obj.toString();


out.println(key + "---" + val);



%>

运行后没有输出值,因为While里面的内容都没有运行。同样的输出语句放在servlet里面就能正常输出。说明从JSP里取出来的Map出了问题,注释掉这一行: while(iter.hasNext()) 直接输出第一个值, 运行会抛出异常: nosuchelementexception 这是为什么?怎么能让JSP取出的Map同Servlet中的一样有值?

参考技术A request.getParameterMap()
request里取出的对象可能会在请求结束后被销毁,把值取出来加入到一个集合里去,把集合放入session试试本回答被提问者采纳
参考技术B
request.getRequestDispatcher("/xxx.jsp").forward(request, response);
吧,用response.sendRedirect()转向之后session的不能传递过去的

压测session优化

每请求一次jsp页面,会产生一个session对象,并且这个对象30分钟后才过期。我们计算了下当时的QPS是5000,也就是说每秒钟产生5000个session对象。每分钟产生300K个对象,session是个map对象,比较大,这样很快就会把内存撑爆。

解决办法如下:

1.在page指令里添加session=false。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="false" %>

2.把session的过期时间设成1分钟。

<session-config>
<session-timeout>1</session-timeout>
</session-config>

以上是关于servlet里Map对象存进Session,在JSP里取出来以后Map里面值为空,这是为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet 分页保存查询条件

jquery中怎么访问session中存的对象?

手搓SSM

重温Servlet学习笔记--session对象

在Servlet中如何获取Session对象?

2018/1/3 Servlet+cookie+session