需求:通过请求的url找到对应的控制器,再根据请求参数匹配控制器方法
requestMapping:在控制器上实现一级url的映射,然后在对应的控制器方法上实现二级url的映射,无法实现需求。
实现:MultiActionController搭配SimpleUrlHandlerMapping搭配ParameterMethodNameResolver
MultiActionController
通过属性methodNameResolver注入ParameterMethodNameResolver控制器,可以实现不同的请求路径对应MultiActionController中的不同方法,这样就可以把相关的操作都在一个类的相关方法中完成。
有两种配置方法
- 根据请求参数决定方法 test.do?action= 方法名
- 根据请求路径决定方法 ,就是在地址栏中 输入 /*.do,*还是这个Controller中的方法名
//重要属性methodNameResolver
private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
//get、set方法
public final void setMethodNameResolver(MethodNameResolver methodNameResolver) {
this.methodNameResolver = methodNameResolver;
}
public final MethodNameResolver getMethodNameResolver() {
return this.methodNameResolver;
}
SimpleUrlHandlerMapping
SimpleUrlHandlerMapping是Spring MVC四大Handler Mapping类之一,具有很强的适用性,允许明确指定URL模式和Handler的映射关系。
有两个属性名可选:mappings或urlMap,这在SimpleUrlHandlerMapping中有明确定义
//本质上,都是对urlMap进行插入
private final Map urlMap = new HashMap();
public void setMappings(Properties mappings) {
this.urlMap.putAll(mappings);
}
public void setUrlMap(Map urlMap) {
this.urlMap.putAll(urlMap);
}
public Map getUrlMap() {
return this.urlMap;
}
有两种方式声明:
- key是URL模式,属性值是Handler的ID或者名字。
<bean id="urlMapping_test" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test.do">TestAction</prop>
</props>
</property>
</bean>
//自定义控制器
<bean id="TestAction" class="com.szlb.platform.action.TestAction">
</bean>
- 等号左边是URL模式,右边是Handler的ID或者名字。
<beans>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
test.do=TestAction
</value>
</property>
</bean>
<bean id="TestAction" class="com.szlb.platform.action.TestAction">
</bean>
</beans>
SimpleUrlHandlerMapping内容原文链接:https://blog.csdn.net/qq_29290295/article/details/84317533
思路
- 配置SimpleUrlHandlerMapping,属性值为mappings,根据key找到对应的控制器
<beans>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="test.do">TestAction</prop>
</props>
</property>
</bean>
- 配置自定义的MultiActionController控制器,通过固定名称methodNameResolver注入ParameterMethodNameResolver控制器
<bean id="TestAction" class="com.szlb.platform.action.TestAction">
<property name="methodNameResolver">
<ref bean="paraMethodResolver" />
</property>
</bean>
- 配置 ParameterMethodNameResolver 的请求参数名(即可通过制定的请求参数名获取参数,从而转换成方法名)
<bean id="paraMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>method</value>
</property>
<!-- 不带method参数时,默认执行list方法 -->
<property name="defaultMethodName">
<value>list</value>
</property>
</bean>
- 自定义的控制器继承MultiActionController类,每个方法参数必须是(HttpServletRequest request, HttpServletResponse response)这种类型,而且返回值只能是String ,modeAndview,void
public class TestAction extends MultiActionController{
public void copy(HttpServletRequest request, HttpServletResponse response) {
//处理请求
}
public String test(HttpServletRequest request, HttpServletResponse response) {
//处理请求
return "";
}
public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {
//处理请求
return modelAndView;
}
}
前后台调用过程
请求url
url:SYSTEM_WEB_ROOT +'/test.do?method=copy'
.do请求使用自定义Action类来处理
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<!--SimpleUrlHandlerMapping-->
<beans>
<bean id="urlMapping_jx" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="test.do">TestAction</prop>
</props>
</property>
</bean>
<bean id="TestAction" class="com.szlb.platform.action.TestAction">
<property name="methodNameResolver">
<ref bean="paraMethodResolver" />
</property>
</bean>
</beans>
public class TestAction extends MultiActionController{
public void copy(HttpServletRequest request, HttpServletResponse response) {
//处理请求
}
}