一、Struts在项目中的作用

a) Struts 在项目主要起控制作用,只要用于web层(即视图层和控制层)

b) Struts本身是使用典型的MVC结构实现的,项目中使用了struts之后就等于项目也是一个MVC结构,使项目结构更清晰,分工更明细。

c) Struts在项目中主要负责视图层、控制层,在视图层提供了大量的标签库,提高视图层的开发速度。在控制层使用中央控制器(Actionsupport)和配置文件(struts.xml),实现拦截用户请求、封装请求参数及页面导航。

d) 优点:

1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现

    2. 有丰富的tag可以用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。 

    3. 页面导航.页面导航将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。

    4. 提供Exception处理机制 

    5. 数据库链接池管理 

    6. 支持I18N

e) 缺点

1、 转到展示层时,需要配置forward,每一次转到展示层,相信大多数都是直接转到jsp,而涉及到转向,需要配置forward,如果有十个展示层的jsp,需要配置十次struts,而且还不包括有时候目录、文件变更,需要重新修改forward,注意,每次修改配置之后,要求重新部署整个项目,而tomcate这样的服务器,还必须重新启动服务器,如果业务变更复杂频繁的系统,这样的操作简单不可想象。现在就是这样,几十上百个人同时在线使用我们的系统,大家可以想象一下,我的烦恼有多大。 

    2、 Struts Action必需是threadsafe方式,它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步,这个就引起了线程安全的问题。 

    3、 测试不方便. Struts的每个Action都同Web层耦合在一起,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase可以实现它的单元测试。 

    4、 类型的转换. StrutsFormBean把所有的数据都作为String类型,它可以使用工具Commons-Beanutils进行类型转化。但它的转化都

是在Class级别,而且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是非常困难的。 

    5、 对Servlet的依赖性过强. Struts处理Action时必需要依赖ServletRequest ServletResponse,所有它摆脱不了Servlet容器。 

    6、 前端表达式语言方面.Struts集成了JSTL,所以它主要使用JSTL的表达式语言来获取数据。可是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。 

    7、 对Action执行的控制困难. Struts创建一个Action,如果想控制它的执行顺序将会非常困难。甚至你要重新去写Servlet来实现你的这个功能需求。 

    8、 对Action 执行前和后的处理. Struts处理Action的时候是基于classhierarchies,很难在action处理前和后进行操作。 

    9、 对事件支持不够struts中,实际是一个表单Form对应一个Action(DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application eventapplication eventcomponent event相比是一种粗粒度的事件。

二、Spring在项目中的作用

a) Spring是一个全方位的整合框架,在项目中对hibernatestruts进行整合,解决层与层之间的耦合问题。

b) Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合

c) SpringIoC来实现组件之间的依赖关系注入,上层框架不会***到下层组件,提高组件移植性和重用性,使得程序更灵活,上层框架不依赖实现而是依赖于抽象(委托接口)、使得实现类的变化不会影响上层组件,解决了层与层之间的藕合带来的维护或升级困难

d) SpringAOP 是面向面编程,实现事务处理、日志服务等与业务无关的系统服务,实现插件式编程。

e) 优点

它是一个开源的项目,而且目前非常活跃;它基于IoCInversion of Control,控制反)和AOP(面向切面)的构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的MVC,对不同的数据访问技术提供了统一的接口,采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现Transcation Managment,等等

   a. Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的frameworkSpring致力于解决剩下的问题。

   b. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。

   c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解,为此不得不去读Javadoc甚至源编码?有了Spring,你仅仅需要看看类的JavaBean属性。Inversion of Control的使用(在下面讨论)帮助完成了这种简化。

d. 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。

e. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring

f. 使用Spring构建的应用程序易于单元测试。

g. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOslocal EJBs来实现业务接口,却不会影响调用代码。

h. Spring帮助你解决许多问题而无需使用EJBSpring能提供一种EJB的替换物,它们适用于许多web应用。例如,Spring能使用AOP提供声明性事务管理而不通过EJB容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个JTA实现。

i. Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品

Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。

 

f) 缺点

 

jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器

 

三、Hibernate在项目中的作用

a) Hibernate应用于数据持久化层,是对JDBC的轻量级封装。是一种对象、关系的映射工具, 提供了从 Java类到数据表的映射,也提供了数据查询和恢复等机制, 大大减少数据访问的复杂度。把对数据库的直接操作 转换为对持久对象的操作。

b) 在项目中的主要作用就是1、解决程序与数据库的依赖,即使用了Hibernate之后,以后更改数据库不需要更改代码,因为Hibernate会根据数据库方言来生成对应的SQL语句;2、是对JDBC的轻量级封装,简化持久层的代码,提高开发速度。

c) 优点

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSPWeb应用中使用,最具革命意义的是,Hibernate可以在应用EJBJ2EE架构中取代CMP,完成数据持久化的重任。

大多数开发机构经常采取创建各自独立的数据持久层。一旦底层的数据结构发生改变,那么修改应用的其余部分使之适应这种改变的代价将是十分巨大的。Hibernate适时的填补了这一空白,它为Java应用提供了一个易用的、高效率的对象关系映射框架。hibernate是个轻量级的持久性框架,功能却非常丰富。

1. Hibernate 使用 Java 反射机制而不是字节码增强程序来实现透明性。

2. Hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。

3它支持各种关系数据库,从一对一到多对多的各种复杂关系

d) 缺点

1、由于Hibernate实现了复杂的关系映射,并且进行大量的封装,所以对于复杂的查询语句不是很灵活。

2、它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表),尽管如此,Hibernate 还是以其强大的发展动力减轻了这些风险。其他的开源持久性框架也有一些,不过都没有 Hibernate 这样有市场冲击力。

 

SSH的优点和缺点

优点: ssh把数据库,实体,配置都整合,封装 

层次的结构(偏于mvc模式) 

而且框架的融合,代码的耦合都很不错 

对于编程的持续化,扩展化,维护化都很棒 ,SSH已经把底层实现封装好了,开发人员可以更专注于业务处理, 

缺点:  出现错误容易搞的复杂 

如果某个框架不是很熟悉的话(特别是spring)那就很麻烦 

运行速度比较慢