第四章 SpringMVC--Controller接口控制器详解(5)

摘要: 之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法(如新增),如果�...

4.15、MultiActionController

之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法(如新增),如果我要实现比如最简单的用户增删改查(CRUD Create-Read-Update-Delete),那该怎么办呢?

4.15.1 解决方案

1、每一个功能对应一个控制器,如果是CRUD则需要四个控制器,但这样我们的控制器会暴增,肯定不可取;

2、使用Spring Web MVC提供的MultiActionController,用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,这种方式不错。

4.15.2 问题

1、  MultiActionController如何将不同的请求映射不同的请求的功能处理方法呢?

Spring Web MVC提供了MethodNameResolver(方法名解析器)用于解析当前请求到需要执行的功能处理方法的方法名。默认使用InternalPathMethodNameResolver实现类,另外还提供了ParameterMethodNameResolver和PropertiesMethodNameResolver,当然我们也可以自己来实现,稍候我们仔细研究下它们是如何工作的。

2、那我们的功能处理方法应该怎么写呢?

public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);

哦,原来如此,我们只需要按照如上格式写我们的功能处理方法即可;此处需要注意一下几点:

1、返回值:即模型和视图部分;

ModelAndView:模型和视图部分,之前已经见过了;

Map:只返回模型数据,逻辑视图名会根据RequestToViewNameTranslator实现类来计算,稍候讨论;

String:只返回逻辑视图名;

void:表示该功能方法直接写出response响应(如果其他返回值类型(如Map)返回null则和void进行相同的处理);

2、actionName功能方法名字;由methodNameResolver根据请求信息解析功能方法名,通过反射调用;

3、形参列表:顺序固定,“[]”表示可选,我们来看看几个示例吧:

//表示到新增页面

public ModelAndView toAdd(HttpServletRequest request, HttpServletResponse response);

//表示新增表单提交,在最后可以带着命令对象

public ModelAndView add(HttpServletRequest request, HttpServletResponse response, UserModel user);

//列表,但只返回模型数据,视图名会通过RequestToViewNameTranslator实现来计算

public Map list(HttpServletRequest request, HttpServletResponse response);

//文件下载,返回值类型为void,表示该功能方法直接写响应

public void fileDownload(HttpServletRequest request, HttpServletResponse response)

//第三个参数可以是session

public ModelAndView sessionWith(HttpServletRequest request, HttpServletResponse response, HttpSession session);

//如果第三个参数是session,那么第四个可以是命令对象,顺序必须是如下顺序

public void sessionAndCommandWith(HttpServletRequest request, HttpServletResponse response, HttpSession session, UserModel user)

4、异常处理方法,MultiActionController提供了简单的异常处理,即在请求的功能处理过程中遇到异常会交给异常处理方法进行处理,式如下所示:

public ModelAndView anyMeaningfulName(HttpServletRequest request, HttpServletResponse response, ExceptionClass exception)

MultiActionController会使用最接近的异常类型来匹配对应的异常处理方法,示例如下所示:

//处理PayException

public ModelAndView processPayException(HttpServletRequest request, HttpServletResponse response, PayException ex)

//处理Exception

public ModelAndView processException(HttpServletRequest request, HttpServletResponse response,  Exception ex)

4.15.3 MultiActionController类实现

类定义:public class MultiActionController extends AbstractController implements LastModified ,继承了AbstractController,并实现了LastModified接口,默认返回-1;

核心属性:

delegate功能处理的委托对象,即我们要调用请求处理方法所在的对象,默认是this;

methodNameResolver功能处理方法名解析器,即根据请求信息来解析需要执行的delegate的功能处理方法的方法名。

核心方法:

经典介绍:

源码结构

更多详细源码参考来源:http://minglisoft.cn/technology

Java代码

//判断方法是否是功能处理方法

private boolean isHandlerMethod(Method method) {

//得到方法返回值类型

Class returnType = method.getReturnType();

//返回值类型必须是ModelAndView、Map、String、void中的一种,否则不是功能处理方法

if (ModelAndView.class.equals(returnType) || Map.class.equals(returnType) || String.class.equals(returnType) ||

void.class.equals(returnType)) {

Class[] parameterTypes = method.getParameterTypes();

//功能处理方法参数个数必须>=2,且第一个是HttpServletRequest类型、第二个是HttpServletResponse

//且不能Controller接口的handleRequest(HttpServletRequest request, HttpServletResponse response),这个方法是由系统调用

return (parameterTypes.length >= 2 &&

HttpServletRequest.class.equals(parameterTypes[0]) &&

HttpServletResponse.class.equals(parameterTypes[1]) &&

!("handleRequest".equals(method.getName()) && parameterTypes.length == 2));

}

return false;

}

欢迎大家一起学习研究相关技术愿意了解框架技术或者源码的朋友直接加求求(企鹅):2042849237

更多详细源码参考来源:http://minglisoft.cn/technology

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 本文包括:1、Filter简介2、Filter是如何实现拦截的?3、Filter开发入门4、Filter的生命周期...
    廖少少阅读 7,352评论 3 56
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,372评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 火车轰隆隆,我一直从午夜看到黎明,然后太阳升起。 一夜的火车,从一个陌生的城市到另一个陌生的城市,车厢里没有一个熟...
    枝小花阅读 304评论 0 1