处理器除了实现Controller 接口外,还可以继承自一些其他的类,来完成一些特殊的功能
1.继承自AbstractController类
若处理器继承自AbstractController类,那么处理器可以通过属性 supportedMethods 来限制 HTTP 请求的提交方式
1 <!-- 若处理器继承自 AbstractController 类,该类具有 supportedMethods 属性,所以可以在这里 对 supportedMethods属性 进行赋值,来限制HTTP请求方式()--> 2 <bean id="myController" class="com.springmvc.handlers.MyController"> 3 <property name="supportedMethods" value="POST"/> <!-- POST 必须大写 --> <!-- 只能通过表单 和 AJAX 方式请求 --> 4 5 </bean>
2.继承自 MultiActionController类
MultiActionController 类继承自 AbstractController,所以继承自 MultiActionController 类的子类也可以设置 HTTP 请求提交方式。
除此之外,继承自该类的处理器中可以定义多个处理方法。这些方法的签名为公共的方法,
返回值为 ModelAndView,包含参数 HttpServletRequest 与 HttpServletResponse,抛出 Exception 异常,方法名随意。
1 //继承 MultiActionController ,这个类是继承自 AbstractController的,所以它也可以限定提交方式 2 //继承 MultiActionController ,可以定义多个处理方法,方法名随意,但其他(权限,参数,返回值,异常)必须保持一致 3 public class MyController extends MultiActionController { 4 5 public ModelAndView doFirst(HttpServletRequest request,HttpServletResponse response) throws Exception { 6 7 ModelAndView mv = new ModelAndView(); 8 mv.addObject("message", "Hello doFirst Method!"); 9 mv.setViewName("/WEB-INF/jsp/hello.jsp"); 10 return mv; 11 12 } 13 14 public ModelAndView doLast(HttpServletRequest request,HttpServletResponse response) throws Exception { 15 16 ModelAndView mv = new ModelAndView(); 17 mv.addObject("message", "Hello doLast Method!"); 18 mv.setViewName("/WEB-INF/jsp/hello.jsp"); 19 return mv; 20 21 } 22 23 24 }
A、InternalPathMethodNameResolver方法名解析器
方法名以URI中资源名称的身份出现 /***/方法名
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 2 <property name="urlMap"> 3 <map> 4 <!-- 5 MultiActionControllern 类具有一个属性 methodNameResolver,方法名解析器 6 其具有默认值InternalPathMethodNameResolver,该解析器将方法名作为资源名称进行解析 7 那就意味着,我们提交请求时,要将方法名作为资源名称出现 8 --> 9 <entry key="/my/*.do" value="myController"></entry> <!-- 将方法名写在 url 地址中 ,SpringMVC_07_MultiActionController/my/doLast.do --> 10 </map> 11 </property> 12 13 </bean>
B、PropertiesMethodNameResover方法名解析器
方法名作为URI资源名称中的一部分出现 /***_doFirst
1 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 2 <property name="urlMap"> 3 <map> 4 <!-- 5 MultiActionControllern 类具有一个属性 methodNameResolver,方法名解析器 6 其具有默认值InternalPathMethodNameResolver,该解析器将方法名作为资源名称进行解析 7 那就意味着,我们提交请求时,要将方法名作为资源名称出现 8 --> 9 <entry key="/my_*.do" value="myController"></entry> <!-- 将方法名写在 url 地址中 ,SpringMVC_07_MultiActionController/my/doLast.do --> 10 </map> 11 </property> 12 13 </bean>
1 <!-- 配置方法名解析器 --> <!-- 如果是写成 /my/*.do 这种,不写这个方法名解析器也没什么区别--> 2 <!-- 因为 默认的InternalPathMethodNameResolver是根据 方法名 作为资源名称--> 3 <!-- 如果是写成 /my_*.do 就可以采用这种方式,因为这样写 找不到 找到的资源名称 和 方法名 是对应不上的--> 4 <bean id="propertiesMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> 5 <property name="mappings"> 6 <props> 7 <prop key="/my_doFirst.do">doFirst</prop> 8 <prop key="/my_doLast.do">doLast</prop> 9 </props> 10 </property> 11 </bean>
C、ParameterMethodNameResover方法名解析器
方法名作为请求参数的值出现 /***?action=doFirst
1 <!-- 配置 ParameterMethodNameResolver 方法名解析器 (方法名作为请求参数值出现) --> 2 <!-- http://localhost:8080/SpringMVC_09_MultiActionController_3/my.do?method=doFirst --> 3 <bean id="parameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> 4 <!-- 如果 这里不配置 paramName 属性 ,该属性会有一个默认 值action (?action=doFirst)--> 5 <!-- <property name="paramName" value="method" /> --> 6 </bean>