一、ServletContext简介
当Servlet容器在启动一个web应用时,会为它创建唯一的ServletContext对象。当Servlet容器终止一个web应用,则就会销毁它的ServletContext对象。
ServletContext,是一个全局的存储信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可以多个,session,一个用户一个,而servletContext,所有用户公用一个。所以为了节省空间,提高效率ServletContext中要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。
换种方式说,运行在Java虚拟机中每一个web应用程序都有一个与之相关的Servlet上下文。ServletContext对象时Web服务器中的一个已知根路径,Servlet上下文被定位于http://localhost:8080/项目名。/项目名 称为上下文路径,一个ServletContext对象表示了一个Web应用程序的上下文。
Servlet上下文:Servlet上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问,Servlet上下文API用于设置应用程序中所有Servlet共有的信息,Servlet可能需要共享他们之间的共有信息,运行于同一服务器的Servlet有时也会共享资源,如jsp页面、文件和其他Servlet、
举例说明:
如,做一个购物类网站,要从数据库中提取物品信息,如果用session保存这些物品信息,每个用户都访问一遍数据库,效率就太低了;所以要用servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入servlet上下文中,这样,每个用户只用从上下文中读入物品信息就行了。
另外在jsp文件中,application是ServletContext的实例,由jsp容器默认创建,在servlet中调用getServletContext()得到ServletContext的实例。每个应用都会有一个ServletContext对象与之关联,当容器分布在多个虚拟机上时,web应用在所分布的每个虚拟机上都拥有一个ServletContext实例。
二、ServletContext接口简介
ServletContext接口定义了运行servlet的web应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。设置ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他Servlet的属性。
获取ServletContext实例:
1、通过ServletConfig接口的getServletContext()方法获得。
2、通过GenericServlet抽象类的getServletContext()方法获得,不过看源码发现这个方法其实也是调用了ServletConfig的getServletContext()方法。
3、HttpServlet类继承了GenericServlet抽象类,所以也可以通过getServletContext()获取。
三、ServletContext用途:
1、访问web应用的初始化参数和属性:
getInitParameter
getInitParameterNames
应用开发人员利用初始化参数传递配置信息,典型的例子是web管理员的e-mail地址或一个持有关键数据的系统名称。
在web.xml文件中配置初始化参数:
<context-param> <param-name>email</param-name> <param-value>xxxxxx</param-value> </context-param>
在servlet中访问初始化参数:
String email=this.getServletContext().getInitParameter("email"); System.out.println(email);
2、上下文属性:
servlet可以通过名称将对象属性绑定到上下文,任何绑定到上下文属性都可以被同一个web应用的其他 servlet使用。
setAttribute
getAttribute
getAttributeNames
romoveAttribute
当信息需要在运行于分布式环境中的servlet之间共享时,信息被放入会话中,存储于数据库中,或者存储于EJB组件中。
3、访问web应用的静态资源
使用servletContext接口可以直接访问web应用中的静态内容文档接口,包括html,gif和jpeg文件。
getResource
getResourceAsStream
这两个方法的参数都是以"/"开头的字符串,表示资源相对于context根的相对路径。文档结构可以存在于服务器文件系统,或是在远程服务器上,或其他位置。但是不可以用来获得动态资源,比如getResource("/index.jsp"),这个方法将返回该jsp文件的源码,而不是动态页面。
web应用资源的完整列表可以使用getResourcePaths(String path)方法返回。
另外,每个servlet上下文都需要一个临时的存储目录,servlet容器必须为每个servlet上下文提供一个私有的临时目录,并且使它可以通过javax.servlet.context.tempdir上下文属性可用。