Java EE Web应用程序中的WEB-INF有什么用?


181

我正在使用以下源代码结构开发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

我感兴趣的一点是WEB-INF-它包含web.xml用于设置servlet的XML文件,Spring bean连线上下文以及JSP标签和视图。

我试图了解什么限制/定义了此结构。例如,JSP文件是否总是必须在其中,WEB-INF或者它们可能在其他地方?还有其他可能会进入的东西WEB-INF吗?Wikipedia的WAR文件条目提到classes了Java类和libJAR文件-不确定除了其他源文件位置之外,我是否已经完全掌握了何时需要这些文件。



1
仅供参考...要了解有关如何从其他位置加载servlet容器的信息WEB-INF,请参阅问题,控制servlet中的类路径,尤其是本答案
罗勒·布尔克

Answers:


220

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

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

这意味着WEB-INF您的Web应用程序的资源加载器可以访问资源,而公众无法直接看到它们。

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

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

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

Wikipedia的WAR文件中提到的WEB-INF/classesWEB-INF/lib文件夹是Servlet规范在运行时所需的文件夹的示例。

重要的是要使项目的结构与生成的WAR文件的结构有所不同。

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

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

尽管您通常可以自由设计自己的构建过程,但如今大多数人将使用诸如Apache Maven之类的标准化方法。Maven定义了项目结构中哪些资源映射到结果工件中哪些资源的默认值(在这种情况下,结果工件是WAR文件)。在某些情况下,映射由普通复制过程组成,而在其他情况下,映射过程包括转换,例如过滤或编译等。

一个示例:该WEB-INF/classes文件夹稍后将包含需要由Classloader加载以启动应用程序的所有已编译Java类和资源(src/main/javasrc/main/resources)。

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



2
Servlet 3.0和3.1(JSR 340)中的更改允许从WEB-INF / lib中存储的JAR中提供静态资源和JSP。引用Servlet 3.1规范第10.5节:除了静态资源和JSP(打包在WEB-INF / lib目录中的JAR文件的META-INF / resources中)外,WEB-INF目录中包含的其他文件均不得由容器直接提供给客户。所以例外仅适用于:WAR> WEB-INF> lib>JAR文件>resources
罗勒布尔克

1
哎呦,从上面的变化我的评论说,最后一句:静态文件可以从送达WAR文件> WEB-INF> lib>JAR文件> META-INF> resources> yourStaticFilesGoHere
罗勒·布尔克

@mwhs我建议您使用新的Servlet 3部分修改您的Answer,并将您的当前内容标记为Servlet 2部分。
罗勒·布尔克

62

部署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的要求,那么就可以根据需要来组织webapp的其他部分。
-您可以将资源(JSP文件,纯文本文件,脚本文件)放在应用程序的根目录中。但随后,人们可以直接从其浏览器访问它们,而无需由您的应用程序提供的某些逻辑来处理他们的请求。因此,为了防止像这样直接访问资源,可以将它们放在WEB-INF目录中,该目录的内容只能由服务器访问。
-如果使用某些框架,则它们通常会使用配置文件。这些框架中的大多数(struts,spring,hibernate)都要求您将其配置文件放在类路径(“ classes”目录)中。


12

您应该将不想公开的任何页面或部分页面放入WEB-INF。通常,JSP或facelet在WEB-INF之外,但是在这种情况下,任何用户都可以轻松访问它们。如果您有一些授权限制,则可以使用WEB-INF。

WEB-INF / lib可以包含您不想在系统级别打包的第三方库(JAR可以用于服务器上运行的所有应用程序),但只能用于此特定应用程序。

一般来说,许多配置文件也都进入WEB-INF。

至于WEB-INF / classes,它存在于任何Web应用程序中,因为这是放置所有已编译源代码的文件夹(不是JARS,而是您自己编写的已编译.java文件)。


4

出于安全原因,遵循此约定。例如,如果允许未经授权的人直接从URL访问根JSP文件,那么他们可以在没有任何身份验证的情况下浏览整个应用程序,并且可以访问所有受保护的数据。


jsp文件是否仍在寻找请求的会话?如果找不到任何内容,则不会显示该网站的某些部分。
parsecer19年

3

将jsp页面放在WEB-INF目录下是一种约定(不是必须的),以使它们不能被深层链接或添加书签。这样,所有对jsp页面的请求都必须通过我们的应用程序定向,以确保用户体验。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.