当前位置: 首页 > 知识库问答 >
问题:

WEB-INF在JavaEE Web应用程序中用于什么?

苗森
2023-03-14

我正在使用以下源代码目录结构的JavaEE 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文件、SpringBean连接上下文以及JSP标记和视图。我试图理解是什么限制/定义了这种结构。例如,JSP文件是否总是必须在WEB-INF中,或者它们可能在其他地方?在WEB-INF中是否还有其他内容?维基百科的WAR文件条目提到了Java类的classes,JAR文件的lib——我不确定除了其他源文件位置之外,什么时候还需要这些文件。

共有3个答案

易宣
2023-03-14

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

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

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

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

杨昆
2023-03-14

当您部署JavaEE Web应用程序(使用或不使用框架)时,其结构必须遵循一些要求/规范,这些规范来自:

  • servlet容器(例如Tomcat)
  • JavaServlet API
  • 您的应用程序域

>

  • Servlet容器要求
    如果使用Apache Tomcat,应用程序的根目录必须放在webapp文件夹中。如果使用另一个servlet容器或应用程序服务器,情况可能会有所不同
  • 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
    

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

  • 厍胤运
    2023-03-14

    Servlet 2.4规范对WEB-INF(第70页)作了如下说明:

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

    这意味着WEB-INF资源可供WEB应用程序的资源加载器访问,而公众不能直接看到。

    这就是为什么许多项目将其资源(如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文件或超文本标记语言和JavaScript文件,但情况并非总是如此。

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

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

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

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

     类似资料:
    • 在99%的情况下,当SQL server返回意外错误或文件系统中缺少文件时,我不能做任何合理的事情,我只想记录这种情况并将错误返回给用户。所以我看不出有什么理由应该返回“err”手动展开堆栈,实际上我会丢失stacktrace和上下文,并且更难找到错误的原因。 有没有什么我错过了,所以这种方法不会很好地工作?似乎大多数Go文章都建议不要使用panic/recover,但我不明白为什么。它看起来非常

    • 问题内容: 我想使用html applet标记在我的Web应用程序中运行简单applet,但是它给出了类似的错误 java.lang.ClassNotFoundException:MyApplet 请给我示例应用程序,如果可能的话..... 问题答案: 问题是applet引擎在您定义的代码库中找不到MyApplet类。 这是因为您在/ WEB-INF / classes目录中进行了分类。该目录受s

    • 本章将教您如何使用Maven管理基于Web的项目。 在这里,您将学习如何创建/构建/部署和运行Web应用程序。 创建Web应用程序 要创建一个简单的Java Web应用程序,我们将使用maven-archetype-webapp插件。 所以,让我们打开命令控制台,转到C:\MVN目录并执行以下mvn命令。 C:\MVN>mvn archetype:generate -DgroupId = com

    • 问题内容: 我正在设计一个简单的基于Web的应用程序。我是这个基于Web的领域的新手,我需要您提供有关设计模式的建议,例如应如何在Servlet之间分配职责,创建新Servlet的条件等。 实际上,我主页上的实体很少,而与每个实体相对应,我们几乎没有添加,编辑和删除等选项。之前,我为每个选项使用一个Servlet,例如Servlet1用于添加实体1,Servlet2用于编辑实体1,依此类推,这样我

    • 我已经阅读了一些关于将Web应用和API应用部署到Azure的教程。然而,我仍然有点不确定为什么你会使用一个而不是另一个。 我可以创建一个新的。NET解决方案,并将其部署为Web应用程序,那么为什么我会特别需要API应用程序呢?这些都是专门为ASP优化的。NET Web API,其中Web应用程序用于交付HTML?

    • 有人在Android中使用Appium进行Web应用程序测试吗? 目前我正在使用Appium在IOS Simulator(IPad)中自动化我的Web应用程序,并且运行良好。我也想将它用于Android,即(Mac机器中的Nexus7 Simulator)。 我已经尝试了以下所需的能力… 但我在错误下面。。。 出现配置错误,未启动会话信息:响应客户端的错误:{“状态”:6,“值”:{“消息”:“会