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

Ste*_*ers 164 servlets war web-inf java-ee

我正在使用以下源代码结构的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
Run Code Online (Sandbox Code Playgroud)

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

我试图理解什么约束/定义这个结构.例如JSP文件总是必须在WEB-INF其他地方或者它们可能在其他地方吗?还有其他可能进入的地方WEB-INF吗?维基百科的WAR文件条目提到classes了Java类和libJAR文件 - 除了其他源文件位置之外,还不确定我是否完全掌握了这些文件.

sab*_*ver 198

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

一个特殊的目录命名为应用程序层次结构中存在 WEB-INF.此目录包含与应用程序相关的所有不在应用程序文档根目录中的内容.WEB-INF节点不是应用程序的公共文档树的一部分.目录中包含的WEB-INF文件不能由容器直接提供给客户端.然而,该内容 WEB-INF目录中的是小服务程序代码可见getResourcegetResourceAsStream方法调用的ServletContext,并且可以使用该被暴露RequestDispatcher的呼叫.

这意味着WEB-INFWeb应用程序的资源加载器可以访问资源,而不是公众可以直接看到资源.

这就是为什么很多项目把自己的资源,如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>
Run Code Online (Sandbox Code Playgroud)

WEB-INF/classesWEB-INF/lib维基百科的提到的文件夹WAR文件的文章是在运行时由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文件夹中.这就解释了为什么libmaven项目中没有文件夹的原因.

  • [Servlet 3.0显然改变了这些规则.**可以*是来自WEB-INF的文件](https://alexismp.wordpress.com/2010/04/28/web-inflib-jarmeta-infresources/). (5认同)
  • Servlet 3.0和3.1([JSR 340](https://jcp.org/en/jsr/detail?id=340))的更改允许从WEB-INF / lib中存储的JAR内提供静态资源和JSP。引用Servlet 3.1规范第10.5节:*除了打包在WEB-INF / lib目录中的JAR文件的META-INF / resources中的静态资源和JSP外,WEB-INF目录中不得包含其他文件由容器直接提供给客户。*因此,该例外仅适用于:`WAR`&gt;`WEB-INF`&gt;`lib`&gt;`JAR`file&gt;`resources` (2认同)
  • 哎呀,根据我上面的评论,将最后一句更改为:静态文件可以从以下位置提供:`WAR`文件&gt;`WEB-INF`&gt;`lib`&gt;`JAR`文件&gt;`META-INF`&gt;`resources`&gt; *你的静态文件转到这里*。 (2认同)

Pat*_* B. 55

部署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
    
    Run Code Online (Sandbox Code Playgroud)

这些要求由Java Servlet API定义.

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

  • 喜欢用dir树和解释性评论回答. (7认同)
  • 很好的提到布局定义的来源. (2认同)

Art*_*lev 12

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

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

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

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