web - inf在Java EE web应用程序中用于什么?

我正在使用以下源代码目录结构的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文件条目提到了Java类的classes和JAR文件的lib -不确定我是否完全掌握了除了其他源文件位置之外什么时候需要这些。

209529 次浏览

Servlet 2.4规范是这样描述WEB-INF的(第70页):

在应用程序层次结构中存在一个名为 WEB-INF。此目录包含与 不在应用程序的文档根目录中的应用程序。< >强 类的公共文档树的一部分 应用程序> < /强。不能提供包含在WEB-INF目录中的任何文件 通过容器直接发送到客户端。然而,内容的 WEB-INF目录对于使用getResource . conf的servlet代码是可见的 和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>

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

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

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

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

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

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

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

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

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

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

至于WEB-INF/classes——它存在于任何web-app中,因为这是存放所有编译源代码的文件夹(不是jar,而是你自己编写的编译过的。java文件)。

当您部署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
    

These requirements are defined by Java Servlet API.

3. Your application domain
Now that you've followed the requirements of the Servlet container(or application server) and the Java Servlet API requirements, you can organize the other parts of your webapp based upon what you need.
- You can put your resources (JSP files, plain text files, script files) in your application root directory. But then, people can access them directly from their browser, instead of their requests being processed by some logic provided by your application. So, to prevent your resources being directly accessed like that, you can put them in the WEB-INF directory, whose contents is only accessible by the server.
-If you use some frameworks, they often use configuration files. Most of these frameworks (struts, spring, hibernate) require you to put their configuration files in the classpath (the "classes" directory).

有将jsp页面放置在WEB-INF目录下的约定(不是必需的),这样它们就不能被深度链接或书签到。 这样,对jsp页面的所有请求都必须通过我们的应用程序进行定向,从而保证用户体验。< / p >

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