SSh三大框架工作原理介绍
Posted 官小飞
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSh三大框架工作原理介绍相关的知识,希望对你有一定的参考价值。
Struts1工作原理
Struts1工作原理图1 、初始化: struts 框架的总控制器 ActionServlet 是一个 Servlet ,它在 web.xml 中配置成自动启动的 Servlet ,在启动时总控制器会读取配置文件 (struts-config.xml) 的配置信息,为 struts 中不同的模块初始化相应的对象。 ( 面向对象思想 )
2 、发送请求:用户提交表单或通过 URL 向 WEB 服务器提交请求,请求的数据用 HTTP 协议传给 web 服务器。
3 、 form 填充: struts 的总控制器 ActionServlet 在用户提交请求时将数据放到对应的 form 对象中的成员变量中。
4 、派发请求:控制器根据配置信息对象 ActionConfig 将请求派发到具体的 Action ,对应的 formBean 一并传给这个 Action 中的 excute() 方法。
5 、处理业务: Action 一般只包含一个 excute() 方法,它负责执行相应的业务逻辑 ( 调用其它的业务模块 ) 完毕后返回一个 ActionForward 对象。服务器通过 ActionForward 对象进行转发工作。
6 、返回响应: Action 将业务处理的不同结果返回一个目标响应对象给总控制器。
7 、查找响应:总控制器根据 Action 处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为 jsp 页面。
8 、响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。
Struts1优缺点(为什么要用strust1)
1. 优点:
① 开源的框架,结构清晰
② 是 MVC 的经典实现( MVC 是一种思想,而不是一种技术)
③ 处理异常机制,实现国际化
④ 具有强大的标签库
⑤ 解决了 JSP 页面存在大量的 JAVA 代码,维护起来方便
⑥ 在 formBean 中会自动提交,不会去使用传统的 get 、 set 方法得到值、取值
2. 缺点:
① 配置复杂
② 测试不方便
③ 依赖 web 容器
④action 是一个单例模式,必须设置为线程安全
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 、 代理的两种方式:
静态代理:
- 针对每个具体类分别编写代理类
- 针对一个接口编写一个代理类
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
它是一个开源的项目,而且目前非常活跃;它基于 IoC ( Inversion of Control ,反向控制)和 AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring ,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC ,对不同的数据访问技术提供了统一的 接口,采用 IoC 使得可以很容易的实现 bean 的装配,提供了简洁的 AOP 并据此实现 Transcation Managment ,等等
优点
- Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework,Spring致力于解决剩下的问题。
- Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。
- 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属
- 性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。
- 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。
- Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
- 使用Spring构建的应用程序易于单元测试。
- Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
- Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。
- Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品(如Hibernate)。
Spring 确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。
以上是关于SSh三大框架工作原理介绍的主要内容,如果未能解决你的问题,请参考以下文章