- 可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。
- 视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。
- 模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。
- 潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。
- 增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
- 视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
- 视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
- 目前,一般高级的界面工具或构造器不支持此模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成MVC使用的困难。
1> 客户端浏览器发出HTTP请求.
2> 根据web.xml配置,该请求被FilterDispatcher接收
3> 根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton
4> Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5> Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面
6> 返回HTTP响应到客户端浏览器
3. 工作原理
1> 客户端初始化一个指向Servlet容器的请求
2> 这个请求经过一系列的过滤器(Filter)
3> 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4> 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5 > ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类
6> ActionProxy创建一个ActionInvocation的实例。
7> ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8> 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
4. 为什么使用struts2?
1> 开源的mvc框架
2> 纯pojo的Action
3> 更好的标签特性
4> 易测试
5> 易扩展
- 在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。
- 线程模型方面:Struts1的Action工作在单例模式,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例。没有线程安全方面的问题。
- Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
- 封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
- 表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph Notation Language)。
- 绑定值到视图技术:Struts1使用标准的JSP,Struts使用“ValueStack”技术。
- 类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。
- 数据校验:Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
- Action执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的声明周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的声明周期。
----------------------------------------------------------------Hibernate部分--------------------------------------------------
1> 读取并解析hibernate核心配置文件
2> 读取并解析映射信息
3> 创建SessionFactory
4> 打开Sesssion
5> 创建事务Transation
6> 持久化操作
7> 提交事务
8> 关闭Session
9> 关闭SesstionFactory
3. 为什么使用Hibernate?
Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
Hibernate是一个基于jdbc的主流持久化框架,是用优秀的orm实现,它很大程度的简化了dao层编码工作
4. Hibernate 能干什么?
- 实现OR之间的Mapping。
- 减少jdbc+sql的开发时间,提高开发效率。
- 能够屏蔽不同的数据库的实现,能够实现平滑的在不同数据库之间进行移植。