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

时间:2013-11-05 09:57:31

标签: servlets java-ee war web-inf

我正在使用以下源代码结构编写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还有其他什么可能吗?维基百科的WAR files条目为Java类提及classes,为JAR文件提到lib - 不确定除了其他源文件位置之外还需要它们时我已经完全掌握了。

5 个答案:

答案 0 :(得分:187)

Servlet 2.4 specification说到WEB-INF(第70页):

  

名为的应用程序层次结构中存在一个特殊目录   WEB-INF。该目录包含与之相关的所有内容   应用程序不在应用程序的文档根目录中。的的   WEB-INF节点不是公共文档树的一部分   应用即可。不能提供WEB-INF目录中包含的文件   由容器直接发送给客户端。但是,内容了   使用WEB-INF对servlet代码可见getResource目录   和getResourceAsStream上的ServletContext方法调用可能   使用RequestDispatcher来电曝光。

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

这就是为什么许多项目将其资源(如JSP文件,JAR /库及其自己的类文件或属性文件或任何其他敏感信息)放在WEB-INF文件夹中。否则,可以使用简单的静态URL(例如,加载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>

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

重要的是要区分项目结构和生成的WAR文件的结构。

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

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

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

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

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

答案 1 :(得分:50)

部署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
    
  3. 这些要求由Java Servlet API定义。

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

答案 2 :(得分:11)

您应该在WEB-INF中输入您不想公开的任何页面或页面。通常,在WEB-INF之外可以找到JSP或facelets,但在这种情况下,它们很容易被任何用户访问。如果您有一些授权限制,可以使用WEB-INF。

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

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

对于WEB-INF / classes - 它存在于任何web-app中,因为这是放置所有已编译源的文件夹(不是JARS,而是你自己编写的.java文件)。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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