5

我已经设置了我的 spring-mvc servlet 来匹配 * .page请求。我已将 web.xml 中的欢迎文件列表设置为 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

4 回答 4

13

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

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

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

于 2012-04-21T03:06:12.797 回答
3

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

Spring MVC 允许非常复杂的 URL 映射,所以你最好用@RequestMapping

于 2012-04-19T21:59:01.433 回答
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必须遵循选择保存您的意见的文件夹。

查看这些示例

于 2014-05-04T16:36:36.030 回答
0

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

对于 Apache HTTP Server,您可以通过设置 DirectoryIndex 指令来实现这一点,如下所示: DirectoryIndex index.page

显然,有人已经问过这个问题,并且已经在目录中的 web.xml 默认文件中接受了答案(对于码头或 tomcat)?- 看看它是否适合你。

于 2012-04-20T02:38:37.893 回答