Struts和sping的优缺点

Struts

    MVCModel-View-ControllerMVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。Struts MVC的一种实现,它将 Servlet JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。

Struts的工作原理。

    视图:主要由JSP生成页面完成视图,Struts提供丰富的JSP 标签库: HtmlBeanLogicTemplate等,这有利于分开表现逻辑和程序逻辑。

    控制:在Struts中,承担MVCController角色的是一个Servlet,叫ActionServletActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到StrutsHTTP请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean,并传给动作类(通常称之为ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件,后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。

    模型:模型以一个或多个java bean的形式存在。这些bean分为三类:Action FormActionJavaBean or EJBAction Form通常称之为FormBean,封装了来自于Client的用户请求信息,如表单信息。Action通常称之为ActionBean,获取从ActionSevlet传来的FormBean,取出FormBean中的相关信息,并做出相关的处理,一般是调用Java BeanEJB等。

    流程:在Struts中,用户的请求一般以*.do作为请求服务名,所有的*.do请求均被指向ActionSevletActionSevlet根据Struts-config.xml中的配置信息,将用户请求封装成一个指定名称的FormBean,并将此FormBean传至指定名称的ActionBean,由ActionBean完成相应的业务操作,如文件操作,数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称,这些在Struts-config.xml中配置。

    核心:Struts的核心是ActionSevletActionSevlet的核心是Struts-config.xml

优点:

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

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

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

4.    提供Exception处理机制 .

5.    数据库链接池管理

6.    支持I18N

缺点: 

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

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这种事件方式称为applicationeventapplication eventcomponent event相比是一种粗粒度的事件。

Hibernate

    Hibernate使用了J2EE架构中的如下技术:JDBCJTAJNDI。其中JDBC是一个支持关系数据库操作的一个基础层;它与JNDIJTA一起结合,使得Hibernate可以方便地集成到J2EE应用服务器中去。 

核心接口

    以下5个核心接口几乎在任何实际开发中都会用到。通过这些接口,你不仅可以存储和获得持久对象,并且能够进行事务控制。

    Session接口:Session接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统带来不良影响。  

    SessionFactory 接口:这里用到了一个设计模式――工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。令你感到奇怪的是SessionFactory并不是轻量级的!实际上它的设计者的意图是让它能在整个应用中共享。典型地来说,一个项目通常只需要一个SessionFactory就够了,但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory SessionFactoryHibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据,还缓冲了一些将来有可能重复利用的数据。

    Configuration 接口:Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

    QueryCriteria接口:Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。Criteria接口与Query接口非常类似,它允许你创建并执行面向对象的标准化查询。值得注意的是Query接口也是轻量级的,它不能在Session之外使用。 

    Callback 接口:当一些有用的事件发生时――例如持久对象的载入、存储、删除时,Callback接口会通知Hibernate去接收一个通知消息。一般而言,Callback接口在用户程序中并不是必须的,但你要在你的项目中创建审计日志时,你可能会用到它。 

    Hibernate运行在两种环境下:可管理环境和不可管理环境

  •   可管理环境――这种环境可管理如下资源:池资源管理,诸如数据库连接池和,还有事务管理、安全定义。一些典型的J2EE服务器(JBoss、Weblogic、WebSphere)已经实现了这些。   
  •   不可管理环境――只是提供了一些基本的功能,诸如像Jetty或Tomcat这样的servlet容器环境。

优点: 

1.    Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合,例如Java应用程序的数据库访问代码,DAO接口的实现类,甚至可以是BMP里面的访问数据库的代码。

2.    Hibernate是一个和JDBC密切关联的框架,所以Hibernate的兼容性和JDBC驱动,和数据库都有一定的关系,但是和使用它的Java程序,和App Server没有任何关系,也不存在兼容性问题。

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

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

5.    Hibernate的性能非常好,因为它是个轻量级框架(无侵入性)。映射的灵活性很出色。

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

7.    Hibernate当中内置了一级和二级缓存,提升了操作数据库的性能。

8.    Hibernate带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。

缺点:它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表)Hibernate在批量数据处理的时候是有弱势。针对某一对象(单个对象)简单的查\\\增,而不是批量。

Spring

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

优点: 

1.    spring提供了一个管理对象的优秀方案,高层的业务逻辑都没有依赖spring,很有效的组织你的中间层,iocInversion ofControl)依赖注入使我们不用关心如何去创建管理对象。使得程序之间各个部分的耦合性大大的降低。ioc的依赖注入使得我们不用再去写singleton和属性文件,使我们只用关心上层的逻辑代码的开发。

2.    声明式事物的支持,我们不用再去写事物控制的繁琐的代码,而是非常简单的在spring的配置文件中作很少代码的配置即可达到事物控制的效果提高了开发的效率。 

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

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

5.    Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。

6.    Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品,Spring确实使你能通过最简单可行的解决办法来解决你的问题。

7.    spring并不排斥其他框架相反她还能够将一些好的框架整合起来充当粘合剂比如她能够很好的结合struts框架,hibernate框架。 

8.    spring MVC web框架提供了一种清晰,无侵略性的mvc实现模式。

总之,

1.    低侵入式设计,代码污染极低。

2.    独立于各种应用服务器,基于spring架构的应用,可以真正实现Write Once,RunAnywhere的承诺。

3.    SpringDI机制降低了业务对象替换的复杂性,提高组件之间的解耦。

4.    SpringAOP容器允许将一些通用的任务如安全、事务、日志等进行集中式处理,从而提供更好的复用。

5.    SpringORMDAO提供了与第三方持久层框架的良好整合并简化了底层的数据库访问。

6.    Spring的高度开放型,并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值