MVC 框架的交互图:
(1). 用户在浏览器输入地址,向页面发送请求(实则是向控制器发出相关命令);
(2). 控制器接受命令后,向模型请求获得相关的数据;
(3). 模型将相应的数据返回给控制器;
(4). 控制器将相关数据发送到指定的视图;
(5). 指定的视图呈现相关的数据。
目前流行的企业开发MVC框架的实现 由SSH(Spring,Struts2 ,hibernate) 和SSM (Spring,SpringMVC, Mybatis)两种组成。
两种框架的对比:
共同点: 都是使用Spring来作为容器管理对象和组件
1.Spring 依赖注入DI来管理各层的组件。
2.使用面向切面编程AOP管理事物、日志、权限等。
不同点:
1. SSH 采用Structs2做控制器,SSM采用SpringMVC做控制器,两种控制器的控制视图和模型的交互机制不同,Struts2是Action 类级别,SpringMVC 是方法级别,更容易实现REST风格。
2. SSM 使用 Hibernate 来完成对象持久化的工作,SSM使用MyBatis来完成对象持久化的工作
3. SSM越来越轻量级配置,将注解开发发挥到极致,且ORM实现更加灵活,SQL优化更简便;而SSH较注重配置开发,其中的Hibernate对JDBC的完整封装更面向对象,对增删改查的数据维护更自动化,但SQL优化方面较弱,且入门门槛稍高
SpringMVC 和 Structs2的对比:
Struts2框架执行步骤(Struts2使用Filter嵌入):
1. 客户端发起一个http请求,这个请求经过一系列过滤器Filter(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助)
2. 接着FilterDispatcher被调用,FilterDispatcher会询问ActionMapper来决定这个请求是否需要调用某个Action, 如果能够调用某个action,则FilterDispatcher将请求发送给ActionProxy,
3. ActionProxy 通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
4. ActionProxy创建一个ActionInvocation的实例,该实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用,一旦Action执行完毕, ActionInvocation 负责根据struts.xml中的配置找到对应的返回结果,
5. 将处理结果返回给客户端
SpringMVC框架执行步骤(SpringMVC使用Servlet嵌入)
1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。
5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。
Hibernate 和 MyBatis 两种ORM框架对比
java访问数据库的唯一方式就是JDBC, 其实Hibernate 和MyBatis 就是对JDBC的二次封装,完成对象持久化的工作(常说的DAO层就是数据持久层)
相同点:
1. Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成 SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
2. Hibernate和MyBatis都支持JDBC和JTA事务处理
各自的优势所在:
第一:
Hibernate 封装性好,屏蔽了数据库差异,数据库移植性很好,能够自动生成SQL语句,但是SQL语句优化困难;
MyBatis仅实现了SQL语句和对象的映射,需要针对具体的数据库写SQL语句,因此数据库的移植性不好, 不同的数据库需要写不同的SQL语句,可以进行更为细致的SQL优化,可以减少查询字段
第二:
Hibernate对对象的维护要比MyBatis好,更加的面向对象,对增删改查的对象的维护要方便; Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳,更新操作不能指定刷新指定记录,会清空整个表,但是也可以使用第三方缓存。
附上Spring 家族
以上内容基本上转载自
http://blog.csdn.net/pingdouble/article/details/52848007