servletcontext

ServletContext详解

ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,全部用户共用一个。因此,为了节省空间,提升效率,ServletContext中,要放必须的、重要的、全部用户须要共享的线程又是安全的一些信息。

换一种方式说吧,运行在JAVA虚拟机中的每个Web应用程序都有一个与之相关的Servlet上下文。ServletContext对象是Web服务器中的一个已知路径的根,Servlet上下文被定位于http://localhost:8080/项目名.以 /项目名 请求路径(称为上下文路径)开始的全部请求被发送到与此ServletContext关联的Web应用程序。一个ServletContext对象表示了一个Web应用程序的上下文。

Servlet上下文:Servlet上下文提供对应用程序中全部Servlet所共有的各类资源和功能的访问。Servlet上下文API用于设置应用程序中全部Servlet共有的信息。Servlet可能须要共享他们之间的共有信息。运行于同一服务器的Servlet有时会共享资源,如JSP页面、文件和其余Servlet。

举例:

如,作一个购物类的网站,要从数据库中提取物品信息,若是用session保存这些物品信息,每一个用户都访问一便数据库,效率就过低了;因此要用来Servlet上下文来保存,在服务器开始时,就访问数据库,将物品信息存入Servlet上下文中,这样,每一个用户只用从上下文中读入物品信息就好了。

3.1 ServletContext接口简介

ServletContext接口定义了运行servlet的web应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象,servlet能够记录事件日志,获取资源的URL地址,而且设置和保存上下文内能够访问的其余servlet的属性。

ServletContext以web的已知路径为根路径。好比,假定一个servlet上下文位于http://www.lajiaowang.com/new。以/new请求路径开头的全部请求,已知为上下文路径,被路由到和该ServletContext关联的web应用。

3.2 ServletContext接口做用域

容器中部署的每个web应用都有一个ServletContext接口的实例对象与之关联。若是容器被分布在多个虚拟机上,一个web应用将在每个VM中有一个ServletContext实例。

不做为web应用一部分部署的容器中的servlet默认是“默认”web应用的一部分,有一个默认的ServletContext。在分布式容器中。默认ServletContext是非分布式的,而且必须只存在于一个VM中。

3.3 初始化参数

ServletContext接口的初始化参数容许servlet访问与web应用相关的上下文初始化参数,这些由应用开发人员在部署描述符中指定:

getInitParameter

getInitParameterNames

应用开发人员利用初始化参数传送配置信息。典型的例子是web管理员的e-mail地址或者一个持有关键数据的系统名称。

3.4 上下文属性

servlet能够经过名称将对象属性绑定到上下文。任何绑定到上下文的属性能够被同一个web应用的其余servlet使用。ServletContext接口的下列方法容许访问这种功能:

setAttribute

getAttribute

getAttributeNames

removeAttribute

3.4.1 分布式容器中的上下文属性

上下文属性对于建立它们的VM来讲是本地的。这防止ServletContext属性存储于分布式容器的共享内存中。当信息须要在运行于分布式环境中的servlet之间共享时,信息被放入会话中(参见第7章“会话”),存储于数据库中,或者存储于EJB组件中。

3.5 资源

ServletContext接口经过下列方法提供对web应用组成的静态内容文档层级的直接访问,包括HTML,GIF和JPEG文件:

getResource

getResourceAsStream

getResource和getResourceAsStream方法以“/”开头的字符串为参数,它指定上下文根路径的资源相对路径。文档的层级可能存在于服务器的文件系统,war文件,远程服务器或者在一些其它位置中。

这些方法不用来获取动态内容。好比,在一个支持JSP规范1的容器中,getResource("/index.jsp")这种形式的方法调用将返回JSP源代码,而不是处理后的输出。关于访问动态内容的更多信息参见第8章“转发请求”。

Web应用资源的完整列表可使用getResourcePaths(String path)方法访问。该方法语义的完整信息能够在本规范的API文档中找到。

3.6 多个主机和ServletContext

Web服务器可能支持一个服务器上多个逻辑主机共享一个IP地址。这功能有时被称为“虚拟主机”。这种状况下,每个逻辑主机必须有它本身的servlet上下文或者servlet上下文组。Servlet上下文不能够被多个虚拟主机共享。

3.7 重载考虑

尽管容器供应商由于对于易于开发而实现的类加载不作要求,可是任何那样的实现必须确保全部它们可能使用2的全部servlet和类,被加载在单个类加载器做用域内。必须保证应用应该如开发人员预想的那样运转。做为开发辅助,绑定监听器的会话通知的完整语义应当由容器支持,在类加载上会话终止的监听上使用。

上一代的容器建立新的类加载器以加载servlet,这和用来加载servlet上下文中使用的其余servlet或者类的类加载器不一样。这可能形成servlet上下文内的对象引用指向一个意想不到的类或对象,形成意想不到的行为。须要阻止由新一代类加载器所引起的问题。

3.7.1 临时工做目录

每个servlet上下文都须要一个临时存储目录。Servlet容器必须为每个servlet上下文提供一个私有的临时目录,而且使它能够经过javax.servlet.context.tempdir上下文属性可用。这些属性关联的对象必须是java.io.File类型。

这项需求承认了不少servlet引擎实现中提供的常见便利。容器不须要在servlet重启时维持临时目录的内容,可是须要确保一个servlet上下文的临时目录的内容对于该servlet容器上运行的其余web应用的servlet上下文不可见。 java