代码:http://files.cnblogs.com/files/douJiangYouTiao888/MultiActionController.zip

  在使用springMVC的开发过程中,Handler(就是Controller)是我们需要手动开发的主要内容,注解的配置方式比较固定,可以限定请求方式,请求映射到方法级,基本可以满足我们的日常需求。所以这里主要记录基于xml配置方式的各种Handler。

  这里引用开涛SpringMVC PDF中的一张图片:

这里学习一下比较常用的几种实现方式:

  Controller:最顶层的接口,也是最简单的,重写handleRequest()即可。

  AbstractController:比较常用的一个接口,重写handleRequestInternal()即可。AbstractController接口实现了org.springframework.web.servlet.support.WebContentGenerator接口。提供了针对http请求的设定,在我的springMVC(二)示例代码中有体现,如:

    supportedMethods:GET、POST等请求的设定

    cacheSeconds:响应缓存时间

  ServletForwardingController:将拦截的请求交由某个servlet来处理

  MultiActionController:一个controller集成多个不同的请求,解决目前controller只能处理一个请求的问题。

这里主要说一下MultiActionController的使用:

类结构:

public class MultiActionController extends AbstractController implements LastModified{
  ...
  /*
   * 略过其他属性,直接看这个resolver是最重要的,由它来决定URL到Controller.method()的映射,默认实现为InternalPathMethodNameResolver
   * 除此之外,还有两个比较常用的实现,稍后在下面介绍使用方式:
   *   ParameterMethodNameResolver:根据请求参数匹配method
   *   PropertiesMethodNameResolver:根据请求URL匹配method
   */
  private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
  ...
}

MethodNameResolver类结构图:

配置方式:

一、根据请求URL匹配method,默认实现:InternalPathMethodNameResolver

  <!--
InternalPathMethodNameResolver,可以不配置methodNameResolver,
如果需要prefix和suffix可以配置methodNameResolver,调用controller.${prefix}**${suffix}
请求/paramAction/add,调用Controller.padds()
-->
<bean name="/paramAction/**" class="com.wang.controller.MultiController">
<property name="methodNameResolver">
<bean
class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
<property name="prefix" value="p"></property>
<property name="suffix" value="s"></property>
</bean>
</property>
</bean>

二、根据请求参数匹配method:ParameterMethodNameResolver

  <!-- ParameterMethodNameResolver -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/paramMulti.do">paramAction</prop>
</props>
</property>
</bean>   <bean id="paramMultiResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!-- 指定参数key映射方法,即xxx?action=sb,执行Controller的sb() -->
<property name="paramName" value="action" />
<!-- 未指定action参数时,默认执行的方法,即xxx?a=1,执行execute() -->
<property name="defaultMethodName" value="execute"></property>
<!-- 请求参数包含list、create、update时默认会执行Controller.list()、create()、update(),
但是配置logicalMappings后会将create()映射为createLogical(), 如:http://localhost:8088/paramMulti.do?action=add&create
执行createLogical() -->
<property name="methodParamNames" value="list,create,update"></property>
<!-- 方法映射,action=add时,映射到Controller.addLogical();action=list,映射到list() -->
<property name="logicalMappings">
<props>
<prop key="add">add</prop>
<prop key="list">list</prop>
<prop key="create">createLogical</prop>
<prop key="update">update</prop>
<prop key="execute">sbExecute</prop>
</props>
</property>
</bean>   <bean id="paramAction" class="com.wang.controller.MultiController">
<!-- 通过参数调用方法:ParameterMethodNameResolver -->
<property name="methodNameResolver" ref="paramMultiResolver"></property>
</bean>

三、根据请求URL匹配method:PropertiesMethodNameResolver

  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/propertiesMulti/**">paramAction</prop>
</props>
</property>
</bean> <!-- PropertiesMethodNameResolver -->
<bean id="propertiesMultiResolver"
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<props>
<prop key="/propertiesMulti/add">add</prop>
<prop key="/propertiesMulti/list">list</prop>
<prop key="/propertiesMulti/update">update</prop>
<prop key="/propertiesMulti/create">create</prop>
<prop key="/**">execute</prop>
</props>
</property>
</bean>
  <bean id="paramAction" class="com.wang.controller.MultiController">
<!-- 通过URL调用方法:PropertiesMethodNameResolver -->
<property name="methodNameResolver" ref="propertiesMultiResolver"></property>
</bean>

controller:

/**
* 继承MultiActionController类,并自定义方法
* 方法格式:public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);
* @author wlyfree
*
*/
public class MultiController extends MultiActionController{ public ModelAndView add(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController add()");
ModelAndView mv = new ModelAndView();
mv.addObject("message","add");
mv.setViewName("add");
return mv;
} public ModelAndView padds(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController add()");
ModelAndView mv = new ModelAndView();
mv.addObject("message","add");
mv.setViewName("add");
return mv;
} public void addLogical(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController addLogical()");
}
public void createLogical(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController createLogical()");
}
public void list(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController list()");
}
public void create(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController create()");
}
public void update(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController update()");
}
public void execute(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController execute()");
}
public void sbExecute(HttpServletRequest request,HttpServletResponse response){
System.err.println("MultiController select()");
}
}

SpringMVC学习(四)——处理器Handler的各种常用实现的更多相关文章

  1. (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...

  2. SpringMVC学习--异常处理器

    简介 springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...

  3. SpringMVC 学习笔记(处理器映射器的配置)

    前端控制器(dispatchServlet) 在web.xml中配置前端控制器,在服务器启动时就被创建,用来对请求和响应进行接收 和 分发处理,其在配置时可以设置一个初始化参数,用来定位SpringM ...

  4. SpringMVC学习四(@ModelMap @RequestBody等等的说明)

    参考如下 http://www.cnblogs.com/HD/p/4107674.html http://www.cnblogs.com/qiankun-site/p/5774325.html @re ...

  5. springMVC学习 四 请求的中文乱码解决

    在使用SpringMVC时,同样有前端向后端发送请求,请求参数中有中文,需要解决中文乱码问题,在Spring中也是向java web中一样,通过一个过滤器来解决中文乱码. 这个过滤器在spring-w ...

  6. SpringMVC学习总结(四)——基于注解的SpringMVC简单介绍

    SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是 DispatcherServlet,DispatcherServlet负责转发每一个Request ...

  7. (转)SpringMVC学习(五)——SpringMVC的参数绑定

    http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...

  8. springMVC学习记录1-使用XML进行配置

    SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,Spring WEB中除了有springMVC还有struts2,webWork等MVC ...

  9. springmvc学习笔记(常用注解)

    springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...

随机推荐

  1. 剑指offer——面试题25:合并两个 排序的链表

    自己答案: ListNode* MergeTwoSortedList(ListNode* pHead1,ListNode* pHead2) { if(pHead1==nullptr&& ...

  2. AWS S3

    Amazon Simple Storage Service (Amazon S3) Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据.此 ...

  3. 第七次 Scrum Meeting

    第七次 Scrum Meeting 写在前面 会议时间 会议时长 会议地点 2019/4/11 22:00 10min 大运村1号楼6F 附Github仓库:WEDO 例会照片 工作情况总结(4.11 ...

  4. IONIC 打包安卓apk详细过程

    参照以下链接: https://blog.csdn.net/qq_20264891/article/details/79319408 当 cordova 项目安装的 android 平台版本 与 系统 ...

  5. HTML5开发手机项目-个人总结(转)

    让网页的宽度自适应屏幕<meta name="viewport" content="width=device-width"/>    1)html上 ...

  6. linux mint 18.1 安装nvidia显卡驱动

    原文地址 http://www.gamersonlinux.com/forum/threads/updating-nvidia-drivers-mint.1746/ 主要步骤很简答 就是将ppa仓库地 ...

  7. Bash编程(5) Shell方法

    shell的方法在相同的进程内执行,与调用它的脚本一致.对于方法来说,脚本中的所有变量均可见,且不需要执行export.方法中可以创建局部变量,且不影响正在调用的脚本. 1. 定义语法 (1) Kor ...

  8. GridView 基本使用

    项目中实例一 <asp:GridView ID="gvBatchReceive" runat="server" AutoGenerateColumns=& ...

  9. [转]Web API Introduction to OData Services using ASP.NET Web API

    本文转自:http://mahedee.net/tag/web-api/ What is OData? OData Stands for Open Data Protocol. It is a dat ...

  10. Magento 2中文文档教程 - Magento 2.1.x 系统需求

    Magento 2.1.x 系统需求 操作系统 (Linux x86-64) Linux发行版如红帽企业Linux(RHEL),CentOS,Ubuntu,Debian,等等 内存需求 升级的应用程序 ...