web.xml中的welcome-file,弹簧不起作用?

时间:2012-04-19 21:56:17

标签: java spring servlets spring-mvc jetty

我已经设置了我的spring-mvc servlet以匹配* .page 请求。我已将web.xml中的 welcome-file-list 设置为index.page

当我转到我的网络服务器的根目录时,这是有效的:

http://me.com会被正确地重定向到http://me.com/index.page

但是,当我使用子目录时,它不会重定向:

http://me.com/dashboard 被重定向到http://me.com/dashboard/index.page

有没有办法让这个映射有效?

我的web.xml文件(摘录):

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

<servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>*.page</url-pattern>
</servlet-mapping>

我的webdefault.xml(来自码头):

    <init-param>
        <param-name>dirAllowed</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>welcomeServlets</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>redirectWelcome</param-name>
        <param-value>false</param-value>
    </init-param>

4 个答案:

答案 0 :(得分:12)

<welcome-file>应表示任意文件夹中的物理存在文件,您希望在最终用户请求文件夹(例如根/时)时提供该文件,但它也可以是任何其他文件夹例如/foo/)。您只需要了解servletcontainer将在执行转发之前测试其物理存在,如果它不存在,则将返回HTTP 404页面未找到错误。

在您的特定情况下,您的根文件夹中没有物理index.page文件。您的根文件夹中实际上一个index.jsp文件。 index.page仅仅是一个虚拟URL。因此servletcontainer将无法找到物理index.page文件,因此错误输出404.

您可以通过在同一文件夹中放置index.page文件旁边的物理存在index.jsp文件来欺骗servletcontainer来解决此问题。该文件可以保持完全为空。 servletcontainer将找到该文件,然后转发到index.page,然后调用控制器servlet,后者实际上将index.jsp视为视图。那会很好。

答案 1 :(得分:3)

它只适用于真实的物理目录,不适用于模拟目录结构的任意servlet映射。

Spring MVC允许非常复杂的URL映射,因此您最好使用@RequestMapping

处理此方案

答案 2 :(得分:2)

为避免转发欢迎文件本身,最好为其添加映射。

  <servlet-mapping>
     <servlet-name>spring-mvc</servlet-name>
     <url-pattern>index.html</url-pattern>
  </servlet-mapping>

在java配置的情况下,您可以覆盖扩展WebMvcConfigurerAdapter的类中的两个方法

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("/index");
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

如果您想明确地为index.html提供服务,请将其转换为资源覆盖同一类中的方法,如下所示:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/index.html").addResourceLocations("/WEB-INF/views/index.html");
}

当然addResourceLocations必须在选择的文件夹后面保存您的观点。

请参阅these samples

答案 3 :(得分:0)

这是您需要在Web服务器中设置的内容,因此可能是服务器特定的

对于Apache HTTP Server,您可以通过设置DirectoryIndex指令来实现此目的: DirectoryIndex index.page

显然,有人已经提出这个问题,并已在web.xml default file in directory (for jetty, or tomcat)?接受了答案 - 看看它是否适合你。