【问题标题】:Web.xml welcome file does not work in jettyWeb.xml 欢迎文件在码头中不起作用
【发布时间】:2014-08-29 12:25:28
【问题描述】:

我有一个带有 webcontext 根名称“testProject”的 web 应用程序。我尝试使用web.xml 并配置欢迎文件:

<welcome-file-list>
    <welcome-file>/jspFiles/index.html</welcome-file>
</welcome-file-list>

这适用于tomcat,但不适用于码头:

Tomcat 7.0:

  1. 如果我浏览到localhost:8080/testProject/,则正确显示 index.html
  2. 如果我浏览到localhost:8080/testProject/jspFiles/index.html,则正确显示 index.html

码头 9.0:

  1. 如果我浏览到 localhost:8080/testProject/,则会出现 404 错误
  2. 如果我浏览到localhost:8080/testProject/jspFiles/index.html,则正确显示 index.html

我的 webcontent 文件夹如下所示;

Webcontent
|
+ jspFiles/index.html
|
+ META-INF
|
+ WEBINF
  |
  + web.xml

我是否需要配置一些额外的东西才能在码头上进行这项工作?

【问题讨论】:

    标签: tomcat jetty web.xml


    【解决方案1】:

    &lt;welcome-file&gt; 中的值只是简单地附加到传入请求中,以尝试找到 http 客户端请求的资源。

    带有'/' 的条目只会使事情复杂化(尤其是在开头,这被认为是非规范化的)

    以下面的例子为例:

    Webapp deployed to '/foo'
    You have 1 <welcome-file>jsps/index.jsp</welcome-file> set
    Your webapp contents are:
        /WEB-INF/web.xml
        /jsps/index.jsp
        /css/main.css
        /js/jquery.js
        /bar/list.jsp
    

    让我们来看几个场景。

    1. /foo 的传入请求
      • {webapp-base}/ 是否作为文件资源存在?没有
      • {webapp-base}/jsps/index.jsp 是否作为文件资源存在?是的,处理它。
    2. /foo/bar 的传入请求
      • {webapp-base}/bar 是否作为文件资源存在?不。
      • {webapp-base}/bar/jsps/index.jsp 是否作为文件资源存在?不。
      • 默认 servlet 返回 404。

    “作为文件资源”部分被过度简化,故意的,因为文件资源的搜索可以是以下任何位置(这不是官方搜索顺序,官方顺序参见servlet规范)

    • WebApp 的类加载器 - 又名 /WEB-INF/classes
    • /WEB-INF/resources/ 中的任何内容
    • /META-INF/resources/ 的 jar 文件中的 /META-INF/resources/ 中找到的任何内容/WEB-INF/lib/
    • webapp 根目录中的内容

    然后,JSP 实现本身添加了在其他位置查找内容的能力。

    主要是因为您对以*.jsp 结尾的文件的请求意味着JspServlet(通常映射到jsp servlet 名称)也将被要求提供内容。 一些实现甚至会使用传入的request.getPathInfo() 对抗/WEB-INF/ 中的任何内容(这样做是为了让jsps 存在于/WEB-INF/my.jsp 中,供JspServlet 使用(在编译时)并提供响应,但也可以获得/WEB-INF/ 的标准 servlet 规范安全性,并且永远不会在未处理的情况下提供 jsp 源本身。

    【讨论】:

      【解决方案2】:

      我发现 Eclipse.jsp 向导将 jsp 放置在非常接近应有的位置,但 Eclipse 嵌入式码头或 Eclipse 生成 .war 都将 .jsp 放置在服务器无法找到它的位置。在这两种情况下,我都右键单击了 jsp,选择了 MOVE,然后将其放置在 webapp 文件夹中(用于嵌入式)或 WebContent 文件夹中(用于 Java EE WAR)。在这两种情况下,我对我编写的每个新 jsp 都执行此操作。

      这真的很难展示,但我会努力的。 Eclipse 运行嵌入式码头的错误方式:

      src/main/webapp (folder)
      +>css           (package)
      +>images        (package)
      +>WEB-INF       (folder)
      ++>lib          (folder)
         web.xml
         my.jsp
         ohmy.jsp
         ohmygod.jsp
      

      这里的 web.xml 是在正确的地方,但我从来不知道在什么地方。 永远找不到 my.jsp。

      现在如果你使用 move 函数将 my.jsp 移动到 src/main/webapp 它 最终看起来像这样,并且找到了 my.jsp 并且一切正常。

      src/main/webapp (folder)
      +>css           (package)
      +>images        (package)
      +>WEB-INF       (folder)
      ++>lib          (folder)
         web.xml
        my.jsp
        ohmy.jsp
        ohmygod.jsp
      

      正如我所说,我仍然不知道 web.xml “在”哪里,因为它在 lib 文件夹中,但不在其中。 .jsp 位于 webapp 文件夹中(它们确实是),文档说它们应该在其中并且一切正常。 .war 看起来有点不同,但问题和解决方案是相同的。作为最坏的情况,只需移动 .jsp(s)(或者在您的情况下是欢迎文件),直到服务器找到它们,如果这些说明对您没有意义。

      我目前有我需要的东西,但是当(如果)我弄清楚欢迎文件时,我会回来更新它。

      【讨论】:

        猜你喜欢
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-21
        • 2013-04-17
        • 2019-03-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多