目录结构
一个 Web 应用程序以结构化的目录层次结构存在。层次结构的根目录作为文件的归档目录,这些文件是应用的一部分。例如,对于 Web 容器中一个 Web 应用程序的上下文路径/catalog,在 Web 应用程序层次结构中的 index.html 文件,或在 WEB-INF/lib 目录下的 JAR 文件中的META-INF/resources 目录下包括的 index.html 文件,可以满足从 /catalog/index.html送达的请求。如果在根上下文中和应用的 WEB-INF/lib 目录下的 JAR 文件中的 META-INF/resources 目录中都存在一个 index.html 文件,那么必须使用根上下文中的index.html。匹配的 URL 到上下文路径的规则安排在第12章:“请求映射到servlet”中。由于应用的上下文路径确定了 Web 应用内容的 URL 命名空间,Web容器必须拒绝 Web 应用定义的上下文路径,因为可能在这个 URL 命名空间中导致潜在的冲突。例如,试图部署两个具有相同上下文路径的 Web 应用时可能发生这种情况。由于把请求匹配到资源是区分大小写的,所以在确定潜在冲突时也必须区分大小写。
应用程序层次结构中存在一个名为“WEB-INF”的特殊目录。这个目录包含了与应用程序相关的所有东西,这些东西不在应用程序的归档目录中。大多数 WEB-INF 节点都不是应用程序公共文档树的一部分。除了 WEB-INF/lib 目录下打包在 JAR 文件中 META-INF/resources 目录下的静态资源和 JSP 文件之外,WEB-INF 目录下包含的其他任何文件都不能由容器直接提供给客户端访问。然而,WEB-INF 目录中的内容可以通过 servlet代码调用 ServletContext 的 getResource 和 getResourceAsStream方法来访问,并可使用 RequestDispatcher 调用公开这些内容。因此,如果应用开发人员想通过 servlet 代码访问这些内容,而不愿意直接对客户端公开应用程序指定配置信息,那么可以把它放在这个目录下。由于把请求匹配到资源的映射区分大小写,例如,客户端请求‘/WEB-INF/foo’,‘/WEb-iNf/foo’,不应该返回位于/WEB-INF下的Web应用程序的内容,也不应该返回其中任何形式的目录列表。
WEB-INF目录中的内容有:
- /WEB-INF/web.xml 部署描述文件。
- servlet 和实用工具类目录 /WEB-INF/classes/。此目录中的类对应用程序类加载器必须是可见的。
- java 归档文件区域 /WEB-INF/lib/*.jar。这些文件中包括了servlet,bean,静态资源和打包在JAR文件中的 JSP 文件,以及其他对Web 应用程序有用的实用工具类。Web 应用程序的类加载器必须能够从这些归档文件中加载类。
Web 应用程序类加载器必须先从 WEB-INF/classes 目录下加载类,然后从 WEB-INF/lib 目录下的 JAR 库中加载。此外,除了静态资源打包在JAR 文件中的情况外,任何来自客户端的请求访问 WEB-INF/目录中的资源必须返回一个 SC_NOT_FOUND(404)的响应。
应用程序目录结构示例
下面是一个示例 Web 应用程序的文件清单:
/index.html
/howto.jsp
/feedback.jsp
/images/banner.gif
/images/jumping.gif
/WEB-INF/web.xml
/WEB-INF/lib/jspbean.jar
/WEB-INF/lib/catalog.jar!/META-INF/resources/catalog/moreOffers/books.html
/WEB-INF/classes/com/mycorp/servlets/MyServlet.class
/WEB-INF/classes/com/mycorp/util/MyUtils.class