1、Struts 的原理和优点 .Struts 工作原理MVC 即 Model-View-Controller 的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。MVC 的工作原理,如下图 1 所示:Struts 是 MVC 的一种实现,它将 Servlet 和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts 继承了 MVC 的各项特性,并根据 J2EE 的特点,做了相应的变化与扩展。Struts 的工作原理,视图:主要由 JSP 生成页面完成视图, Struts 提供丰富的 JSP 标签库: Html,Bean,Logic
2、,Template 等,这有利于分开表现逻辑和程序逻辑。控 制:在 Struts 中,承担 MVC 中 Controller 角色的是一个 Servlet,叫ActionServlet。 ActionServlet 是一个 通用的控制组件。这个控制组件提供了处理所有发送到Struts 的 HTTP 请求的入口点。它截取和分发这些请求到相应的动作类(这些动作类都是 Action类的子类)。另外控制组件也负责用相应的请求参数填充 Action From(通常称之为FromBean),并传给动作类(通常称之为 ActionBean)。动作类实现核心商业逻辑,它可以访问java bean 或调用 EJ
3、B。最后动作类把控制权传给后续的 JSP 文件,后者生成视图。所有这些控制逻辑利用 Struts-config.xml 文件来配置。模 型:模型以一个或多个 java bean 的形式存在。这些 bean 分为三类:Action Form、Action 、 JavaBean or EJB。 Action Form 通常称之为 FormBean,封装了来自于Client 的用户请求信息,如表单信息。Action 通常称之为 ActionBean,获取从 ActionSevlet 传来的 FormBean,取出 FormBean 中的相关信息,并做出相关的处理,一般是调用 Java Bean或 E
4、JB 等。流 程:在 Struts 中,用户的请求一般以*.do 作为请求服务名,所有的*.do 请求均被指向ActionSevlet, ActionSevlet 根据 Struts-config.xml 中的配置信息,将用户请求封装成一个指定名称的 FormBean,并将此 FormBean 传至指定名称的 ActionBean,由 ActionBean 完成相应的业务操作,如文件操作,数据库操作等。每一个*.do 均有对应的 FormBean 名称和 ActionBean 名称,这些在 Struts-config.xml 中配置。核心:Struts 的核心是 ActionSevlet,Ac
5、tionSevlet 的核心是 Struts-config.xml。Struts 优缺点优点:1.开源软件,能更深入的了解其内部实现机制。2.Taglib 标记库,灵活动用,能大大提高开发效率。3.页面导航使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。4. 提供 Exception 处理机制 . 5. 数据库链接池管理 6. Struts 的 Action 必需是 threadsafe 方式,它仅仅允许一个实例去处理所有的请求。所以 action 用到的所有的资源都必需统一同
6、步,这个就引起了线程安全的问题。缺点:Taglib 是 Struts 的一大优势,但对于初学者而言,却需要一个持续学习的过程,甚至还会打乱你网页编写的习惯,但是,当你习惯了它时,你会觉得它真的很棒。Struts 将 MVC 的 Controller 一分为三,在获得结构更加清晰的同时,也增加了系统的复杂度。ActionForms 使用不便、无法进行单元测试(StrutsTestCase 只能用于集成)Spring 的原理和优点Spring 真正的精华是它的 Ioc 模式实现的 BeanFactory 和 AOP,它自己在这个基础上延伸的功能有些画蛇添足。Ioc 模式是什么可伸缩性和重/轻量,谁
7、是实用系统的架构主选?Spring它 是一个开源的项目,而且目前非常活跃;它基于 IoC(Inversion of Control,反向控制)和AOP 的构架多层 j2ee 系统的框架,但它不强迫你必须在每一层 中必须使用 Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;它实现了很优雅的 MVC,对不同的数据访问技术提供了统一的 接口,采用 IoC 使得可以很容易的实现 bean 的装配,提供了简洁的AOP 并据此实现 Transcation Managment,等等优点a. Spring 能有效地组织你的中间层对象,不管你是否选择使用了 EJB。如果你仅仅使用了
8、 Struts或其他为 J2EE 的 API 特制的 framework,Spring 致力于解决剩下的问题。 b. Spring 能消除在许多工程中常见的对 Singleton 的过多使用。根据我的经验,这是一个很大的问题,它降低了系统的可测试性和面向对象的程度。 c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring 能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的 属性项或系统属性感到不解,为此不得不去读 Javadoc 甚至源编码?有了 Spring,你仅仅需要看看类的 JavaBean 属性。Inversion of Control 的
9、使用(在下面讨论)帮助完成了这种简化。 d.? 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring 能够促进养成好的编程习惯。e. Spring 被设计为让使用它创建的应用尽可能少的依赖于他的 APIs。在 Spring 应用中的大多数业务对象没有依赖于 Spring。 f. 使用 Spring 构建的应用程序易于单元测试。 g. Spring 能使 EJB 的使用成为一个实现选择, 而不是应用架构的必然选择。你能选择用 POJOs 或local EJBs 来实现业务接口,却不会影响调用代码。 h. Spring 帮助你解决许多问题而无需使用 EJB。Spring 能提供一种 E
10、JB 的替换物,它们适用于许多 web 应用。例如,Spring 能使用 AOP 提供声明性事务管理而不通过 EJB 容器,如果你仅仅需要与单个数据库打交道,甚至不需要一个 JTA 实现。 i. Spring 为数据存取提供了一个一致的框架,不论是使用的是 JDBC 还是 O/R mapping 产品(如Hibernate)。 Spring 确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。缺点:使用人数不多、jsp 中要写很多代码、控制器过于灵活,缺少一个公用控制器Hibernate 的原理和优点。Hibernate 使用了 J2EE 架构中的如下技术: JDBC、JT
11、A 、JNDI 。其中 JDBC 是一个支持关系数据库操作的一个基础层;它与 JNDI 和 JTA 一起结合,使得 Hibernate 可以方便地集成到 J2EE 应用服务器中去。 在这里,我们不会详细地去讨论 Hibernate API 接口中的所有方法,我们只简要讲一下每个主要接口的功能,如果你想了解得更多的话,你可以在 Hibernate 的源码包中的 net.sf.hibernate 子包中去查看这些接口的源代码。下面我们依次讲一下所有的主要接口: 核心接口 以下 5 个核心接口几乎在任何实际开发中都会用到。通过这些接口,你不仅可以存储和获得持久对象,并且能够进行事务控制。 Sessi
12、on 接口 Session 接口对于 Hibernate 开发人员来说是一个最重要的接口。然而在 Hibernate 中,实例化的 Session 是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目 中确实很重要,因为在客户程序中,可能会不断地创建以及销毁 Session 对象,如果Session 的开销太大,会给系统带来不良影响。 SessionFactory 接口 这里用到了一个设计模式工厂模式,用户程序从工厂类SessionFactory 中取得 Session 的实例。 令你感到奇怪的是 SessionFactory 并不是轻量级的!实际上它的设计者的意图是让它能在整个应用
13、中共享。典型地来说,一个项目通常只需要一 个 SessionFactory 就够了,但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个 SessionFactory。 SessionFactory 在 Hibernate 中实际起到了一个缓冲区的作用,它缓冲了Hibernate 自动生成的 SQL 语句和一些其它的映射数 据,还缓冲了一些将来有可能重复利用的数据。 Configuration 接口 Configuration 接口的作用是对 Hibernate 进行配置,以及对它进行启动。在 Hibernate 的启动过程 中, Configuration 类的实例首先定位映射文档
14、的位置,读取这些配置,然后创建一个 SessionFactory 对象。 Query 和 Criteria 接口 Query 接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL 语言或本地数据库的 SQL 语句。Query 经常被用来绑定查询参 数、限制查询记录数量,并最终执行查询操作。 Criteria 接口与 Query 接口非常类似,它允许你创建并执行面向对象的标准化查询。 值得注意的是 Query 接口也是轻量级的,它不能在 Session 之外使用。 Callback 接口 当一些有用的事件发生时例如持久对象的载入、存储、删除时,Callback 接口会通知 Hi
15、bernate 去接收一个通知消息。一般而 言,Callback 接口在用户程序中并不是必须的,但你要在你的项目中创建审计日志时,你可能会用到它。以下是它的策略接口: 主键的生成 (IdentifierGenerator 接口) 本地 SQL 语言支持 (Dialect 抽象类) 缓冲机制 (Cache 和 CacheProvider 接口) JDBC 连接管理 (ConnectionProvider 接口) .事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口) ORM 策略 (ClassPersister
16、 接口) 属性访问策略 (PropertyAccessor 接口) 代理对象的创建 (ProxyFactory 接口) Hibernate 为以上所列的机制分别创建了一个缺省的实现,因此如果你只是要增强它的某个策略的功能的话,只需简单地继承这个类就可以了,没有必要从头开始写代码。Hibernate 运行在两种环境下:可管理环境和不可管理环境 可管理环境这种环境可管理如下资源:池资源管理,诸如数据库连接池和,还有事务管理、安全定义。一些典型的 J2EE 服务器(JBoss、Weblogic、WebSphere)已经实现了这些。 不可管理环境只是提供了一些基本的功能,诸如像 Jetty 或 Tom
17、cat 这样的 servlet 容器环境。优点:Hibernate 是 JDBC 的轻量级的对象封装,它是一个独立的对象持久层框架。 Hibernate 可以用在任何 JDBC 可以使用的场合,例如 Java 应用程序的数据库访问代码,DAO 接口的实现类,甚至可以是 BMP 里面的访问数据库的代码。Hibernate 是一个和 JDBC 密切关联的框架,所以 Hibernate 的兼容性和 JDBC 驱动,和数据库都有一定的关系,但是和使用它的 Java 程序,和 App Server 没有任何关系,也不存在兼容性问题。Hibernate 不能用来直接和 Entity Bean 做对比,只有
18、放在整个 J2EE 项目的框架中才能比较。并且即使是放在软件整体框架中来看,Hibernate 也是做为 JDBC 的替代者出现的,而不是Entity Bean 的替代者出现的,Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 可以应用在任何使用 JDBC 的场合。Hibernate 使用 Java 反射机制 而不是字节码增强程序来实现透明性。Hibernate 的性能非常好,因为它是个轻量级框架。 映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的
19、各种复杂关系。 缺点:它限制您所使用的对象模型。(例如,一个持久性类不能映射到多个表)。让我再列一次我已经列 n 次的框架结构:传统的架构:1) Session Bean Entity Bean DB为了解决性能障碍的替代架构:2) Session Bean DAO JDBC DB使用 Hibernate 来提高上面架构的开发效率的架构:3) Session Bean DAO Hibernate DB就上面 3 个架构来分析:1、内存消耗:采用 JDBC 的架构 2 无疑是最省内存的,Hibernate 的架构次之,EB 的架构 1 最差。2、 运行效率:如果 JDBC 的代码写的非常优化,那
20、么 JDBC 架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通 JDBC,运用 Batch 语句,调整 PreapredStatement的 Batch Size 和 Fetch Size 等参数,以及在必要的情况下采用结果集 cache 等等。而一般情况下程序员是做不到这一点的。因此 Hibernate 架构表现出最快的运行效率。 EB 的架构效率会差的很远。3、开发效率:在有 JBuilder 的支持下以及简单的项目,EB 架构开发效率最高,JDBC 次之,Hibernate 最差。但是在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate 效率高的惊人,JDBC 次之,而 EB 架构很可能会失败。