Spring MVC_Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)

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

     Spring MVC 是一个典型的 MVC 框架,是 Spring 内置的Web框架,可以作为应用项目的展示层,Spring 2.0Spring 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 的流程结构图,大家可以参考下。
    
    1Spring MVC的核心是DispatcherServlet,当客户端发送一个请求时,这个请求经过一系列过滤器处理。然后DispatcherServlet会接收到这个请求。
     2、 DispatcherServlet会从HandlerMapping对象中查找与请求匹配的Controller,并将结果返回给DispatcherServlet
     3、 DispatcherServlet将请求转发给目标Controller,如果定义有拦截器,则会经过这些拦截器处理。
     4Controller处理完成业务逻辑后,会返回一个结果给DispatcherServlet
     5、 DispatcherServlet 根据结果查询 ViewResolver ,找到与之对应的视图对象,同样将结果返回给 DispatcherServlet
     6、 DispatcherServlet 根据指定的显示结果,调用模板对象渲染 view
    7view返回给客户端。
     根据上面的说明,可以很很明显的看出, Spring MVC 的核心是 Servlet ,并且创建的 Controller 其实也是一个 Servlet
     三、 Spring struts2 比较
     另一个非常有名的 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 的一个组成部分,所以配置文件就会变得简单许多。以下就是本例子中最重要的几个配置文件。
     1 pom.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 下面。
    
3 servlet-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支持多种类型的视图文件。如:jspfreemarkervelocitytilesjasperreports等。
    
     4 service-context.xml
    与 ssh2 里面的 application.xml 区别不大,主要是将 hibernate 那部分改为 mybatis ,还要将 MybatisDao 基类配置进来,以便 Service 类可以用注解的方式引入,然后就是扫描包路径,不扫描带有 @Controller 注解的类。因为这些类已经随容器启动时,在 servlet-context 中扫描过一遍了。
    
    
    
     5 mybatis-config.xml
     mybatis 的主配置,里面包含了 POJO 的映射文件,这里了解一下就行,后面的章节会对这些进行说明,熟悉 ibatis 的朋友就很简单了,可以直接跳过。
    
    到此,关于配置文件的说明就讲完了,因为这个 SSM3 的例子采用 maven 来构建,与之前的 SSH2 不一样,大象对配置文件进行了简要的说明,使用 maven 的好处,大家应该看出来了,它对于开发构建来说显得简单一些,可以使你不需要到处去找 jar 包,也不用你去担心版本不一致的问题,另外,对于依赖的 jar 包,它还能自动去查找它自己的依赖,这可以减少我们很多不必要的重复劳动。下一章,我将分析下本例的层次结构与 MyBatis 的简单运用。
     本文为菠萝大象原创,如要转载请注明出处。http://bolo.blogjava.net/

猜你喜欢

转载自eddysoft.iteye.com/blog/1949521