上下文对象ServletContext属性的添加修改

上下文对象ServletContext属性的添加修改

2-4小节在老师的RegistServlet当中,处理数据部分老师从ServletContext中获取到userList,然后使用userService.regist(userList, user);也就是把user存入到userList当中。前面虽然有类似相同的问题,但是我想补充问一下。这里将user存入到userList之后,没有使用getServletContext().setAttribute("userList",userList),再次将userList存入到servletcontext上下文对象中,也能生效。请问这是servletcontext对象独有的特性吗,对于session对象是否就不能这么干呢?还有其底层深入一点的原理能帮忙介绍一下吗?

//处理数据
UserService userService = new UserServiceImpl();
//从servletContext域中获取用户的集合即可
List<User> userList = (List<User>) getServletContext().getAttribute("userList");
userService.regist(userList, user);
System.out.println(userList);
//显示处理结果
response.sendRedirect(request.getContextPath()+"/login.jsp");


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,1、List<User> userList = (List<User>) getServletContext().getAttribute("userList");

其中userList的内容是从getServletContext这个作用域中取出的,当前RegistServlet能从getServletContext作用域中取出,那另一个servlet也能从getServletContext作用域中取出,比如LoginServlet也能从这个作用域中取出userList的值。

2、同学举的例子是可以这样理解的,getServletContext作用域是一个空间,当使用setAttribute()就是向这个空间存入某个内容,当使用getAttribute()就是取出这个空间中某个内容。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

好帮手慕阿莹 2019-09-23 16:11:06

1、这不是servletcontext独有的特性哦。session对象也可以这样的。

这里是因为。我们域中存getServletContext().setAttribute("userList",userList) 的时候,这里的userList是一个集合的引用,当这个引用中的内容改变时,ServletContext中存放的userList也就改变了。

举个例子,以下集合中的第一个位置,存的是user的引用地址,当该对象发送变化时,集合中的数据也发生了变化:

package com.imooc.ringside;

public class User {
	String  name;
	String  age;
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(String name, String age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
}
import java.util.ArrayList;
import java.util.List;

import com.imooc.ringside.User;

public class test1 {
	public static void main(String[] args) {
			User user = new User();
			user.setName("张三");
			user.setAge("18");
			List<User> a = new ArrayList<User>();
			a.add(user);
			System.out.println(a);
			User user2 = a.get(0);
			user2.setName("李四");
			user2.setAge("19");
			System.out.println(a);
			 
	}
}

http://img1.sycdn.imooc.com//climg/5d887e1109a947aa03530101.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 向远之航 #1
    老师举的例子我能明白,但是两者间有一个区别:老师的例子是在同一个java类当中,所以List的变量a在这个java类里面一直存在;我问的那个问题里面,List<User> userList = (List<User>) getServletContext().getAttribute("userList");我想这个userList只在RegistServlet里面有效吧。在别的servlet里面,完全可以不采用userList,比如说调用时新创建一个:List<User> listUser = (List<User>) getServletContext().getAttribute("userList")。望解答! 根据老师的举例我有一个理解,不知道正不正确。我想,是不是上下文对象的属性userList具体存在一个空间,这个只不过把它指向了RegistServlet中新创建的List<User> userList,而存储user时确实实实在在地存储到了那个空间,即使RegistServlet中的userList本销毁,也只不过是销毁这个变量。在其它servlet里面,如果需要使用那块空间的数据,再重新创建一个List<User>类型的变量,采用getServletContext().getAttribute("userList")指向那个空间即可。
    2019-09-25 15:59:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师