MyBatis+Spring MVC开发指南(四)

前言

《MyBatis+Spring MVC开发指南(一)》

《MyBatis+Spring MVC开发指南(二)》

《MyBatis+Spring MVC开发指南(三)》

这篇博客是这个系列的最后一篇,涉及Spring+Spring MVC+MyBatis之间的整合、Controller的写法分析、异常处理、JSON交互,RESTful支持、拦截器等。

Spring、Spring MVC、MyBatis整合思路分析


Spring、Spring MVC、MyBatis集成原理图

在这里,我并不会给出Spring/Spring MVC/MyBatis整合的每一个细节,而是分析它们整合的思路!

第一,我们需要让Spring整合Web,说白了就是让Spring管理Bean,并进行依赖注入等。方法很简单,就是在web.xml配置一个listener让它去加载Spring的配置文件。

第二,我们需要让Spring MVC整合Web,就是在web.xml中去配置前端控制器,指明Spring MVC的配置文件在哪里及servlet-mapping。

第三,要知道Spring MVC是Spring的一个web模块而已,它们之间无需整合。

第四,要整合MyBatis,其实就是把SqlSessionFactoryBean以及Mapper接口的管理交给Spring。

第五,注意注解的配置,想一想涉及哪些呢?

比如,Spring MVC基于注解的处理器映射器、处理器适配器;

比如,Spring IOC涉及到的注解、以及组件注解等;

总结来说,就是Spring负责Mapper、Service、Controller的管理(实例化以及依赖注入),还会对Service进行事务控制,可见Spring就是整合的核心!


分析:Controller到底该如何写?

Controller类,首先来说,应该打上@Controller注解,同时应该让Spring可以扫描到。

为了对url进行分类管理,可以在Controller上打上@RequestMapping注解。

我们知道HTTP请求,常用的有POST和GET2种方式,那么可以在方法上利用@RequestMapping进行限定。

Spring MVC是基于方法链的,那么Controller的方法定义就很特别了。特别在哪里呢?

参数需要绑定(@RequestParam),甚至是需要完成自定义的转化后在绑定;(如不使用注解需要参数名称一致;自定义参数绑定需要实现Converter接口并进行相关配置,要知道HandlerApdater是执行Handler的,所以应该配置到处理器适配器上)

是否有的参数可以不用传递?或者可以指定默认值呢?

对于数组、集合、MAP等这些复杂的类型,参数绑定需要注意什么呢?(List/Map的绑定,必须借助POJO,也就是说POJO中要存在List/Map属性才可以绑定)

参数校验如何做呢?(使用@Validated,并在处理器适配器上进行配置)

对于形参列表,哪些有着特殊的含义?(Model/ModelMap/HttpServletRequest/HttpServletResponse/HttpSession这些可以直接使用!)

对于形参列表中的POJO,Spring MVC会自动的放置到request域,并可以通过@ModelAttribute来指定key;而对于形参列表中的简单类型,Spring MVC并没有这样做。无论何时,都不要忘了最简单的方式:通过Model的addAttribute方法可以直接设置数据到request域!

方法的返回值,可以返回ModelAndView,还可以返回什么呢?JSON该如何返回?可不可以返回void呢?(要么是返回逻辑视图,可以ModelAndView指定,也可以通过返回String指明逻辑视图;要么是返回响应流数据,比如通过AJAX请求JSON数据。)

如何实现重定向呢?(默认的ModelAndView就是forward的,重定向的话需要明确指明redirect;注意重定向意味着URL地址栏发生变化且Request域失效)

上面的分析,不禁让人想到了以前Struts2的Action开发,那么Spring MVC和Struts2有哪些区别呢?

第一,直观上来说,Spring MVC基于方法开发,而Struts2基于类开发;

第二,从参数绑定来看,Struts2是基于类的成员变量进行绑定的,为了避免多线程问题,是多例的;而Spring MVC可以看到都是绑定到方法的形参列表上,方法执行完毕就销毁了,可见Spring MVC是基于单例的!而且有一点你一定有感触,那就是Struts2的Action中的成员变量实在是太多了,而且到底哪些变量被哪些方法所使用到,并不能一目了然,而Spring MVC却帮助我们做到了!

第三,以前工作中,有时候就会收到Struts2需要升级的邮件,因为存在的一些漏洞和安全隐患;而Spring MVC使用这么久呢,还没听到这些“负面新闻”!


Spring MVC如何进行异常处理?


异常处理框架

通过上图,相信你会明白,Spring MVC通过提供一个全局的异常处理器进行统一的异常处理。具体做法如下:

第一,定义好你的系统的一些异常类型(extends Exception)

第二,定义一个全局的异常处理器(实现HandlerExceptionResolver接口),在这里,我们可以进行异常类型判断,ModelAndView设置等

第三,在spring-mvc.xml配置中,通过<bean>标签加载这个异常处理器即可。


JSON交互

Spring MVC对JSON的支持,无非表现在2个方面:

第一,请求过来的是JSON数据类型,那么Spring MVC可以将其转化为Java对象;

第二,Spring MVC可以把Java对象转化成JSON予以客户端响应;

在实际开发中,用的最多的就是把Java对象转成JSON返回给客户端。

实际上,在基于注解的处理器适配器中已经默认支持了对JSON的处理,所以无需我们做其他配置了!

Spring MVC使用jackson进行JSON处理,因此需要加入jackson的依赖(jackson-core-asl、jackson-mapper-asl)。


@ResponseBody

说白了,@ResponseBody都干了些什么呢?

无非就是往response的流中写了点JSON数据,并告诉浏览器我给你的是JSON数据类型喔(application/json),仅此而已!

与@ResponseBody对应的,就是@RequestBody,无非就是把请求类型为JSON的数据转化成对应的Java对象而已。


RESTful支持

RESTful,即Representational State Trasfer,本质上就是HTTP开发理念而已。

它其实对HTTP开发主要提出了3点规范:

第一,对URL进行规范

非RESTful风格:   http://.../findUserById.do?id=xxx

RESTful风格:      http://.../user/xxx

你可以看到,RESTful风格的URL不在存在KEY/VALUE了。

第二,HTTP的方法进行规范

如果是查询user,那么使用GET方法;如果是新增,那么使用POST;如果是删除,使用delete方法。

到这里,你应该有点感触了,那就是说我们访问一个URL,需要通过不同的HTTP METHOD来进行区分处理。这个就有点麻烦了,实质上,在实际开发中,能够做到这一点的,太少了!

第三,对HTTP的content-type进行规范

也就是说,在请求的时候,就指定了需要响应的content-type。

目前,对RESTful的应用大都停留在第一点。

上面,介绍了RESTful的一些概念,那么Spring MVC该如何支持呢?

第一,要知道RESTful不存在KEY/VALUE,那么显然,我们需要将http://.../user/xxx中的xxx映射到形参列表上。

因此,对于@RequestMapping而言,需要使用{xxx}这种占位符,然后在利用@PathVariable("xxx")进行绑定到形参上。

第二, 你应该发现了RESTful这种风格的URL是没有后缀的(什么.do .action都没有了),那么我们的前端控制器的URL映射只能配置成/了,那么问题就来了。什么问题呢,就是对静态资源的访问问题。

需要修改web.xml指明CSS/JS/IMG等静态资源的处理方式。(网上例子很多,这里我主要谈思路,就不多说了)


拦截器

拦截器,有很多应用场景,比如用户认证、统一日志处理等。


HandlerInterceptor接口

自定义拦截器需要实现HandlerInterceptor接口,提供3个方法的实现。这3个方法,顾名思义,不过需要注意的是preHandle返回的是boolean,也就是说如果返回false,那么postHandler/afterCompletion不会执行。

在拦截器中,我们可以通过request获取URL,获取Session中的用户数据,还可以设置跳转地址等。

注意拦截器需要配置,也就是说我们需要对什么样的URL进行拦截,如果放行才让HandlerAdapter去执行Handler。(在Spring MVC配置XML中使用<mvc:interceptors>即可)


到这里,整个《MyBatis+Spring MVC开发指南》系列就结束了,由于开发中涉及的细节方方面面太多了,不可能也不会完全覆盖,希望这个系列能从思路上给大家帮助,足矣!

See u next blog!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,678评论 6 342
  • Spring MVC一、什么是 Spring MVCSpring MVC 属于 SpringFrameWork 的...
    任任任任师艳阅读 3,360评论 0 32
  • 大家知道著名大作家金庸吗?今天我们走进金庸笔下的四个主角吧! 一个表面看起来傻乎乎的英雄,一个聪明能...
    细雨若晴阅读 405评论 0 0
  • 题记:除夕的脚步越来越近了,异乡的漂泊者又将变成候鸟,随着春节的脚步迁徙。 此时,家中的老父亲、老母亲可能早已经备...
    安芮娴阅读 103评论 0 4