Spring MVC 默认控制器
Spring MVC default controller
我有一个临时解决方案,我会在下面解释,但我正在寻找是否有更好的解决方案。
我有一个基本的 Spring 4 MVC 应用程序,具有 web.xml 配置(没有 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>
和调度员-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
class 处理,而所有 /home/
请求都由 HomeController
class 处理(因为 spring,默认情况下,创建一个路径,所以控制器名称是主 url 路径,对吧?)
我的问题是,是否可以,如果可以,我怎样才能将 HomeController
class 设为我的默认控制器。只是这样我实际上不必 Controller
class.
对于那些熟悉 ASP.NET MVC 的人来说,我想要的是无论你是去 site.com/Home/Index
还是只是 site.com
,两次你都引用同一个控制器。
我想创建它,以便 spring 自动将 site.com
连接到 HomeController
class.
中的路线
希望我说得够清楚了。我会回答任何不清楚的问题,并欢迎任何答案或文档!谢谢!
我还没有实际尝试过,但我认为它应该有效。
创建一个扩展 ControllerClassNameHandlerMapping
的新 class,并覆盖 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);
}
}
在 class 级别(不是方法级别)用 @RequestMapping({"/", "/home"})
注释您的 HomeController
。
在 dispatcher-servlet.xml 的 bean 定义中,将 Spring 的 ControllerClassNameHandler
替换为 MyControllerClassNameHandler
。
我有一个临时解决方案,我会在下面解释,但我正在寻找是否有更好的解决方案。
我有一个基本的 Spring 4 MVC 应用程序,具有 web.xml 配置(没有 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>
和调度员-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
class 处理,而所有 /home/
请求都由 HomeController
class 处理(因为 spring,默认情况下,创建一个路径,所以控制器名称是主 url 路径,对吧?)
我的问题是,是否可以,如果可以,我怎样才能将 HomeController
class 设为我的默认控制器。只是这样我实际上不必 Controller
class.
对于那些熟悉 ASP.NET MVC 的人来说,我想要的是无论你是去 site.com/Home/Index
还是只是 site.com
,两次你都引用同一个控制器。
我想创建它,以便 spring 自动将 site.com
连接到 HomeController
class.
希望我说得够清楚了。我会回答任何不清楚的问题,并欢迎任何答案或文档!谢谢!
我还没有实际尝试过,但我认为它应该有效。
创建一个扩展 ControllerClassNameHandlerMapping
的新 class,并覆盖 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);
}
}
在 class 级别(不是方法级别)用 @RequestMapping({"/", "/home"})
注释您的 HomeController
。
在 dispatcher-servlet.xml 的 bean 定义中,将 Spring 的 ControllerClassNameHandler
替换为 MyControllerClassNameHandler
。