WEB应用程序是Servlet,jsp页面,标签组件和JavaBean组合而成的。
ServletContext接口简介:
ServletContext接口用来定义了一个Servlet的环境对象。也可是认为这是多个客户端共享的信息,它与session的区别在于应用范围的不同,session只对应于一个用户。ServletContext接口定义了运行servlet的web应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性。
ServletContext以web的已知路径为根路径。比如,假定一个servlet上下文位于http://www.sun.com/products。以/products请求路径开头的所有请求,已知为上下文路径,被路由到和该ServletContext关联的web应用。
ServletContext接口作用域:
容器中部署的每一个
web
应用都有一个
ServletContext
接口的实例对象与之关联。如果容器被分布在多个虚拟机上,一个
web
应用将在每一个
VM
中有一个
ServletContext
实例。
不作为
web
应用一部分部署的容器中的
servlet
默认是“默认”
web
应用的一部分,有一个默认的
ServletContext
。
在分布式容器中。默认
ServletContext
是非分布式的,并且必须只存在于一个
VM
中。
初始化参数:
ServletContext
接口的初始化参数允许
servlet
访问与
web
应用相关的上下文初始化参数,这些由应用开发人员在部署描述符中指定:
•
getInitParameter
•
getInitParameterNames
应用开发人员利用初始化参数传送配置信息。典型的例子是
web
管理员的
e-mail
地址或者一个持有关键数据的系统名称。
上下文属性:
servlet
可以通过名称将对象属性绑定到上下文。任何绑定到上下文的属性可以被同一个
web
应用的其他
servlet
使用。
ServletContext
接口的下列方法允许访问这种功能:
•
setAttribute
•
getAttribute
•
getAttributeNames
•
removeAttribute
分布式容器中的上下文属性:
上下文属性对于创建它们的
VM
来说是本地的。这防止
ServletContext
属性存储于分布式容器的共享内存中。当信息需要在运行于分布式环境中的
servlet
之间共享时,信息被放入会话中(参见第
7
章“会话”),存储于数据库中,或者存储于
EJB
组件中。
资源:
ServletContext接口通过下列方法提供对web应用组成的静态内容文档层级的直接访问,包括HTML,GIF和JPEG文件:
•
getResource
•
getResourceAsStream
getResource
和
getResourceAsStream
方法以“
/
”开头的字符串为参数,它指定上下文根路径的资源相对路径。文档的层级可能存在于服务器的文件系统,
war
文件,远程服务器或者在一些其它位置中。
这些方法不用来获取动态内容。比如,在一个支持
JSP
规范
1
的容器中,
getResource("/index.jsp")
这种形式的方法调用将返回
JSP
源代码,而不是处理后的输出。关于访问动态内容的更多信息参见第
8
章“转发请求”。
Web
应用资源的完整列表可以使用
getResourcePaths(String path)
方法访问。该方法语义的完整信息可以在本规范的
API
文档中找到。
多个主机和ServletContext:
Web服务器可能支持一个服务器上多个逻辑主机共享一个IP地址。这功能有时被称为“虚拟主机”。这种情况下,每一个逻辑主机必须有它自己的servlet上下文或者servlet上下文组。Servlet上下文不可以被多个虚拟主机共享。
重载考虑:
尽管容器供应商因为对于易于开发而实现的类加载不做要求,但是任何那样的实现必须确保所有它们可能使用
2
的所有
servlet
和类,被加载在单个类加载器作用域内。必须保证应用应该如开发人员预想的那样运转。作为开发辅助,绑定监听器的会话通知的完整语义应当由容器支持,在类加载上会话终止的监听上使用。
上一代的容器创建新的类加载器以加载
servlet
,这和用来加载
servlet
上下文中使用的其他
servlet
或者类的类加载器不同。这可能造成
servlet
上下文内的对象引用指向一个意想不到的类或对象,造成意想不到的行为。需要阻止由新一代类加载器所引发的问题。
临时工作目录:
每一个
servlet
上下文都需要一个临时存储目录。
Servlet
容器必须为每一个
servlet
上下文提供一个私有的临时目录,并且使它可以通过
javax.servlet.context.tempdir
上下文属性可用。这些属性关联的对象必须是
java.io.File
类型。
这项需求认可了很多
servlet
引擎实现中提供的常见便利。容器不需要在
servlet
重启时维持临时目录的内容,但是需要确保一个
servlet
上下文的临时目录的内容对于该
servlet
容器上运行的其他
web
应用的
servlet
上下文不可见。