Servelt上下文

本文详细介绍了ServletContext接口的作用及其在Web应用程序中的应用。解释了如何通过此接口进行上下文属性的设置和获取,初始化参数的访问,以及如何获取资源的URL。同时讨论了其在分布式容器中的特性。

 WEB应用程序是Servlet,jsp页面,标签组件和JavaBean组合而成的。

ServletContext接口简介:

ServletContext接口用来定义了一个Servlet的环境对象。也可是认为这是多个客户端共享的信息,它与session的区别在于应用范围的不同,session只对应于一个用户。ServletContext接口定义了运行servletweb应用的servlet视图。容器供应商负责提供servlet容器内ServletContext接口的实现。使用ServletContext对象,servlet可以记录事件日志,获取资源的URL地址,并且设置和保存上下文内可以访问的其他servlet的属性。
ServletContextweb的已知路径为根路径。比如,假定一个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应用组成的静态内容文档层级的直接访问,包括HTMLGIFJPEG文件:
 
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 上下文不可见。
 
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值