Spring MVC默认控制器

时间:2016-02-06 14:44:10

标签: java spring spring-mvc configuration routes

我有一个临时解决方案,我会解释它,但我正在寻找是否有更好的解决方案。

我有一个带有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>

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

目前,所有/个请求都由Controller类处理,而所有/home/个请求都由HomeController类处理(因为默认情况下,spring会生成一个路径)所以控制器名称是主要的URL路径,对吗?)

我的问题是,是否可能,如果可以,我怎样才能使HomeController类成为我的默认控制器。所以我实际上不需要Controller课程。

对于那些熟悉ASP.NET MVC的人来说,我想要的是你引用同一个控制器的时间,无论你是去site.com/Home/Index还是site.com

我想创建它,以便Spring自动将site.com连接到HomeController类中的路线。

我希望我足够清楚。我会回答任何不清楚的问题,欢迎任何答案或文件!谢谢!

1 个答案:

答案 0 :(得分:1)

我实际上没有尝试过这个,但我认为它应该可行。

创建一个扩展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的ControllerClassNameHandler替换为MyControllerClassNameHandler