Struts2工作原理
struts2工作原理图1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求
2 这个请求经过一系列的过滤器( Filter) (这些过滤器中有一个叫做 ActionContextCleanUp 的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)
3 接着 FilterDispatche r 被调用,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 中的配置找到对应的返回结果。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
在上述过程中所有的对象( Action , Results , Interceptors ,等)都是通过 ObjectFactory 来创建的
Struts2 优缺点(即为什么要用 struts2 )
Struts2 就会自动的进行验证。还有很多,比如国际化资源文件等。
Struts2 的开发中来,如果你重来没有用过任何框架,你也可以通过快速的学习,加入到 Struts2 的应用开发中来,因为它足够的简单。
大量的拦截器:
Struts2 本身提供了大量的可重用的拦截器,比如类型转换拦截器,很多时候我们从页面取得参数,这个时候它是 String 类型的,我们需要手动。
基于插件的框架:
Struts2 是一个基于插件的框架,社区中提供了很多实用的插件,比如 jfreechat/json 等等,使用这些插件可以简化我们的开发,加快开发进度。
struts2 最大的缺点莫过于在好多 web 服务器上支持不好,例如在 websphere5.5,weblogic8.1 及以前版本支持非常查,需要用最新的。
多种视图的支持:
多种视图的支持: jsp , freemarker , Veloctiy ,只要你愿意,你甚至可以通过轻松的改造让它支持 pdf ,同一个项目中你可以支持多种视图。
更加的模块化:
与 Struts1.X 相比, Struts2 更加的模块化,可以轻松将配置信息按功能界限拆分成多个文件,便于管理和团队协作开发。
与Spring的集成:
与 Struts1.x 相比, Struts2 不必再自己编写 singleton ,进一步的降低了程序间的耦合性,就 Struts2 内部本身而言,降低了框架本身的偶合性。
基于pojo易于测试:
在 Struts1.x 中我需要 Mock 出这两个 Http 对象,使我们很难编写 Action 的单元测试,与 Struts1.x 相比, Struts2 的 Action 不再依赖于 HttpServletRequest 和 HttpServletResponse 对象,使我们能够更方便的针对 Action 编写单元测试。
Hibernate工作原理
1. 读取并解析配置文件2. 读取并解析映射信息,创建 SessionFactory
3. 打开 Sesssion
4. 创建事务 Transation
5. 持久化操作
6. 提交事务
7. 关闭 Session
8. 关闭 SesstionFactory
Hibernate 优缺点
优点:
1: hibernate是基于ORMapping技术的开源的框架,对JDBC进行了轻量级的封装,使用面向对象的思维来操纵数据库。
2:hibernate提供了session缓存和二级缓存,对于不需要进行复杂查询的系统,性能有提升。
3:低侵入式设计
缺点:
1:hibernate学习成本太高。
2:不适合有复杂的sql查询(统计) 。
3:不适合大量的聚集操作,(存储过程)
优缺点补充:
1 、 不需要编写的SQL语句( 不需要编辑 JDBC) ,只需要操作相应的对象就可以了,就可以能够存储、更新、删除、加载对象,可以提高生产效;
2 、因为使用 Hibernate 只需要操作对象就可以了,所以我们的开发更对象化了;
3 、 使用Hibernate,移植性好( 只要使用 Hibernate 标准开发,更换数据库时,只需要配置相应的配置文件就可以了,不需要做其它任务的操作 ) ;
4 、 Hibernate 实现了透明持久化: 当保存一个对象时,这个对象不需要继承Hibernate中的任何类、实现任何接口,只是个纯粹的单纯对象—称为POJO对象( 最纯粹的对象 — 这个对象没有继承第三方框架的任何类和实现它的任何接口 )
5 、 Hibernate是一个没有侵入性的框架,没有侵入性的框架我们一般称为轻量级框架
6 、 Hibernate 代码测试方便。
Spring工作原理
内部最核心的就是 IOC 了,动态注入,让一个对象的创建不用 new 了,可以自动的生产,这其实就是利用 java 里的反射
反射其实就是在运行时动态的去创建、调用对象, Spring 就是在运行时,跟 xml Spring 的配置
文件来动态的创建对象,和调用对象里的方法的 。
Spring 还有一个核心就是 AOP 这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是
在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过
配置类达到的。
Spring 目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明
管理的( Spring 根据这些配置 内部通过反射去动态的组装对象)
要记住: Spring 是一个容器,凡是在容器里的对象才会有 Spring 所提供的这些服务和功能。
Spring 里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计模式)
Spring 里的配置是很多的,很难都记住,但是 Spring 里的精华也无非就是以上的两点,把以上两点跟理解了 也就基本上掌握了 Spring.
Spring AOP 与 IOC
一、 IoC(Inversion of control): 控制反转
1 、 IoC :
概念:控制权由对象本身转向容器;由容器根据配置文件去创建实例并创建各个实例之间的依赖关系
核心: bean 工厂;在 Spring 中, bean 工厂创建的各个实例称作 bean
二、 AOP(Aspect-Oriented Programming): 面向方面编程
1 、 代理的两种方式:
静态代理:
l 针对每个具体类分别编写代理类;
l 针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个 InvocationHandler ,然后借用 JDK 反射包中的 Proxy 类为各种接口动态生成相应的代理类
Spring 优缺点
它是一个开源的项目,而且目前非常活跃;它基于 IoC ( Inversion of Control ,反向控制)和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring ,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC ,对不同的数据访问技术提供了统一的 接口,采用 IoC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现 Transcation Managment ,等等
优点
a. Spring 能有效地组织你的中间层对象,不管你是否选择使用了 EJB 。如果你仅仅使用了 Struts 或其他为 J2EE 的 API 特制的 framework , Spring 致力于解决剩下的问题。
b. Spring 能消除在许多工程中常见的对 Singleton 的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。
c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件, Spring 能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读 Javadoc 甚至源编码?有了 Spring ,你仅仅需要看看类的 JavaBean 属性。 Inversion of Control 的使用(在下面讨论)帮助完成了这种简化。
d. 通过把对接口编程而不是对类编程的代价几乎减少到没有, Spring 能够促进养成好的编程习惯。
e. Spring 被设计为让使用它创建的应用尽可能少的依赖于他的 APIs 。在 Spring 应用中的大多数业务对象没有依赖于 Spring 。
f. 使用 Spring 构建的应用程序易于单元测试。
g. Spring 能使 EJB 的使用成为一个实现选择 , 而不是应用架构的必然选择。你能选择用 POJOs 或 local EJBs 来实现业务接口,却不会影响调用代码。
h. Spring 帮助你解决许多问题而无需使用 EJB 。 Spring 能提供一种 EJB 的替换物,它们适用于许多 web 应用。例如, Spring 能使用 AOP 提供声明性事务管理而不通过 EJB 容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个 JTA 实现。
i. Spring 为数据存取提供了一个一致的框架 , 不论是使用的是 JDBC 还是 O/R mapping 产品(如 Hibernate )。
Spring 确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。
缺点: jsp 中要写很多代码、控制器过于灵活,缺少一个公用控制器