SpringMVC学习(四)——处理器Handler的各种常用实现
代码: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的各种常用实现的更多相关文章
- (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合
http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...
- SpringMVC学习--异常处理器
简介 springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeExc ...
- SpringMVC 学习笔记(处理器映射器的配置)
前端控制器(dispatchServlet) 在web.xml中配置前端控制器,在服务器启动时就被创建,用来对请求和响应进行接收 和 分发处理,其在配置时可以设置一个初始化参数,用来定位SpringM ...
- SpringMVC学习四(@ModelMap @RequestBody等等的说明)
参考如下 http://www.cnblogs.com/HD/p/4107674.html http://www.cnblogs.com/qiankun-site/p/5774325.html @re ...
- springMVC学习 四 请求的中文乱码解决
在使用SpringMVC时,同样有前端向后端发送请求,请求参数中有中文,需要解决中文乱码问题,在Spring中也是向java web中一样,通过一个过滤器来解决中文乱码. 这个过滤器在spring-w ...
- SpringMVC学习总结(四)——基于注解的SpringMVC简单介绍
SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是 DispatcherServlet,DispatcherServlet负责转发每一个Request ...
- (转)SpringMVC学习(五)——SpringMVC的参数绑定
http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...
- springMVC学习记录1-使用XML进行配置
SpringMVC是整个spring中的一个很小的组成,准确的说他是spring WEB这个模块的下一个子模块,Spring WEB中除了有springMVC还有struts2,webWork等MVC ...
- springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...
随机推荐
- 剑指offer——链表
#include"stdio.h" #include"stdlib.h" #include"iostream" using namespac ...
- 阿里云redisA迁移redisB迁移
./redis-port restore --input=./xxx.rdb --target=r-2zedc7c8e0557dsf4.redis.rds.aliyuncs.com:6379 --au ...
- javascipt中数组的常见操作
1.与lua不同,即使数组中间有null或者undefined,仍然能求出正确的长度 2.length 改变.length也会改变数组的大小 3. indexOf arr.indexOf(a)会返回第 ...
- js中报错"Maximum call stack size exceeded"解决方法
Uncaught RangeError: Maximum call stack size exceeded 错误直译过来就是“栈溢出”,出现这个错误的原因是因为我进行了递归运算,但是忘记添加判断条件, ...
- golang bufio.Scanner
一, 我们一般会这么用,接收 标准输入的东西: scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scann ...
- checkbox 框 选中判断
function checkAll(checktop){ $(":checkbox[name='id']").prop("checked",checktop.c ...
- 前端emmet插件的一些常用用法
以下是在webstorm中简单使用emmet插件,注意一点就是当编写完emmet命令后一定要把光标移动到命令的结尾处,不然生成的代码会不一样 <!DOCTYPE html> <htm ...
- css3画半圆
border-radius制作半圆与制作圆形的方法是一样的,只是元素的宽度与圆角方位要配合一致,不同的宽度和高度比例,以及圆角方位,可以制作上半圆.下半圆.左半圆和右半圆效果.例如:.semicirc ...
- Grunt:任务自动管理工具(收藏+转载)
原文:http://javascript.ruanyifeng.com/tool/grunt.html 安装 命令脚本文件Gruntfile.js Gruntfile.js实例:grunt-contr ...
- [转]【Oracle Database 12c新特性】32k varchar2 max_string_size
本文转自:https://blogs.oracle.com/askmaclean/entry/oracle_database_12c%E6%96%B0%E7%89%B9%E6%80%A7_32k_va ...