SpringMVC_SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解实例详解

本文主要是介绍SpringMVC_SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解实例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 一、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 的朋友就很简单了,可以直接跳过。     

这篇关于SpringMVC_SpringMVC3.0.5+Spring3.0.5+MyBatis3.0.4全注解实例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004511

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2