servlet-ServletContext接口

研究:javax.servlet.ServletContext接口

就说说以下这几个问题
1. ServletContext到底是什么?什么时候被创建?什么时候被销毁?一个web项目创建几个?

  • ServletContext被翻译为:Servlet上下文【context一般都被翻译为上下文的意思】
  • 一个webapp只有一个web.xml文件,web.xml文件在服务器启动阶段被解析
  • 一个webapp只有一个ServletContext对象,ServletContext在服务器启动阶段被实例化
  • ServletContext在服务器被关闭的时候被销毁
  • 一个ServletContext对应的是web.xml文件,是web.xml文件的代表
  • ServletContext是所有Servlet对象四周环境的代表【在同一个webapp中,所有Servlet对象共享一个“四周环境对象,这个对象就是ServletContext”】
  • 所有用户若想共同一个数据,可以将这个数据放在ServletContext对象中
  • 一般放到ServletContext对象的数据是不建议涉及到修改操作的,因为ServletContext是多线程共享的一个对象,修改的时候会存在线程安全问题。

2. ServletContext接口中有哪些常用的方法?

  • void setAttribute(String name,Object object) :向servletContext范围中添加数据,类似map.set(key,value)
  • Object getAttribute(String name) :从servletContext中获取数据 类似Object value = map.get(key)
  • void removeAttribute(String name) :移除ServletContext范围中的数据
    类似 map.remove(key)
    上边的方法仔细一看是不是就是map集合?

String getInitParameter(String name)
Enumeration getInitparameterNames()

String getRealPath(String path)

3. servlet、ServletConfig、ServletContext之间的联系?

  • 一个servlet对应一个ServletConfig,100个servlet对应一百个ServletConfig
  • 所有的Servlet共享一个ServletConfig对象(关于这个你可以做一个实验,创建两个类Aservlet和Bservlet都实现Servlet接口,然后都调用getServletContext()方法,你会发现,得到的内存地址是一样的)他的内存地址是一樣的
    web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5">
	
	<!-- 定义初始化参数 (整个应用都可以共享的初始化参数)-->
	<!-- web.xml文件中配置上下文参数,这些信息被自动封装到ServletContext中-->
	<context-param>
		<param-name>name</param-name>
		<param-value>admin</param-value>
	</context-param>	
	
	<context-param>
		<param-name>password</param-name>
		<param-value>123</param-value>
	</context-param>	
	
	<!-- 注册Servlet -->
	<servlet>
		<servlet-name>a</servlet-name>
		<servlet-class>com.javaweb.servlet.Aservlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>a</servlet-name>
		<url-pattern>/a</url-pattern>
	</servlet-mapping>
	
		<!-- 注册Servlet -->
	<servlet>
		<servlet-name>b</servlet-name>
		<servlet-class>com.javaweb.servlet.Bservlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>b</servlet-name>
		<url-pattern>/b</url-pattern>
	</servlet-mapping>
	
</web-app>

常用方法1 String getInitParameter(String name)
就还是通过name获取value的形式

public void service(ServletResquest request,ServletResponse response)throws ServletException, IOException{
	//获取servletConfig
	ServletConfig config  = getServletConfig();
	//获取ServletContext
	ServletContext application = config.getServletContext();
	//out.print(application.toString());
	//获取所有上下文初始化参数的name
	application.getInitParameterNames
}

常用方法2 Enumeration getInitparameterNames()
跟ServletConfig下的 Enumeration getInitparameterNames()一样,具体使用方法不在这里赘述,使用方法点击 这里

常用方法3、4、5
void setAttribute(String name,Object object)
Object getAttribute(String name)
void removeAttribute(String name)

HTML文件
就俩超链接
点击BServlet的时候存储数据
点击AServlet的时候打印数据

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>测试ServletContext</title>
	</head>
	<body>
		<a href = "/03-servletContext/some">AServlet</a>
		<br><br>
		<a href = "/03-servletContext/other">BServlet</a>
	</body>
</html>

创建一个实体类User,生成set、get和toString方法即可

public class User {
	private String usercode;
	private String username;
	public String getUsercode() {
		return usercode;
	}
	public void setUsercode(String usercode) {
		this.usercode = usercode;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	@Override
	public String toString() {
		return "User [usercode=" + usercode + ", username=" + username + "]";
	}

AServlet类存储数据

@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// 获取ServletConfig
		ServletConfig config = getServletConfig();
		// 获取ServletContext
		ServletContext application = config.getServletContext();
		//创建User
		User user = new User();
		user.setUsercode("123");
		user.setUsername("mayun");
		//向ServletContext中存储数据
		application.setAttribute("userObj",	user);
	}

BServlet类打印到浏览器

@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// 获取ServletContext
		ServletContext application = config.getServletContext();
		//从ServletContext范围中读取数据
		Object obj = application.getAttribute("userObj");
		//将ServletContext范围中获取的数据打印到浏览器
		response.getWriter().print(obj);
	}

结果就是如果你先点BServlet你就会得到一个null,因为你还没存储呢,要是先点AServlet再点BServlet就会得到你存储的数据了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值