<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/struts-spring-hibernate-ssh-theory-html/</link>
<title><![CDATA[详解SSH框架的原理和优点， Struts+spring+Hibernate 三个框架各自原理和优缺点]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[学习心得]]></category>
<pubDate>Fri, 29 Oct 2010 06:34:55 +0000</pubDate> 
<guid>https://www.heckjj.com/struts-spring-hibernate-ssh-theory-html/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;<span style="font-family: 微软雅黑;">很多朋友对Struts、Spring、Hibernate都只停留在会用的层次，并不知道SSH三个框架的具体实现和原理以及怎么样才能用好这三个框架，猪头曾经看到多滥用Struts、Sping、Hibernate的项目，那个做的真是没话说呀，这篇日志也就给大家介绍下它们的原理，避免大家滥用框架造成系统出现一系列的问题。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts的原理和优点.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Struts工作原理<br/>&nbsp;&nbsp;MVC即Model-View-Controller的缩写，是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合，以及让视图层更富于变化。MVC的工作原理,如下图1所示：Struts 是MVC的一种实现，它将 Servlet和 JSP 标记（属于 J2EE 规范）用作实现的一部分。Struts继承了MVC的各项特性，并根据J2EE的特点，做了相应的变化与扩展。Struts的工作原理。<br/>&nbsp;&nbsp;视图：主要由JSP生成页面完成视图，Struts提供丰富的JSP 标签库： Html，Bean，Logic，Template等，这有利于分开表现逻辑和程序逻辑。<br/><br/>&nbsp;&nbsp;控制：在Struts中，承担MVC中Controller角色的是一个Servlet，叫ActionServlet。ActionServlet是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点。它截取和分发这些请求到相应的动作类（这些动作类都是Action类的子类）。另外控制组件也负责用相应的请求参数填充 Action From（通常称之为FromBean）,并传给动作类（通常称之为ActionBean）。动作类实现核心商业逻辑，它可以访问java bean 或调用EJB。最后动作类把控制权传给后续的JSP 文件，后者生成视图。所有这些控制逻辑利用Struts-config.xml文件来配置。<br/><br/>&nbsp;&nbsp;模型：模型以一个或多个java bean的形式存在。这些bean分为三类：Action Form、Action、JavaBean or EJB。Action Form通常称之为FormBean，封装了来自于Client的用户请求信息，如表单信息。Action通常称之为ActionBean，获取从ActionSevlet传来的FormBean，取出FormBean中的相关信息，并做出相关的处理，一般是调用Java Bean或EJB等。<br/><br/>&nbsp;&nbsp;流程：在Struts中，用户的请求一般以*.do作为请求服务名，所有的*.do请求均被指向ActionSevlet，ActionSevlet根据Struts-config.xml中的配置信息，将用户请求封装成一个指定名称的FormBean，并将此FormBean传至指定名称的ActionBean，由ActionBean完成相应的业务操作，如文件操作，数据库操作等。每一个*.do均有对应的FormBean名称和ActionBean名称，这些在Struts-config.xml中配置。<br/><br/>&nbsp;&nbsp;核心：Struts的核心是ActionSevlet，ActionSevlet的核心是Struts-config.xml。</span><span style="font-family: 微软雅黑;"><br/><br/>&nbsp;&nbsp;Struts优缺点<br/>&nbsp;&nbsp;优点：<br/>&nbsp;&nbsp;1.开源软件，能更深入的了解其内部实现机制。<br/>&nbsp;&nbsp;2.Taglib标记库，灵活动用，能大大提高开发效率。<br/>&nbsp;&nbsp;3.页面导航使系统的脉络更加清晰。通过一个配置文件，即可把握整个系统各部分之间的联系，这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时，这种优势体现得更加明显。<br/>&nbsp;&nbsp;4. 提供Exception处理机制 .<br/>  5. 数据库链接池管理 <br/>&nbsp;&nbsp;6. Struts 的Action必需是thread－safe方式，它仅仅允许一个实例去处理所有的请求。所以action用到的所有的资源都必需统一同步，这个就引起了线程安全的问题。缺点：Taglib是Struts的一大优势，但对于初学者而言，却需要一个持续学习的过程，甚至还会打乱你网页编写的习惯，但是，当你习惯了它时，你会觉得它真的很棒。Struts将MVC的Controller一分为三，在获得结构更加清晰的同时，也增加了系统的复杂度。ActionForms使用不便、无法进行单元测试（StrutsTestCase只能用于集成）<br/><br/>&nbsp;&nbsp;Spring的原理和优点<br/>&nbsp;&nbsp;Spring真正的精华是它的Ioc模式实现的BeanFactory和AOP，它自己在这个基础上延伸的功能有些画蛇添足。<br/><br/>&nbsp;&nbsp;Ioc模式是什么<br/>&nbsp;&nbsp;可伸缩性和重/轻量，谁是实用系统的架构主选？<br/>&nbsp;&nbsp;Spring它是一个开源的项目，而且目前非常活跃；它基于IoC（Inversion of Control，反向控制）和AOP的构架多层j2ee系统的框架，但它不强迫你必须在每一层 中必须使用Spring，因为它模块化的很好，允许你根据自己的需要选择使用它的某一个模块；它实现了很优雅的MVC，对不同的数据访问技术提供了统一的 接口，采用IoC使得可以很容易的实现bean的装配，提供了简洁的AOP并据此实现Transcation Managment，等等<br/><br/>&nbsp;&nbsp;优点 <br/>a. Spring能有效地组织你的中间层对象，不管你是否选择使用了EJB。如果你仅仅使用了Struts或其他为J2EE的 API特制的framework，Spring致力于解决剩下的问题。<br/><br/>b. Spring能消除在许多工程中常见的对Singleton的过多使用。根据我的经验，这是一个很大的问题，它降低了系统的可测试性和面向对象的程度。 <br/><br/>c. 通过一种在不同应用程序和项目间一致的方法来处理配置文件，Spring能消除各种各样自定义格式的属性文件的需要。曾经对某个类要寻找的是哪个魔法般的属性项或系统属性感到不解，为此不得不去读Javadoc甚至源编码？有了Spring，你仅仅需要看看类的JavaBean属性。Inversion of Control的使用（在下面讨论）帮助完成了这种简化。<br/><br/>d.? 通过把对接口编程而不是对类编程的代价几乎减少到没有，Spring能够促进养成好的编程习惯。 <br/><br/>e. Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。 <br/><br/>f. 使用Spring构建的应用程序易于单元测试。<br/><br/>g. Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口，却不会影响调用代码。 h. Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物，它们适用于许多web应用。例如，Spring能使用AOP提供声明性事务管理而不通过EJB容器，如果你仅仅需要与单个数据库打交道，甚至不需要一个JTA实现。 i. Spring为数据存取提供了一个一致的框架,不论是使用的是JDBC还是O/R mapping产品（如Hibernate）。 Spring确实使你能通过最简单可行的解决办法来解决你的问题。而这是有有很大价值的。缺点：使用人数不多、jsp中要写很多代码、控制器过于灵活，缺少一个公用控制器。<br/><br/>&nbsp;&nbsp;Hibernate的原理和优点。<br/>&nbsp;&nbsp;　Hibernate使用了J2EE架构中的如下技术：JDBC、JTA、JNDI。其中JDBC是一个支持关系数据库操作的一个基础层；它与JNDI和JTA一起结合，使得Hibernate可以方便地集成到J2EE应用服务器中去。 　　在这里，我们不会详细地去讨论Hibernate API接口中的所有方法，我们只简要讲一下每个主要接口的功能，如果你想了解得更多的话，你可以在Hibernate的源码包中的net.sf.hibernate子包中去查看这些接口的源代码。<br/>下面我们依次讲一下所有的主要接口： 　　<br/>&nbsp;&nbsp;核心接口 　　<br/>&nbsp;&nbsp;以下5个核心接口几乎在任何实际开发中都会用到。通过这些接口，你不仅可以存储和获得持久对象，并且能够进行事务控制。 　<br/>　<br/>&nbsp;&nbsp;Session接口 　　Session接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中，实例化的Session是一个轻量级的类，创建和销毁它都不会占用很多资源。这在实际项目中确实很重要，因为在客户程序中，可能会不断地创建以及销毁Session对象，如果Session的开销太大，会给系统带来不良影响。　　<br/><br/>&nbsp;&nbsp;SessionFactory 接口 　这里用到了一个设计模式――工厂模式，用户程序从工厂类SessionFactory中取得Session的实例。 　　令你感到奇怪的是SessionFactory并不是轻量级的！实际上它的设计者的意图是让它能在整个应用中共享。典型地来说，一个项目通常只需要一个SessionFactory就够了，但是当你的项目要操作多个数据库时，那你必须为每个数据库指定一个SessionFactory。 SessionFactory在Hibernate中实际起到了一个缓冲区的作用，它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据，还缓冲了一些将来有可能重复利用的数据。 　　<br/><br/>&nbsp;&nbsp;Configuration 接口 　Configuration接口的作用是对Hibernate进行配置，以及对它进行启动。在Hibernate的启动过程中，Configuration类的实例首先定位映射文档的位置，读取这些配置，然后创建一个SessionFactory对象。 　　<br/>　　<br/>&nbsp;&nbsp;Query和Criteria接口&nbsp;&nbsp;Query接口让你方便地对数据库及持久对象进行查询，它可以有两种表达方式：HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量，并最终执行查询操作。 　　Criteria接口与Query接口非常类似，它允许你创建并执行面向对象的标准化查询。 值得注意的是Query接口也是轻量级的，它不能在Session之外使用。<br/> 　　<br/>&nbsp;&nbsp;Callback 接口 当一些有用的事件发生时――例如持久对象的载入、存储、删除时，Callback接口会通知Hibernate去接收一个通知消息。一般而言，Callback接口在用户程序中并不是必须的，但你要在你的项目中创建审计日志时，你可能会用到它。以下是它的策略接口：<br/>&nbsp;&nbsp;· 主键的生成 (IdentifierGenerator 接口) 　　<br/>&nbsp;&nbsp;· 本地SQL语言支持 (Dialect 抽象类) 　　<br/>&nbsp;&nbsp;· 缓冲机制 (Cache 和CacheProvider 接口) 　　<br/>&nbsp;&nbsp;· JDBC 连接管理 (ConnectionProvider接口) 　　<br/>&nbsp;&nbsp;.事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口) 　　<br/>&nbsp;&nbsp;· ORM 策略 (ClassPersister 接口) 　　<br/>&nbsp;&nbsp;· 属性访问策略 (PropertyAccessor 接口) 　　<br/>&nbsp;&nbsp;· 代理对象的创建 (ProxyFactory接口) 　　<br/><br/>&nbsp;&nbsp;Hibernate为以上所列的机制分别创建了一个缺省的实现，因此如果你只是要增强它的某个策略的功能的话，只需简单地继承这个类就可以了，没有必要从头开始写代码。<br/>&nbsp;&nbsp;Hibernate运行在两种环境下：可管理环境和不可管理环境 　　<br/>&nbsp;&nbsp;· 可管理环境――这种环境可管理如下资源：池资源管理，诸如数据库连接池和，还有事务管理、安全定义。一些典型的J2EE服务器（JBoss、Weblogic、WebSphere）已经实现了这些。 　　<br/>&nbsp;&nbsp;· 不可管理环境――只是提供了一些基本的功能，诸如像Jetty或Tomcat这样的servlet容器环境。<br/><br/>&nbsp;&nbsp;优点：<br/>&nbsp;&nbsp;Hibernate是JDBC的轻量级的对象封装，它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合，例如Java应用程序的数据库访问代码，DAO接口的实现类，甚至可以是BMP里面的访问数据库的代码。<br/>&nbsp;&nbsp;Hibernate是一个和JDBC密切关联的框架，所以Hibernate的兼容性和JDBC驱动，和数据库都有一定的关系，但是和使用它的Java程序，和App Server没有任何关系，也不存在兼容性问题。<br/>&nbsp;&nbsp;Hibernate不能用来直接和Entity Bean做对比，只有放在整个J2EE项目的框架中才能比较。并且即使是放在软件整体框架中来看，Hibernate也是做为JDBC的替代者出现的，而不是Entity Bean的替代者出现的，<br/>&nbsp;&nbsp;Hibernate是一个开放源代码的对象关系映射框架，它对JDBC进行了非常轻量级的对象封装，使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。<br/>&nbsp;&nbsp;Hibernate可以应用在任何使用JDBC的场合。<br/>&nbsp;&nbsp;Hibernate 使用 Java 反射机制 而不是字节码增强程序来实现透明性。<br/>&nbsp;&nbsp;Hibernate 的性能非常好，因为它是个轻量级框架。 映射的灵活性很出色。<br/>&nbsp;&nbsp;它支持各种关系数据库，从一对一到多对多的各种复杂关系。 缺点：它限制您所使用的对象模型。(例如，一个持久性类不能映射到多个表)。<br/>&nbsp;&nbsp;让我再列一次我已经列n次的框架结构：<br/>&nbsp;&nbsp;传统的架构：1) Session Bean &lt;-&gt; Entity Bean &lt;-&gt; DB<br/>&nbsp;&nbsp;为了解决性能障碍的替代架构：2) Session Bean &lt;-&gt; DAO &lt;-&gt; JDBC &lt;-&gt; DB<br/>&nbsp;&nbsp;使用Hibernate来提高上面架构的开发效率的架构：3) Session Bean &lt;-&gt; DAO &lt;-&gt; Hibernate &lt;-&gt; DB <br/>&nbsp;&nbsp;就上面3个架构来分析：<br/>1、内存消耗：采用JDBC的架构2无疑是最省内存的，Hibernate的架构次之，EB的架构1最差。<br/><br/>2、运行效率：如果JDBC的代码写的非常优化，那么JDBC架构运行效率最高，但是实际项目中，这一点几乎做不到，这需要程序员非常精通JDBC，运用Batch语句，调整PreapredStatement的Batch Size和Fetch Size等参数，以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。EB的架构效率会差的很远。<br/><br/>3、开发效率：在有JBuilder的支持下以及简单的项目，EB架构开发效率最高，JDBC次之，Hibernate最差。但是在大的项目，特别是持久层关系映射很复杂的情况下，Hibernate效率高的惊人，JDBC次之，而EB架构很可能会失败。</span><br/>Tags - <a href="https://www.heckjj.com/tags/ssh%25E6%25A1%2586%25E6%259E%25B6/" rel="tag">ssh框架</a> , <a href="https://www.heckjj.com/tags/%25E5%258E%259F%25E7%2590%2586/" rel="tag">原理</a> , <a href="https://www.heckjj.com/tags/%25E4%25BC%2598%25E7%2582%25B9/" rel="tag">优点</a> , <a href="https://www.heckjj.com/tags/struts/" rel="tag">struts</a> , <a href="https://www.heckjj.com/tags/spring/" rel="tag">spring</a> , <a href="https://www.heckjj.com/tags/hibernate/" rel="tag">hibernate</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/struts-spring-hibernate-ssh-theory-html/#blogcomment</link>
<title><![CDATA[[评论] 详解SSH框架的原理和优点， Struts+spring+Hibernate 三个框架各自原理和优缺点]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/struts-spring-hibernate-ssh-theory-html/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>