在上一篇文章中我详细的介绍了如何搭建maven环境以及生成一个maven骨架的web项目,那么这章中我将讲述Spring MVC的流程结构,Spring MVC与Struts2的区别,以及例子中的一些配置文件的分析。 1、Spring MVC 3.0介绍html
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框架还作了不少不少工做。
2、Spring MVC流程
大象根据官方文档的介绍,以及本身的理解,画了一个Spring MVC的流程结构图,你们能够参考下。
1、Spring MVC的核心是DispatcherServlet,当客户端发送一个请求时,这个请求通过一系列过滤器处理。而后DispatcherServlet会接收到这个请求。
二、DispatcherServlet会从HandlerMapping对象中查找与请求匹配的Controller,并将结果返回给DispatcherServlet。
三、DispatcherServlet将请求转发给目标Controller,若是定义有拦截器,则会通过这些拦截器处理。
4、标Controller处理完成业务逻辑后,会返回一个结果给DispatcherServlet。
五、DispatcherServlet根据结果查询ViewResolver,找到与之对应的视图对象,一样将结果返回给DispatcherServlet。
六、DispatcherServlet根据指定的显示结果,调用模板对象渲染view。
7、将view返回给客户端。
根据上面的说明,能够很很明显的看出,Spring MVC的核心是Servlet,而且建立的Controller其实也是一个Servlet。
3、Spring与struts2比较
另外一个很是有名的MVC框架是Struts2,Spring MVC的核心是Servlet,而Struts2的核心则是Filter。下表列出Spring MVC与Struts2的主要区别与比较结果。
经过上面的综合比较,Spring MVC 3.0的优点要比Struts2大得多,虽然它还有些不足的地方,但随着后期版本的升级,必然会进行改进,会作的更好。因此采用Spring MVC 3.0做为系统的展现层要比Struts2好。
4、线程安全
因为Spring MVC默认是Singleton的,因此会产生一个潜在的安全隐患。根本核心是instance变量保持状态的问题。
这个问题有两种解决办法:
a)在控制器中不使用实例变量
b)将控制器的做用域从单例改成原型
这两种作法有好有坏,第一种,须要开发人员拥有较高的编程水平与思想意识,在编码过程当中力求避免出现这种BUG,而第二种则是容器自动的对每一个请求产生一个实例,由JVM进行垃圾回收,所以作到了线程安全。使用第一种方式的好处是实例对象只有一个,全部的请求都调用该实例对象,速度和性能上要优于第二种,很差的地方,就是须要程序员本身去控制实例变量的状态保持问题。第二种因为每次请求都建立一个实例,因此会消耗较多的内存空间。
5、配置文件
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,因此须要这个插件来处理底层数据源等工做。
下面是其它一些必须的依赖,值得说明的就是,由于在本例中,大象对Service仍是用的类,没有进行基于接口的实现方式,因此须要cglib这个依赖。另外,页面使用html做为展现层,使用freemarker标签处理动态数据。 2、web.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支持多种类型的视图文件。如:jsp、freemarker、velocity、tiles、jasperreports等。
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的简单运用。