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类为各种接口动态生成相应的代理类
Spring 优缺点
它是一个开源的项目,而且目前非常活跃;它基于
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
确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。