我正在使用以下源代码结构编写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
- 不确定除了其他源文件位置之外还需要它们时我已经完全掌握了。
答案 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/classes
和WEB-INF/lib
文件夹是Servlet规范在运行时所需的文件夹示例。
重要的是要区分项目结构和生成的WAR文件的结构。
项目的结构在某些情况下会部分反映WAR文件的结构(对于静态资源,例如JSP文件或HTML和JavaScript文件,但情况并非总是如此。
从项目结构到生成的WAR文件的转换是由构建过程完成的。
虽然您通常可以自由设计自己的构建过程,但现在大多数人都会使用标准化方法,例如Apache Maven。除此之外,Maven还定义了项目结构中的资源映射到生成工件中的哪些资源的默认值(在这种情况下,生成的工件是WAR文件)。在某些情况下,映射由纯文本复制过程组成,在其他情况下,映射过程包括转换,例如过滤或编译等。
一个示例:WEB-INF/classes
文件夹稍后将包含需要由类加载器加载的所有已编译的java类和资源(src/main/java
和src/main/resources
)启动应用程序。
另一个例子:WEB-INF/lib
文件夹稍后将包含应用程序所需的所有jar文件。在maven项目中,为您管理依赖项,maven会自动将所需的jar文件复制到WEB-INF/lib
文件夹中。这就解释了为什么maven项目中没有lib
文件夹的原因。
答案 1 :(得分:50)
部署Java EE Web应用程序(使用或不使用框架)时,其结构必须遵循一些要求/规范。这些规格来自:
- servlet容器(例如Tomcat)
- Java Servlet API
- 您的申请域
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”目录)。
答案 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页面的请求都必须通过我们的应用程序进行定向,以确保用户体验。