Web 应用部署描述符
Web 应用程序部署描述文件(见第14章,“部署描述文件”)的配置和部署信息包括以下几种类型:
- ServletContext 的初始化参数
- Session 配置
- Servlet/JSP 的定义
- Servlet/JSP 的映射
- MIME 类型映射
- 欢迎文件列表
- 错误页面
- 安全
扩展的依赖关系
当许多应用程序使用相同的代码或资源,通常将它们安装在容器的库文件中。这些文件往往是通用的或标准的 API,可以在不牺牲可移植性的情况下使用。仅由一个或几个应用程序使用的文件将作为 Web 应用程序的一部分来访问。容器必须为这些库提供一个目录。放置在这个目录中的文件必须对所有的Web应用可见。此目录的位置由容器指定。servlet 容器用于加载这些库文件的类加载器必须和在同一个 JVM 中的所有 Web 应用的类加载器相同。这个类加载器的实例必须在 Web 应用程序类加载器的父类加载器链中。
为了保持可移植性,应用程序开发人员需要知道 Web 容器中安装了哪些扩展,而容器需要知道 WAR 中的 servlet 依赖哪些库。
依赖这样的扩展的应用开发人员必须在 WAR 文件中提供一个列出所有 WAR 文件所需扩展的 META-INF/MANIFEST.MF 文件。清单文件的格式应该遵循标准的 JAR 清单格式。在部署 Web 应用程序的时候,Web容器必须使正确的扩展版本对遵循可选包版本控制(Optional Package Versioning)机制(http://java.sun.com/j2se/1.4/docs/guide/extensions/)定义的规则的应用程序可见。
Web 容器也必须能够识别出 WAR 文件中 WEB-INF/lib 目录下的任意一个 JAR 包中的清单文件声明的依赖关系。
如果 Web 容器不能够满足以这种方式声明的依赖关系,它应该使用一条有意义的错误消息拒绝该应用程序。
Web 应用程序类加载器
容器用于加载 WAR 文件中 servlet 的类加载器必须允许开发人员使用getResource 加载遵循正常 JavaSE 语义的 WAR 文件的 JAR 包中包含的任何资源。和 Java EE 许可协议中描述的一样,不属于 Java EE 产品的 servlet 容器不应该允许应用程序覆盖 Java SE 平台中的类,如在 java. 和 javax. 命名空间中的类,Java SE 不允许进行修改。容器不应该允许应用程序覆盖或访问容器的实现类。同时建议应用程序类加载器实现成 WAR 文件中的类和资源优先于属于容器范围内的 JAR 包中的类和资源加载。一个类加载器的实现必须保证对部署到容器的每个 web 应用,调用 Thread.currentThread.getContextClassLoader() 返回一个实现了本节规定的约定的 ClassLoader 实例。此外,部署的每个 Web应用程序的 ClassLoader 实例必须是一个单独的实例。容器必须在任何回调(包括侦听器回调)到Web应用程序之前设置上面描述的线程上下文 ClassLoader,一旦回调返回,需要把它设置成原来的 ClassLoader。