Spring Dispatcher servlet用于静态html文件和默认路径

时间:2014-01-13 17:02:52

标签: java spring-mvc servlets

春季3.1.4 Java 1.7

我有一个webapp,其中包含为所有网址配置的DispatcherServlet。他们中的大多数都会有映射。应用程序中有一些静态文件,当我使用http://host:port/myapp/index.html访问时,正确显示了web目录下index.html的内容。我通过在myapp-servlet.xml中使用以下代码段实现此目的

<mvc:default-servlet-handler/>

期待当访问网址http://host:port/myapp时,将呈现默认的index.html,因为我的web.xml中有以下内容

<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

然而,似乎并非如此,即,除非在URL中指定了index.html,否则DispatcherServlet无法正确解析它。有人能告诉我这是如何实现的吗?服务器日志告诉我以下

o.a.c.c.C.[.[.[/myapp] - servletPath=null, pathInfo=null, queryString=null, name=default
o.a.c.c.C.[.[.[/myapp] -  Named Dispatcher Forward
o.a.c.c.C.[.[.[/myapp] -  Disabling the response for futher output
o.s.web.servlet.DispatcherServlet - Null ModelAndView returned to DispatcherServlet with name 'myapp': assuming HandlerAdapter completed request handling
o.s.web.servlet.DispatcherServlet - Successfully completed request

2 个答案:

答案 0 :(得分:2)

servlet优先于<welcome-file-list>,因此在这种情况下,<welcome-file-list>将无效,因为DispatcherServlet会消耗所有请求,我担心。

解决方案很简单,只需为Spring中的默认路径添加映射,并将控制器操作发送到index.html

答案 1 :(得分:1)

如果你已经为Spring MVC正确配置了,那么应该是这样的,

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

现在你应该有一个文件myapp-servlet.xml,你应该在其中提供针对所请求的URL PATTERN做什么的映射,或者你可以直接在java文件中进行基于注释的映射。

在这种情况下,您的欢迎文件将不会播放规则,因为您的第一个请求“AppName /”将传递mvc映射“/ *”,并将在Spring MVC文件中搜索映射。

您可以通过这种方式实现您的需求,

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

现在MVC只有在模式跟随“/ mvc /”时才会出现,否则它将在正常流程中起作用。