步骤:1.客户端初始化一个指向Servlet的请求2.这个请求经过一系列的过滤器(Filter)3.接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action4.如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy5.ActionProxy根据Configuration Manager询问框架的配置文件,找到需要调用的Action类6.ActionProxy创建一个ActionInvocation实例7.ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Interceptor)的调用8.一旦Action执行完毕,ActionInvocation根据struts.xml中的配置找到对应的返回结果步骤:1.ActionServlet接收一个客户端的请求,检索和用户请求匹配的ActionMapping实例,如果不存在,就返回路径请求无效的信息2.如果ActionForm实例不存在,就创建一个ActionForm对象,把客户端提交的表单数据保存到ActionForm对象中3.根据配置信息决定是否需要表单验证,如果需要验证,就调用ActionForm的validate()方法4.如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功5.ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果对应的Action实例不存在,就先创建这个实例,然后调用Action 的execute()方法6.Action的execute()方法返回一个ActionForward对象,ActionServlet再把请求转发给对象指定的JSP组件7.ActionForward对象指向JSP组件生成动态页面返回给客户端struts1与struts2本质区别1 在Action实现类方面的对比:Struts 1要求Action类继续一个抽象基类;Struts 1的一个具体问题是使用抽象类编程而不是接口。
Struts2 Action类可以实现一个Action接口,也可以实现其他接口,使可选和定制的服务成为可能。
Struts 2提供一个ActionSupport基类去实现常用的接口。
即使Action接口不是必须实现的,只有一个包含execute方法的POJO类都可以用作Struts 2的Action。
2 线程模式方面的对比:Struts 1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
单例策略限制了Struts 1 Action能做的事,并且要在开发时非凡小心。
Action资源必须是线程安全的或同步的;Struts 2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。
3 Servlet依靠方面的对比:Struts 1 Action依靠于Servlet API,因为Struts 1 Action的execute方法中有HttpServletRequest和HttpServletResponse方法。
Struts 2 Action不再依靠于Serzvlet API,从而答应Action脱离Web容器运行,从而降低了测试Action的难度。
当然,假如Action需要直接访问HttpServletRequest和HttpServletResponse参数,Struts 2 Action仍然可以访问它们。
但是,大部分时候,Action都无需直接访问HttpServetRequest和HttpServletResponse,从而给开发者更多灵活的选择。
4 可测性方面的对比:测试Struts 1 Action的一个主要问题是execute方法依靠于Servlet API,这使得Action的测试要依靠于Web容器。
为了脱离Web容器测试Struts 1的Action,必须借助于第三方扩展:Struts TestCase,该扩展下包含了系列的Mock对象(模拟了HttpServetRequest和HttpServletResponse对象),从而可以脱离Web容器测试Struts 1的Action 类。
Struts 2 Action可以通过初始化、设置属性、调用方法来测试。
5 封装请求参数的对比:Struts 1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继续一个基类:ActionForm。
普通的JavaBean不能用作ActionForm,因此,开发者必须创建大量的ActionForm类封装用户请求参数。
虽然Struts 1提供了动态ActionForm来简化ActionForm的开发,但依然需要在配置文件中定义ActionForm;Struts 2直接使用Action属性来封装用户请求属性,避免了开发者需要大量开发ActionForm类的烦琐,实际上,这些属性还可以是包含子属性的Rich 对象类型。
假如开发者依然怀念Struts 1 ActionForm 的模式,Struts 2提供了ModelDriven模式,可以让开发者使用单独的Model 对象来封装用户请求参数,但该Model对象无需继续任何Struts 2基类,是一个POJO,从而降低了代码污染。
6 表达式语言方面的对比:Struts 1整合了JSTL,因此可以使用JSTL表达式语言。
这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts 2可以使用JSTL,但它整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language),因此,Struts 2下的表达式语言功能更加强大。
7 绑定值到视图的对比:Struts 1使用标准JSP机制把对象绑定到视图页面;Struts 2使用“ValueStack”技术,使标签库能够访问值,而不需要把对象和视图页面绑定在一起。
8 类型转换的对比:Struts 1 ActionForm 属性通常都是String类型。
Struts 1使用Commons-Beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;Struts 2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。
9 数据校验的对比:Struts 1支持在ActionForm重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。
Struts 2支持通过重写validate方法进行校验,也支持整合XWork校验框架进行校验。
10 Action执行控制的对比:Struts 1支持每一个模块对应一个请求处理(即生命周期的概念),但是模块中的所有Action必须共享相同的生命周期。
Struts 2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。
开发者可以根据需要创建相应堆栈,从而和不同的Action一起使用。
Hibernate优点(1) 对象/关系数据库映射(ORM)它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想(2) 透明持久化(persistent)带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。
这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。
一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。
(例如,用作跟表示层打交道的数据传输对象。
)(3) 事务Transaction(org.hibernate.Transaction)应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。
它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。
某些情况下,一个Session之内可能包含多个Transaction对象。
尽管是否使用该对象是可选的,但无论是使用底层的API 还是使用Transaction对象,事务边界的开启与关闭是必不可少的。
(4) 它没有侵入性,即所谓的轻量级框架(5) 移植性会很好(6) 缓存机制,提供一级缓存和二级缓存(7) 简洁的HQL编程Hibernate缺点(1) Hibernate在批量数据处理时有弱势(2) 针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用HibernateHibernate和iBATIS 优缺点比较Hibernate的特点:Hibernate功能强大,数据库无关性好,O/R映射能力强,Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行。
程序员往往只需定义好了POJO 到数据库表的映射关系,即可通过Hibernate 提供的方法完成持久层操作。
程序员甚至不需要对SQL 的熟练掌握,Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL 并调用JDBC 接口加以执行。
Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行,但是Hibernate现在已经是主流O/R Mapping框架,从文档的丰富性,产品的完善性,版本的开发速度都要强于iBA TIS。
iBATIS的特点:iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
iBA TIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
当系统属于二次开发,无法对数据库结构做到控制和修改,那iBA TIS的灵活性将比Hibernate更适合。
系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL 语句(或存储过程)才能达到系统性能设计指标。