【问题标题】:welcome-file-list not working in jetty + spring欢迎文件列表在jetty + spring中不起作用
【发布时间】:2015-02-11 16:53:55
【问题描述】:

我将 Jetty 8.1.4 与 Spring 3.2.4 一起使用。以下是我的 web.xml 文件。我在 WEB-INF 下有一个 index.html 文件,当我执行 http://myapp.com/ 或简单的 http://myapp.com 时,我希望该页面被点击,但我得到 404。如果我执行 http://myapp.com/index.html 它可以工作。我不确定我错过了什么。另外,如果我必须在下面的 url 模式中使用 / 或 /* 我有点困惑,我都尝试了。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    id="DOMAINAPPROVALGUI" version="2.4"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>myapp-ui</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/myapp-servlet.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

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

    <servlet>
        <servlet-name>myappname</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>myappname</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

</web-app>

【问题讨论】:

    标签: java spring spring-mvc jetty web.xml


    【解决方案1】:

    Jetty 8 is EOL (End of Life),升级到 Jetty 9。(这里的答案是根据 Jetty 9 的运行情况提供的。)

    &lt;welcome-file-list&gt;DefaultServlet 处理的一部分(根据 servlet 规范)。

    您在&lt;url-pattern&gt;/*&lt;/url-pattern&gt; 处声明myappname 有效地阻止了DefaultServlet 做任何事情。

    您的配置基本上是说“将所有请求发送到我的 DispatcherServlet”。

    这甚至包括静态文件服务、欢迎文件处理、默认处理、错误处理、分派等等。

    至于选择什么样的 url 模式,由你决定。

    使用 Spring 的方法有很多种,您在 /* 的当前配置与在 *.do*.dispatch/dispatch/* 的其他配置一样有效

    您必须决定什么对您的 webapp 最有利,并调整您对 Spring 的内部使用以满足您的需求(例如您如何声明您的 RequestMapping)

    现在您知道为什么 &lt;welcome-file-list&gt; 不起作用,您可以进行调整以不使用标准 servlet &lt;welcome-file-list&gt;(在 Spring 内部使用某些东西),或者调整您的调度程序 servlet url 模式以允许 servlet 容器(Jetty) 为您的静态文件提供服务并处理您声明的&lt;welcome-file-list&gt;

    【讨论】:

    • 顺便说一句,静态文件处理工作正常。就像,如果做 domain.com/index.html 我可以从浏览器中看到它。调度员不知道我的 index.html。
    • 是的,您的调度员知道这一点,它是给您 index.html 的那个(servlet 容器没有这样做)
    • 继续请求你没有的静态资源,比如/foodex.html,你可能会看到类似WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/foodex.html] in DispatcherServlet with name 'myappname'的日志
    【解决方案2】:

    我将以下内容添加到我的 servlet.xml 以使其正常工作。同意@Joakim Erdfelt 的回答,该请求已到春天。但不确定在 url 中直接输入 index.html 是如何工作的。

    <mvc:view-controller path=”/” view-name=”index” />
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="prefix" value="/" />
      <property name="suffix" value=".html" />
    </bean>
    

    【讨论】:

      【解决方案3】:

      首先,你的spring的servlet映射配置不对,它会映射所有东西并链接到spring,这意味着*.jsp将由spring处理。所以你应该修复这个缺陷配置。但是这样做之后,访问欢迎页面仍然是不正确的。这是Jetty的角色。

      我必须说:tomcat 和 jetty 有一些区别。 Tomcat 可以通过正确的行为处理此问题,但码头不行。

      您可以尝试通过以下步骤进行验证。

      1. 用“/”删除映射
      2. 并使用 tomcat 和 jetty 运行应用程序。你可以发现 tomcat 和 jetty 都可以。
      3. 如果您使用映射模式添加 servlet 映射:“/”,则可以使用客户 servlet 或 spring dispatch servlet。它可以在 tomcat 中正常工作,但在码头不行。

      【讨论】:

        【解决方案4】:

        我认为将欢迎文件放在开头将有助于您加载文件。准确地说是放在显示标签之后

        【讨论】:

        • 这应该没什么区别。
        猜你喜欢
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        相关资源
        最近更新 更多