java得到session的值_java – 从session属性获取数据返回空指针

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String name = request.getParameter("name"); // get param

List list = new ArrayList(); // create list

HttpSession session = request.getSession(); // create a session handler object

// if this is new session , add the param to the list, then set the list as session atr

if(session.isNew()) {

System.out.println("in new session");

// this is a new session , add the param to the new list, then add list to session atr

list.add(name);

session.setAttribute("list", list);

}else{

System.out.println("in old session");

// THIS SESSION ALREADY EXISTS (THERE IS DATA IN LIST THAT WE NEED, THAT DATA IS STORED IN SESSION ATR)

// get the session atr , then store the content of a atr list, to this new list

list = (List)session.getAttribute("list");

// add the new item to the list

list.add(name);

// set the new session atr, now with this newly added item

session.setAttribute("list", list);

}

我的评论几乎就是这么说的.我从jsp页面重定向来自提交的地方,获取名称,创建列表和会话处理程序.

该程序的一点是将用户输入保存在列表中.显然,我需要会话,所以我可以在用户之间做出改变,并为不同的用户提供不同的列表.我在else语句中获取空指针异常,我尝试检索已存在的列表,以便我可以在其中添加更多项.我错过了什么?谢谢

解决方法:

这确实不是维护会话范围对象的正确方法.您依赖于HttpSession#isNew(),它只会在HTTP会话是新的时返回true,而不是在会话范围对象不存在时返回.如果在调用servlet之前已经(隐式)创建了会话,那么isNew()将返回false.例如,当您打开没有的JSP页面时事先在同一个会话中.

您应该检查是否存在感兴趣的会话作用域对象.

所以,而不是:

HttpSession session = request.getSession();

List list = new ArrayList();

if (session.isNew()) {

list.add(name);

session.setAttribute("list", list);

} else {

list = (List) session.getAttribute("list");

list.add(name);

session.setAttribute("list", list);

}

你应该这样做:

HttpSession session = request.getSession();

List list = (List) session.getAttribute("list");

if (list == null) {

list = new ArrayList();

session.setAttribute("list", list);

}

list.add(name);

请注意,您不需要将该列表放回会话中.会话不包含List对象的副本,正如您在PHP等过程语言中所期望的那样. Java是一种面向对象的语言.会话保存对List对象的引用的副本.对List等可变对象的所有更改都会反映在所有引用中.

标签:java,servlets

来源: https://codeday.me/bug/20190829/1763199.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值