使用MultiActionController,实现通过请求的url找到对应的控制器,再根据请求参数匹配控制器方法的功能

需求:通过请求的url找到对应的控制器,再根据请求参数匹配控制器方法

requestMapping:在控制器上实现一级url的映射,然后在对应的控制器方法上实现二级url的映射,无法实现需求。

实现:MultiActionController搭配SimpleUrlHandlerMapping搭配ParameterMethodNameResolver

MultiActionController

通过属性methodNameResolver注入ParameterMethodNameResolver控制器,可以实现不同的请求路径对应MultiActionController中的不同方法,这样就可以把相关的操作都在一个类的相关方法中完成。
有两种配置方法

  1. 根据请求参数决定方法 test.do?action= 方法名
  2. 根据请求路径决定方法 ,就是在地址栏中 输入 /*.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;
    }

有两种方式声明:

  1. 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>  
  1. 等号左边是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

思路

  1. 配置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>
  1. 配置自定义的MultiActionController控制器,通过固定名称methodNameResolver注入ParameterMethodNameResolver控制器
<bean id="TestAction" class="com.szlb.platform.action.TestAction">
		<property name="methodNameResolver">
			<ref bean="paraMethodResolver" />
		</property>
	</bean>
  1. 配置 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>
  1. 自定义的控制器继承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) {
    
    
		//处理请求
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43505762/article/details/122424959
今日推荐