WEB-INF 在 Java EE Web 应用程序中的用途是什么?

2022-08-31 06:17:28

我正在开发具有以下源代码目录结构的Java EE Web应用程序:

src/main/java                 <-- multiple packages containing Java classes
src/test/java                 <-- multiple packages containing JUnit tests
src/main/resources            <-- includes properties files for textual messages
src/main/webapp/resources     <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views

我感兴趣的文件夹是:它包含,用于设置servlet的XML文件,Spring Bean连接上下文以及JSP标签和视图。我试图理解是什么约束/定义了这个结构。例如,JSP文件是否总是必须在其中,或者它们可以在其他地方?还有什么可能进入的吗?维基百科的WAR文件条目提到了Java类和JAR文件 - 除了其他源文件位置之外,我不确定我是否完全掌握了何时需要这些。WEB-INFweb.xmlWEB-INFWEB-INFclasseslib


答案 1

Servlet 2.4 规范对 WEB-INF 这样说(第 70 页):

应用程序层次结构中存在一个名为 的特殊目录。此目录包含与应用程序相关的所有内容,这些内容不在应用程序的文档根目录中。WEB-INF 节点不是应用程序的公共文档树的一部分。容器不能将目录中包含的任何文件直接提供给客户端。但是,目录的内容对于使用 和 上的方法调用的 servlet 代码是可见的,并且可能使用调用公开。WEB-INFWEB-INFWEB-INFgetResourcegetResourceAsStreamServletContextRequestDispatcher

这意味着 Web 应用程序的资源加载程序可以访问资源,而公众不能直接看到资源。WEB-INF

这就是为什么许多项目将他们的资源,如JSP文件,JAR/库和他们自己的类文件或属性文件或任何其他敏感信息放在文件夹中。否则,它们可以通过使用简单的静态URL(例如,用于加载CSS或Javascript)来访问它们。WEB-INF

从技术角度来看,您的 JSP 文件可以位于任何地方。例如,在Spring中,您可以将它们显式配置为:WEB-INF

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" 
    p:suffix=".jsp" >
</bean>

维基百科的 WAR 文件文章中提到的 和 文件夹是运行时 Servlet 规范所需的文件夹示例。WEB-INF/classesWEB-INF/lib

在项目的结构和生成的 WAR 文件的结构之间做出区分非常重要。

在某些情况下,项目的结构将部分反映 WAR 文件的结构(对于静态资源,如 JSP 文件或 HTML 和 JavaScript 文件,但情况并非总是如此。

从项目结构到生成的 WAR 文件的转换由生成过程完成。

虽然您通常可以自由地设计自己的构建过程,但现在大多数人会使用标准化的方法,例如Apache Maven。除此之外,Maven 还为项目结构中的哪些资源定义默认值,这些资源映射到生成的工件中的哪些资源(在本例中,生成的工件是 WAR 文件)。在某些情况下,映射由纯复制过程组成,在其他情况下,映射过程包括转换,例如筛选或编译等。

例如:该文件夹稍后将包含类加载器需要加载以启动应用程序的所有已编译的 java 类和资源( 和 )。WEB-INF/classessrc/main/javasrc/main/resources

另一个示例:该文件夹稍后将包含应用程序所需的所有 jar 文件。在 maven 项目中,将为您管理依赖项,maven 会自动将所需的 jar 文件复制到您的文件夹中。这就解释了为什么在 maven 项目中没有文件夹。WEB-INF/libWEB-INF/liblib


答案 2

在部署 Java EE Web 应用程序(无论是否使用框架)时,其结构必须遵循一些要求/规范。这些规格来自:

  • servlet 容器(例如 Tomcat)
  • Java Servlet API
  • 您的应用程序域
  1. Servlet 容器要求
    如果您使用 Apache Tomcat,则必须将应用程序的根目录放在 webapp 文件夹中。如果您使用其他 Servlet 容器或应用程序服务器,则情况可能会有所不同。

  2. Java Servlet API 要求
    Java Servlet API 指出,您的根应用程序目录必须具有以下结构:

    ApplicationName
    |
    |--META-INF
    |--WEB-INF
          |_web.xml       <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
          |_classes       <--Here goes all the classes of your webapp, following the package structure you defined. Only 
          |_lib           <--Here goes all the libraries (jars) your application need
    

这些要求由 Java Servlet API 定义。

3. 您的应用程序域
既然您已经遵循了 Servlet 容器(或应用程序服务器)的要求和 Java Servlet API 的要求,您可以根据需要组织 Web 应用程序的其他部分。
- 您可以将资源(JSP 文件、纯文本文件、脚本文件)放在应用程序根目录中。但是,人们可以直接从浏览器访问它们,而不是由应用程序提供的某些逻辑处理他们的请求。因此,为了防止像这样直接访问您的资源,您可以将它们放在 WEB-INF 目录中,其内容只能由服务器访问。
- 如果您使用某些框架,它们通常使用配置文件。这些框架中的大多数(struts,spring,hibernate)都要求您将其配置文件放在类路径(“classes”目录)中。


推荐