一、ServletContext定义:
- ServletContext是一个接口。
- ServletContext接口由web服务器实现。
- ServletContext对象在web服务器启动的时候创建,一个webapp只有一个ServletContext对象。
- ServletContext对象在web服务器关闭时销毁。
- ServletContext对象还有另外一个名字:应用域
二、获取ServletContext对象的方法:
ServletConfig对象的getServletContext()
方法/继承了GenericServlet类的Servlet对象的getServletContext()
方法。
三、ServletContext作用:
- ServletContext就是整个web.xml文件,所以同一个webapp下不同servlet共享一个ServletContext对象。
四、ServletContext接口中的方法:
web.xml文件的初始化参数配置信息:
<context-param>
<param-name>123param-name>
<param-value>123param-value>
context-param>
- 获取所有
标签中的内容,返回一个集合,
getInitParameterNames()
遍历方法如下:
Enumeration<String> parameterNames = Config.getInitParameterNames();
while(parameterNames.hasMoreElements()){
String parameterName = parameterNames.nextElement();
}
- 根据
中的内容获取对应的
的内容。
getInitParameter("name")
- 获取webapp的根路径,idea中web文件夹是你的根路径,但是根路径名不是web这个根路径名是在部署的时候自己设置的。
getContextPath()
- 获取文件的绝对路径,注意文件需要在根目录下,如果文件位于/根目录/子目录/文件,则需要
getRealPath("/子目录/文件名")
。
getRealPath("/文件名")
- 写日志方法,日志内容位于根目录下的log目录下。
void log(String)
,void log(String,Throwable)
- 向ServletContext应用域中存数据,只适合存取数据量小,所有servlet共享,且不修改的数据,否则应用域范围太大,占用资源太多,拖慢服务器速度。
setAttribute(String name,Object value)
- 从ServletContext应用域中取数据
getAttribute(String name)
- 从ServletContext应用域中删除数据
removeAttribute(String name)
五、关于ServletContext应用域:
- 如果所有的用户共享一份数据,并且这个数据很少的被修改,并且这个数据量很少,可以将这些数据放到SservletContext这个应用域中
- 为什么是所有用户共享的数据?不是共享的没有意义。因为ServletContext这个对象只有一个,只有共享的数据放进去才有意义。
- 为什么数据量要小?因为数据量比较大的话,太占用堆内存,并且这个对象的生命周期比较长,服务器关闭的时候,这个对象才会被销毁。大数据量会影响服务器的性能。占用内存较小的数据量可以考虑放进去。
- 为什么这些共享给的数据很少的修改,或者说几乎不修改?所有用户共享的数据,如果涉及到修改操作,必然会存在线程并发所带来的安全问题。所以放在SservletContext对象中的数据一般都是只读的。
- 数据量小、所有用户共享、又不修改,这样的数据放到ServletContext这个应用域当中,会大大提升效率。因为应用域相当于一个缓存,放在缓存中的数据,下次再用的时候,不需要从数据库中再次获取,大大提升执行效率