来自:http://www.67tgb.com/?p=375
Struts
Struts属于MVC框架,主要提供了Control层的解决方案。在struts中,主要了解struts工作流程,如下图所示
这个工作流程非常类似我们去邮局寄信这一活动
简单来说客户端发过来的请求,也就是信件。会首先到达Struts的核心的ActionServlet,这个Servlet就像邮局一样,分析信件地址(URL),根据这个地址去自己的通讯录(Struts-config.xml)中找到某个辖区的邮递员(Action)后,将信件分发(Dispatch)给邮递员Action,Action会将信件送达后(Model层处理完之后),将成功或者失败的信息告知邮局ActionServlet,邮局会根据相应的信息forward到不同回执信息通知客户。
可以说struts的核心就是提供了一个功能完善的邮局系统,我们要做的主要工作就是:
1. 配置好struts-config.xml ,让邮局ActionServlet知道有哪些邮递员Action在工作,能够处理那些Url请求 。这些请求处理完成后,应该forward到哪一个页面
2. 编写Action ,就好像你需要雇佣邮递员来完成信件的处理,调用不同的Model来完成业务
3. 编写ActionForm ,这个就是信纸了,用来承载客户输入的信息。
在这里我们很容易看出Struts解决了一个很重的问题那就是请求的统一调度
Hibernate
Hibernate相对struts就复杂了一些,他完成的主要功能是完成ORM(Object/Relationship Mapping) 对象关系映射功能。
啥是ORM呢,我们都知道目前的软件开发大都是采用面向对象的开发方式,采用关系数据库来存储数据。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中, 关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统出现啦,它一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
Hibernate解决了什么问题呢,简单的说,让我们通过操纵业务实体对象,完成对数据库记录的增删改查。
没有ORM这个概念之前,我们的DAL层都是这样处理的:将业务实体对象中的数据一项一项,像剥衣服一样取出来,这个过程叫拆箱。然后拼装成SQL语句,交给ODBC或者JDBC去执行。
现在呢,这个拆箱过程不用我们来做了,SQL语句也不用我们来拼写了,Hibernate保证给它一个活蹦乱跳(transient状态)的对象,还你一条静悄儿悄(Persistent状态)的数据库记录,只需专注业务的开发即可。附图
图 Hibernate中对象的三种状态
更为神奇的是,Hibernate居然会说方言,无论是Mysql,Oracle,还是DB2 都能很好的交流。
Hibernate最大的特性就是通过大量的配置,提高了灵活性。但是凡事有利必有弊,太灵活了会让人无所适从。
光是主键生成策略就有七八种方案有木有;
集合属性可以用List,可以用Set,还可以用Bag 有木有;
复合主键可以在hbm文件里配置,也可以自定义CustomerType有木有啊;
一个继承关系可以生成一张表,也可以生成两张表,还可以生成三张表,你不怕超生啊!
什么情况下那种方案最好,效率最高,有何区别,不用费脑细胞想想啊
尼玛头发都快掉没了有木有……
面对xml文档的过度泛滥,人们不得不提出了“约定优于配置”的建议,也就是使用规则,让Hibernate的可以通过模糊匹配读取配置文件,来减少配置量,当然还有其他减少配置的方法。
Hibernate核心在于配置,需要多加实践,积累项目经验,才能快速确定最优配置。上面的问题其实都有答案的……
Spring
Spring是春天的意思,万物复苏,该框架的命名也是源于此意(个人YY哈),主要负责对象的创建,声明式服务管理。
Spring的两大特性:IOC (Inversion of Control)控制反转和 AOP(Aspect oriented programming)面向切面编程
1. IOC
所谓控制反转是介个意思:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。
简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,就是所谓的反转。
反转的好处在哪里呢?解耦 !还记得我们用工厂来封装对象的创建吗,原理是一样的,Spring的核心其实就是工厂,将对象创建完成后,通过类的构造函数或者setter()注入给你。
2. AOP
面向切面的编程可以说是OO编程的补充,在编码过程中,人们逐渐发现一些共性的服务可以抽取出来,比如日志记录,安全控制等等,这些方法遍布程序的各个角落,与业务逻辑代码并没有关系,Don’t Repeat Yourself ,于是提出了一种切面式的编程方法。将这些行为分离。如图
GOF中有一种设计模式是代理模式,代理模式可以为其他对象提供一种代理以控制对这个对象的访问。而AOP的实现则是使用了类似的思路。
主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。
下面这张图总结了SSH框架在J2EE三层架构中的分布情况,接下来我们将会通过一个项目来实践一下SSH框架的应用。
总结:
SSH属于框架,属于工具,使用它们来提高开发效率,提高软件产品的可维护性、可扩展性乃至敏捷性。好吧,这句万金油的话,或许用到任何技术上都能成立,但是只有你亲自实践过才能有深刻的体会。SSH里面有很多优秀的设计理念及模式应用,这才是要学习的核心。不久的一天你要能够自己开发框架……