在上一篇文章中我详细的介绍了如何搭建maven环境以及生成一个maven骨架的web项目,那么这章中我将讲述Spring MVC的流程结构,Spring MVC与Struts2的区别,以及例子中的一些配置文件的分析。 一、Spring MVC 3.0介绍

Spring MVC是一个典型的MVC框架,是Spring内置的Web框架,可以作为应用项目的展示层,继Spring 2.0对Spring MVC进行重大升级后,Spring 2.5又为Spring MVC引入了注解驱动功能,再到3.0时代,全面支持REST的网络服务和更容易的网络编程。这一系列的变革,无疑吸引着我们走进Spring MVC 3.0的世界。 REST功能是Spring MVC 3.0新增的,它通过不带扩展名的URL来访问系统资源。REST是把访问的所有资源看成静态的,一个或一组,每个不同的URL地址都是一个静态资源。那么Spring MVC 3.0是如何支持REST的呢?简单的说,它是通过@RequestMapping及@PathVariable注解提供的,在@RequestMapping中指定value与method,就可以处理对应的请求。另外spring mvc框架还做了很多很多工作。
二、Spring MVC流程

大象根据官方文档的介绍,以及自己的理解,画了一个Spring MVC的流程结构图,大家可以参考下。

1、Spring MVC的核心是DispatcherServlet,当客户端发送一个请求时,这个请求经过一系列过滤器处理。然后DispatcherServlet会接收到这个请求。

2、DispatcherServlet会从HandlerMapping对象中查找与请求匹配的Controller,并将结果返回给DispatcherServlet。
3、DispatcherServlet将请求转发给目标Controller,如果定义有拦截器,则会经过这些拦截器处理。
4、标Controller处理完成业务逻辑后,会返回一个结果给DispatcherServlet。

5、DispatcherServlet根据结果查询ViewResolver,找到与之对应的视图对象,同样将结果返回给DispatcherServlet。
6、DispatcherServlet根据指定的显示结果,调用模板对象渲染view。
7、将view返回给客户端。
根据上面的说明,可以很很明显的看出,Spring MVC的核心是Servlet,并且创建的Controller其实也是一个Servlet。
三、Springstruts2比较
另一个非常有名的MVC框架是Struts2,Spring MVC的核心是Servlet,而Struts2的核心则是Filter。下表列出Spring MVC与Struts2的主要区别与比较结果。

通过上面的综合比较,Spring MVC 3.0的优势要比Struts2大得多,虽然它还有些不足的地方,但随着后期版本的升级,必然会进行改进,会做的更好。所以采用Spring MVC 3.0作为系统的展示层要比Struts2好。

四、线程安全
由于Spring MVC默认是Singleton的,所以会产生一个潜在的安全隐患。根本核心是instance变量保持状态的问题。
这个问题有两种解决办法:

a)在控制器中不使用实例变量

b)将控制器的作用域从单例改为原型
这两种做法有好有坏,第一种,需要开发人员拥有较高的编程水平与思想意识,在编码过程中力求避免出现这种BUG,而第二种则是容器自动的对每个请求产生一个实例,由JVM进行垃圾回收,因此做到了线程安全。使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
五、配置文件
Spring MVC是Spring的一个组成部分,所以配置文件就会变得简单许多。以下就是本例子中最重要的几个配置文件。
1pom.xml
管理项目依赖,编译,发布,插件配置等等。所有的依赖包都由配置决定,另外所需依赖包的其它依赖,无需配置,maven会自动获取并进行管理,这无疑帮我们减少了很多工作量,再也不用为到处找jar包,或版本不一致而头疼了。
定义依赖版本属性

Spring依赖,本例是一个很基础的例子,所以有这些就够了,以后有扩展再增加。

MyBatis依赖,iBatis从3.0版之后就改名为MyBatis。这个例子,大象没有使用Hibernate,而是采用更轻量级的MyBatis来作为持久层框架,使用很简单,也很灵活。另外,本例还用到了一个mybatis-spring插件,这是因为spring 3.0.5仅支持ibatis 2.0,所以需要这个插件来处理底层数据源等工作。

本例用到了AOP,所以需要这两个依赖

下面是其它一些必须的依赖,值得说明的就是,因为在本例中,大象对Service还是用的类,没有进行基于接口的实现方式,所以需要cglib这个依赖。另外,页面使用html作为展示层,使用freemarker标签处理动态数据。 2web.xml

与ssh2的web.xml主要的区别就是替换Struts2的启动配置,改为Spring MVC的设置,配置如下:
servlet-context.xml包含容器启动时,所要执行的内容,而service-context.xml则是接下来由spring上下文监听器对其进行扫描执行。这两个配置文件可以合并成一个,大象为了便于管理,并且为了使用spring上下文,写成了两个文件。如果我们不指定init-param配置,默认的,在服务器启动时,会在WEB-INF目录下查找命名规则为<servlet-name>-servlet.xml的文件,对应到这里就是ssm3-servlet.xml文件,大象统一将所有文件都放在了classpath下面。 3servlet-context.xml
Spring MVC启动时的配置文件,包含组件扫描、url映射以及设置freemarker参数,让spring不扫描带有@Service注解的类。为什么要这样设置?因为servlet-context.xml与service-context.xml不是同时加载,如果不进行这样的设置,那么,spring就会将所有带@Service注解的类都扫描到容器中,等到加载service-context.xml的时候,会因为容器已经存在Service类,使得cglib将不对Service进行代理,直接导致的结果就是在service-context中的事务配置不起作用,发生异常时,无法对数据进行回滚。另外能够将REST URL解析为请求映射的是DefaultAnnotationHandlerMapping这个类,它在启动时,对Controller中所有标注了@RequestMapping注解的方法,都放到了一个HandlerMapping对象中,当有请求时,就在这个对象中进行查找是否有与之匹配路径的处理方法,有则执行,没有就会输出一个Not Page Found警告信息。
展示层使用freemarker模板引擎,为了便于编辑,大象在这里使用html作为展示页。Spring框架对freemarker进行了集成与封装,配置起来非常简单。主要是定义FreeMarker视图解析器与属性配置,网上有很多关于这些属性含义的介绍,大象就不在这里啰嗦了,后面讲到Spring MVC的时候会结合代码来进行说明。Spring MVC支持多种类型的视图文件。如:jsp、freemarker、velocity、tiles、jasperreports等。
4service-context.xml
与ssh2里面的application.xml区别不大,主要是将hibernate那部分改为mybatis,还要将MybatisDao基类配置进来,以便Service类可以用注解的方式引入,然后就是扫描包路径,不扫描带有@Controller注解的类。因为这些类已经随容器启动时,在servlet-context中扫描过一遍了。
5mybatis-config.xml
mybatis的主配置,里面包含了POJO的映射文件,这里了解一下就行,后面的章节会对这些进行说明,熟悉ibatis的朋友就很简单了,可以直接跳过。

到此,关于配置文件的说明就讲完了,因为这个SSM3的例子采用maven来构建,与之前的SSH2不一样,大象对配置文件进行了简要的说明,使用maven的好处,大家应该看出来了,它对于开发构建来说显得简单一些,可以使你不需要到处去找jar包,也不用你去担心版本不一致的问题,另外,对于依赖的jar包,它还能自动去查找它自己的依赖,这可以减少我们很多不必要的重复劳动。下一章,我将分析下本例的层次结构与MyBatis的简单运用。
 

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)的更多相关文章

  1. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

    前两章我为大家详细介绍了如何搭建Maven环境.Spring MVC的流程结构.Spring MVC与Struts2的区别以及示例中的一些配置文件的分析.在这一章,我就对示例的层次结构进行说明,以及M ...

  2. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)

    这一章大象将详细分析web层代码,以及使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能.     之前在使用Struts2实现MVC的注解时,是借助struts2-conventi ...

  3. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)

    Spring更新到3.0之后,其MVC框架加入了一个非常不错的东西——那就是REST.它的开放式特性,与Spring的无缝集成,以及Spring框架的优秀表现,使得现在很多公司将其作为新的系统开发框架 ...

  4. Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)

    这是本系列的最后一篇,主要讲一下FreeMarker模板引擎的基本概念与常用指令的使用方式.     一.FreemMarker基本概念     FreemMarker是一个用Java语言编写的模板引 ...

  5. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  6. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

  7. Spring MVC(3)Spring MVC 高级应用

    一.Spring MVC 的数据转换和格式化 前面的应用,都只是用HandlerAdapter去执行处理器. 处理器和控制器不是一个概念,处理器是在控制器功能的基础上加上了一层包装,有了这层包装,在H ...

  8. Spring MVC(2)Spring MVC 组件开发

    一.控制器接收各类请求参数 代码测试环境: 接收各类参数的控制器--ParamsController package com.ssm.chapter15.controller; @Controller ...

  9. centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解

    centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解 环境准备: 操作系统:centos ...

随机推荐

  1. Spring 3.x企业应用开发实战(14)----事务

    Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的.要深入了解Spring的事务管理和配置,有必要先对数据库事务的基础知识进行学习. 何为数据库事务 “ ...

  2. linux 文件、文件夹的重命名命令

    linux中没有重命名命令,一般用mv替代.如将test更名为testsmv test tests隐藏是mv test .test 说到文件的隐藏,linux下文件如果想隐藏起来只要重命名这个文件就可 ...

  3. push本地代码到github出错

    $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] master -> master (non-f ...

  4. Android启动时间测试方法

    android apk启动时间可以通过下面的命令来完成测试,最终会生成一个mp4的视屏文件,通过播放录制好的视屏来统计app的启动时间精确到ms级别   例如:adb shell screenreco ...

  5. POJ 1062 昂贵的聘礼 解题报告

    本题不难,但是笔者贡献了30多次Submit……就像Discuss讨论的一样,细节决定成败,WA了肯定有理由. 贴代码,Dijkstra+优先队列. #include <cstdio> # ...

  6. MEF学习小结 z

    1.什么是MEF. MEF,全称是Managed Extensibility Framework.它是.NET Framework4.0的一个类库,其主要目的是为了创建可扩展的应用程序.按照官方说法就 ...

  7. Hadoop HDFS的常用命令

    1.将目录/root/data/下的item.txt复制到HDFS下的/user/root下: hadoop fs -copyFromLocal /root/data/item.txt itemdat ...

  8. git日常操作

    0.准备工作 0.1 git安装 http://git-scm.com/download/   图形客户端建议使用source tree,中文界面 http://www.sourcetreeapp.c ...

  9. 在触屏设备中拖动 overflow 元素

    在 Android 和 iOS 等触屏设备中,如果网页中某元素设置 overflow: auto 或者 overflow:scroll,那么问题就来了.在 Android 3.0 之前以及 iPhon ...

  10. ros和Android(一)

    ros和Android :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { ...