Spring MVC默认控制器


问题内容

我对此有一个临时解决方案,下面将对其进行解释,但是我正在寻找是否有更好的解决方案。

我有一个带有web.xml配置的基本Spring 4 MVC应用程序(没有maven)。web.xml如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app ...>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        <session-config>
            <session-timeout>
                30
            </session-timeout>
        </session-config>
        <welcome-file-list>
            <welcome-file>redirect.jsp</welcome-file>
        </welcome-file-list>
    </web-app>

和dispatcher-servlet.xml:

<?xml version='1.0' encoding='UTF-8' ?>
<beans ...>
    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
    <bean class="controllers.Controller"></bean>
    <bean class="controllers.HomeController"></bean>
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />
</beans>

我删除了将为urlMapping索引视图创建简单的in-xml()控制器的部分,这仅仅是因为索引页面还需要完成一些后端工作。

当前,所有/请求均由Controller该类处理,而所有/home/请求均由HomeController该类处理(因为默认情况下,spring会创建路径,因此控制器名称是主url路径,对吧?)

我的问题是,是否可能,如果可以,如何使HomeController该类成为默认控制器。只是这样,我实际上不必Controller上课。

对于那些熟悉ASP.NET MVC的人来说,我想要的是两次引用同一控制器的方式是去site.com/Home/Index还是去site.com

我想创建它,以便spring自动连接site.comHomeController课堂上的一条路线。

我希望我足够清楚。我将回答所有不清楚的问题,并欢迎您提供任何答案或文档!谢谢!


问题答案:

我实际上没有尝试过,但是我认为它应该起作用。

创建一个extends的新类ControllerClassNameHandlerMapping,并覆盖该generatePathMappings方法,以便如果控制器带有注释,@RequestMapping则它将使用该注释的值作为路径而不是控制器的名称。

public class MyControllerClassNameHandlerMapping extends ControllerClassNameHandlerMapping {

    @Override
    protected String[] generatePathMappings(Class<?> beanClass) {
        if (beanClass.isAnnotationPresent(RequestMapping.class)) {
            RequestMapping mapping = beanClass.getAnnotation(RequestMapping.class);
            return mapping.value();
        }
        return super.generatePathMappings(beanClass);
    }
}

HomeController在类别级别(而不是方法级别)使用注释您@RequestMapping({"/", "/home"})

dispatcher-servlet.xml
的bean定义中,将Spring替换ControllerClassNameHandlerMyControllerClassNameHandler