﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-记忆好很大程度决定能力!-文章分类-WEB开发</title><link>http://www.blogjava.net/microlab4321/category/24884.html</link><description>适时总结是一种很好的彌补方法!</description><language>zh-cn</language><lastBuildDate>Sat, 29 Sep 2007 16:56:09 GMT</lastBuildDate><pubDate>Sat, 29 Sep 2007 16:56:09 GMT</pubDate><ttl>60</ttl><item><title>(转)使用struts+spring+hibernate 组装web应用 </title><link>http://www.blogjava.net/microlab4321/articles/149561.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Sat, 29 Sep 2007 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/149561.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/149561.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/149561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/149561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/149561.html</trackback:ping><description><![CDATA[<font class="htd" id="font_word" style="font-size: 14px"  font-family:宋体, Verdana, Arial, Helvetica, sans-serif;>src=http://pagead2.googlesyndication.com/pagead/show_ads.js&gt;</script>
<span class="postbody">其实，就算用Java建造一个不是很烦琐的web应用，也不是件轻松的事情。 在构架的一开始就有很多事情要考虑。 从高处看，摆在开发者面前有很多问题：要考虑是怎样建立用户接口？在哪里处理业务逻辑？ 怎样持久化的数据。 而这三层构架中，每一层都有他们要仔细考虑的。 各个层该使用什么技术？ 怎样的设计能松散耦合还能灵活改变？ 怎样替换某个层而不影响整体构架？应用程序如何做各种级别的业务处理（比如事务处理）？ <br />
<br />
<br />
<br />
构架一个Web应用需要弄明白好多问题。 幸运的是，已经有不少开发者已经遇到过这类问题，并且建立了处理这类问题的框架。 一个好框架具备以下几点： 减轻开发者处理复杂的问题的负担（&#8220;不重复发明轮子&#8221;）； 内部有良好的扩展； 并且有一个支持它的强大的用户团体。 好的构架一般有针对性的处理某一类问题，并且能将它做好（Do One Thing well）。 然而，你的程序中有几个层可能需要使用特定的框架，已经完成的UI(用户接口) 并不代表你也可以把你的业务逻辑和持久逻辑偶合到你的UI部分。 举个例子， 你不该在一个Controller(控制器)里面写JDBC代码作为你的业务逻辑， 这不是控制器应该提供的。 一个UI 控制器应该委派给其它给在UI范围之外的轻量级组件。 好的框架应该能指导代码如何分布。 更重要的是，框架能把开发者从编码中解放出来，使他们能专心于应用程序的逻辑（这对客户来说很重要）。 <br />
<br />
<br />
<br />
这篇文章将讨论怎样结合几种著名的框架来使得你的应用程序做到松弛耦合。 <br />
<br />
如何建立你的架构，并且怎样让你的各个应用层保持一致。？如何整合框架以便让每个层在以一种松散偶合的方式彼此作用而不用管低层的技术细节？这对我们来说真是一种挑战。 这里讨论一个整合框架的策略( 使用3 种受欢迎的开源框架) ：表示层我们用Struts； 业务层我们用Spring；而持久层则用Hibernate。 你也可以用其他FrameWork替换只要能得到同样的效果。 见图1 （框架组合示意图） <br />
<br />
<img src="http://www.onjava.com/onjava/2004/04/07/graphics/wiring.gif" border="0"  alt="" /> <br />
<br />
<span style="font-weight: bold">应用程序的分层</span> <br />
<br />
大部分的Web应用在职责上至少能被分成4层。 这四层是：presentation（描述），persistence（持久），business（业务）和domain model（域模块）。每个层在处理程序上都应该有一项明确的责任, 而不应该在功能上与其它层混合，并且每个层要与其它层分开的，但要给他们之间放一个通信接口。 我们就从介绍各个层开始，讨论一下这些层应该提供什么，不应该提供什么。 <br />
<br />
<br />
<br />
<span style="font-weight: bold">表示层(The Presentation Layer) </span><br />
<br />
一般来讲，一个典型的Web应用的的末端应该是表示层。 很多Java发者也理解Struts所提供的。 象业务逻辑之类的被打包到org.apache.struts.Action.， 因此，我们很赞成使用Struts这样的框架。 <br />
<br />
<br />
<br />
下面是Struts所负责的： <br />
<br />
* 管理用户的请求,做出相应的响应。 <br />
<br />
* 提供一个Controller ,委派调用业务逻辑和其它上层处理。 <br />
<br />
* 处理异常，抛给Struts Action <br />
<br />
* 为显示提供一个模型 <br />
<br />
* UI验证。 <br />
<br />
<br />
<br />
以下条款，不该在Struts显示层的编码中经常出现。 它们与显示层无关的。 <br />
<br />
* 直接的与数据库通信，例如JDBC调用。 <br />
<br />
* 与你应用程序相关联的业务逻辑以及校验。 <br />
<br />
* 事物管理。 <br />
<br />
在表示层引入这些代码，则会带来高偶合和麻烦的维护。 <br />
<br />
<br />
<br />
<br />
<br />
<span style="font-weight: bold">持久层(The Persistence Layer)</span> <br />
<br />
典型的Web应用的另一个末端是持久层。这里通常是程序最容易失控的地方。开发者总是低估构建他们自己的持久框架的挑战性。系统内部的持续层不但需要大量调试时间，而且还经常缺少功能使之变得难以控制，这是持久层的通病。 还好有几个ORM开源框架很好的解决了这类问题。尤其是Hibernate。 Hibernate为java提供了OR持久化机制和查询服务, 它还给已经熟悉SQL和JDBC API 的Java开发者一个学习桥梁，他们学习起来很方便。 Hibernate的持久对象是基于POJO和Java collections。此外，使用Hibernate并不妨碍你正在使用的IDE。 <br />
<br />
<br />
<br />
请看下面的条目，你在持久层编码中需要了解的。 <br />
<br />
* 查询对象的相关信息的语句。 Hibernate通过一个OO查询语言（HQL）或者正则表达的API来完成查询。 HQL非常类似于SQL-- 只是把SQL里的table和columns用Object和它的fields代替。 你需要学习一些新的HQL语言； 不管怎样，他们容易理解而文档也做的很好。 HQL是一种对象查询的自然语言，花很小的代价就能学习它。 <br />
<br />
* 如何存储，更新，删除数据库记录。 <br />
<br />
* 象Hibernate这类的高级ORM框架支持大部分主流数据库，并且他们支持 Parent/child关系，事物处理，继承和多态。 <br />
<br />
<br />
<br />
<span style="font-weight: bold">业务层（The Business Layer）</span> <br />
<br />
一个典型Web应用的中间部分是业务层或者服务层。 从编码的视角来看，这层是最容易被忽视的一层。 而我们却往往在UI层或持久层周围看到这些业务处理的代码，这其实是不正确的，因为它导致了程序代码的紧密偶合，这样一来，随着时间推移这些代码很难维护。幸好，针对这一问题有好几种Frameworks存在。 最受欢迎的两个框架是Spring和PicoContainer。 这些为也被称为microcontainers，他们能让你很好的把对象搭配起来。 这两个框架都着手于&#8216;依赖注射&#8217;(dependency injection)(还有我们知道的&#8216;控制反转&#8217;Inversion of Control=IoC)这样的简单概念。 这篇文章将关注于Spring的注射（译注：通过一个给定参数的Setter方法来构造Bean,有所不同于Factory）, Spring还提供了Setter Injection(type2)，Constructor Injection(type3)等方式供我们选择。 Spring把程序中所涉及到包含业务逻辑和Dao的Objects——例如transaction management handler（事物管理控制）、Object Factoris(对象工厂)、service objects（服务组件）——都通过XML来配置联系起来。 <br />
<br />
<br />
<br />
后面我们会举个例子来揭示一下Spring 是怎样运用这些概念。 <br />
<br />
业务层所负责的如下： <br />
<br />
* 处理应用程序的 业务逻辑和业务校验 <br />
<br />
* 管理事物 <br />
<br />
* 允许与其它层相互作用的接口 <br />
<br />
* 管理业务层级别的对象的依赖。 <br />
<br />
* 在显示层和持久层之间增加了一个灵活的机制，使得他们不直接的联系在一起。 <br />
<br />
* 通过揭示 从显示层到业务层之间的Context来得到business services。 <br />
<br />
* 管理程序的执行（从业务层到持久层）。 <br />
<br />
<br />
<br />
<br />
<br />
<span style="font-weight: bold">域模块层（The Domain Model Layer ）</span> <br />
既然我们致力于的是一个不是很复杂的Web的应用， 我们需要一个对象集合，让它在不同层之间移动的。 域模块层由实际需求中的业务对象组成 比如, OrderLineItem , Product等等。 开发者在这层 不用管那些DTOs，仅关注domain object即可。 例如，Hibernate允许你将数据库中的信息存放入对象（domain objects），这样你可以在连接断开的情况下把这些数据显示到UI层。 而那些对象也可以返回给持续层，从而在数据库里更新。 而且，你不必把对象转化成DTOs（这可能似的它在不同层之间的在传输过程中丢失），这个模型使得Java开发者能很自然运用OO，而不需要附加的编码。 <br />
<br />
一个简单例子 <br />
<br />
<br />
<br />
既然我们已经从全局上理解这些组件。 现在就让我们开始实践吧。 我们还是用 Struts，Spring 和Hibernate。这三个框架已经被描述够多了，这里就不重复介绍了。 这篇文章举例指导你如何使用这三个框架整合开发, 并向你揭示 一个请求是如何贯穿于各个层的。（从用户的加入一个Order到数据库，显示；进而更新、删除）。 <br />
<br />
<br />
<br />
从这里可以下载到程序程序原代码（<a class="postlink" href="http://www.onjava.com/onjava/2004/04/07/examples/wiring.zip" target="_blank"><font color="#006699">download</font></a>） <br />
<br />
既然每个层是互相作用的，我们就先来创建domain objects。首先，我们要在这些Object中要确定那些是需要持久化的，哪些是提供给business logic，那些是显示接口的设计。 下一步，我们将配置我们的持久层并且定义好Hibernate的OR mappings。然后定义好Business Objects。有了这些组成部分之后，我们将 使用Spring把这些连接起来。 最后，我们提供给Spring一个持久层，从这个持久层里我们可以知道它是如何与业务逻辑层（business service layer）通信的，以及它是怎样处理其他层抛出的异常的。。 <br />
<br />
<br />
<br />
<span style="font-weight: bold">域对象层（Domain Object Layer）</span> <br />
<br />
<br />
这层是编码的着手点，我们的编码就从这层开始。 例子中Order 与OrderItem 是一个One—To—Many的关系。 下面就是Domain Object Layer的两个对象： <br />
<br />
<br />
<br />
&#183; com.meagle.bo.Order.java: 包含了一个Order的概要信息 <br />
<br />
&#183; com.meagle.bo.OrderLineItem.java: 包含了Order的详细信息 <br />
<br />
好好考虑怎你的package命名,这反应出了你是怎样分层的。 例如 domain objects在程序中可能打包在com.meagle.bo内。 更详细一点将打包在com. meagle.bo的子目录下面。business logic应该从com.meagle.serice开始打包，而DAO 对象应该位于com.meagle.service.dao.hibernate。反应Forms和Actions的 持久对象（presentation classes） 应该分别放在 com.meagle.action和com.meagle.forms包。 准确的给包命名使得你的classes很好分割并且易于维护，并且在你添加新的classes时，能使得程序结构上保持上下一致。 <br />
<br />
<span style="font-weight: bold">持久层的配置（Persistence Layer Configuration）</span> <br />
<br />
建立Hibernate的持久层 需要好几个步骤。 第一步让我们把BO持久化。 既然Hibernate是通过POJO工作的， 因此Order和 OrderLineItem对象需要给所有的fileds 加上getter,setter方法。 Hibernate通过XML文件来映射(OR)对象，以下两个xml文件分别映射了Order 和OrderItem对象。（这里有个叫XDoclet工具可以自动生成你的XML影射文件） <br />
<br />
- Order.hbm.xml <br />
- OrderLineItem.hbm.xml <br />
<br />
你可以在WebContent/WEB-INF/classes/com/meagle/bo目录下找到这些xml文件。Hibernate的 [urlhttp://www.hibernate.org/hib_docs/api/net/sf/hibernate/SessionFactory.html]SessionFactory [/url]是用来告诉程序 应该与哪个数据库通信，该使用哪个连接池或使用了DataSource， 应该加载哪些持久对象。而<a class="postlink" href="http://www.hibernate.org/hib_docs/api/net/sf/hibernate/Session.html" target="_blank"><font color="#006699">Session</font></a>接口是用来完成Selecting，Saving，Delete和Updating这些操作。 后面的我们将讲述SessionFactory和Session是怎样设置的。 <br />
<br />
<span style="font-weight: bold">业务层的配置（Business Layer Configuration）</span> <br />
<br />
既然我们已经有了domain objects，接下来我们就要business service objects了，用他们来执行程序的logic,调用持久层，得到UI层的requests,处理transactions，并且控制exceptions。 为了将这些连接起来并且易于管理，我们将使用面向方面的 SpringFramework。 Spring 提供了 控制倒置（inversion of control 0==IoC)和注射依赖设置（setter dependency injection）这些方式（可供选择），用XML文件将对象连接起来。 IoC是一个简单概念（它允许一个对象在上层接受其他对象的创建），用IoC这种方式让你的对象从创建中释放了出来，降低了偶合度。 <br />
<br />
<br />
<br />
<br />
这里是一个没有使用IoC的对象创建的例子，它有很高偶合度。 <br />
<br />
<br />
<img src="http://www.onjava.com/onjava/2004/04/07/graphics/nonioc.gif" border="0"  alt="" /> <br />
<br />
<span style="font-style: italic">图 2.没有使用 IoC. A 创建了 B 和 C</span> <br />
<br />
而这里是一个使用IoC的例子，这种方式允许对象在高层可以创建并进入另外一个对象，所以这样可以直接被执行。 <br />
<img src="http://www.onjava.com/onjava/2004/04/07/graphics/ioc.gif" border="0"  alt="" /> <br />
<br />
<span style="font-style: italic">图 3. 对象使用了 IoC。 A 包含了接受B,C的 setter方法 , 这同样达到了 由A创建B,C的目的。</span> <br />
<br />
建立我们的业务服务对象（Building Our Business Service Objects） <br />
<br />
<br />
Business Object中的Setter方法接受的是接口，这样我们可以很松散的定义对象实现，然后注入。 在我们的案例中，我们将用一个business service object接收一个DAO,用它来控制domain objects的持久化。 由于在这个例子中使用了Hibernate，我们可以很方便的用其他持久框架实现 同时通知Spring 有新的DAO可以使用了。 <br />
<br />
在面向接口的编程中，你会明白 &#8220;注射依赖&#8221;模式是怎样松散耦合你的业务逻辑和持久机制的：）。 <br />
<br />
<br />
<br />
下面是一个接口business service object，DAO代码片段： <br />
<br />
<br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code"><br />
            public interface IOrderService { <br />
            <br />
            &nbsp; public abstract Order saveNewOrder(Order order) <br />
            <br />
            &nbsp; &nbsp; throws OrderException, <br />
            <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;OrderMinimumAmountException; <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; public abstract List findOrderByUser( <br />
            <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String user) <br />
            <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws OrderException; <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; public abstract Order findOrderById(int id) <br />
            <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws OrderException; <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; public abstract void setOrderDAO( <br />
            <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;IOrderDAO orderDAO); <br />
            <br />
            } <br />
            <br />
            &nbsp;</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
注意到这段代码里有一个 setOrderDao（），它就是一个DAO Object设置方法（注射器）。 但这里并没有一个getOrderDao的方法，这不必要，因为你并不会在外部访问这个orderDao。这个DAO Objecte将被调用，和我们的persistence layer 通信。我们将用Spring把DAO Object 和 business service object搭配起来的。因为我们是面向接口编程的，所以并不需要将实现类紧密的耦合在一起。 <br />
<br />
<br />
<br />
接下去我们开始我们的DAO的实现类进行编码。 既然Spring已经有对Hibernate的支持，那这个例子就直接继承<a class="postlink" href="http://www.springframework.org/docs/api/org/springframework/orm/hibernate/support/HibernateDaoSupport.html" target="_blank"><font color="#006699">HibernateDaoSupport</font></a>类了，这个类很有用，我们可以参考<a class="postlink" href="http://www.springframework.org/docs/api/org/springframework/orm/hibernate/HibernateTemplate.html" target="_blank"><font color="#006699">HibernateTemplate</font></a>（它主要是针对HibernateDaoSupport的一个用法，译注：具体可以查看<a class="postlink" href="http://www.springframework.org/docs/api/index.html" target="_blank"><font color="#006699">Srping 的API</font></a>）。 下面是这个DAO接口代码： <br />
<br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code">public interface IOrderDAO { <br />
            &nbsp; public abstract Order findOrderById( <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final int id); <br />
            &nbsp; <br />
            &nbsp; public abstract List findOrdersPlaceByUser( <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;final String placedBy); <br />
            &nbsp; public abstract Order saveOrder( <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;final Order order); <br />
            }</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
<br />
我们仍然要给我们持久层组装很多关联的对象，这里包含了HibernateSessionFactory 和TransactionManager。 Spring 提供了一个 <a class="postlink" href="http://www.springframework.org/docs/api/org/springframework/orm/hibernate/HibernateTransactionManager.html" target="_blank"><font color="#006699">HibernateTransactionManager</font></a>，他用线程捆绑了一个Hibernate Session，用它来支持transactions(请查看<a class="postlink" href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadLocal.html" target="_blank"><font color="#006699">ThreadLocal</font></a>) 。 <br />
<br />
下面是HibernateSessionFactory 和 HibernateTransactionManager:的配置： <br />
<br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code">&lt;bean id="mySessionFactory" <br />
            &nbsp; &nbsp; &nbsp; &nbsp;class="org.springframework.orm.hibernate. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LocalSessionFactoryBean"&gt; <br />
            &nbsp; &lt;property name="mappingResources"&gt; <br />
            &nbsp; &nbsp; &lt;list&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;value&gt; <br />
            &nbsp; &nbsp; &nbsp; &nbsp; com/meagle/bo/Order.hbm.xml <br />
            &nbsp; &nbsp; &nbsp; &lt;/value&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;value&gt; <br />
            &nbsp; &nbsp; &nbsp; &nbsp; com/meagle/bo/OrderLineItem.hbm.xml <br />
            &nbsp; &nbsp; &nbsp; &lt;/value&gt; <br />
            &nbsp; &nbsp; &lt;/list&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &nbsp; &lt;property name="hibernateProperties"&gt; <br />
            &nbsp; &nbsp; &lt;props&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;prop key="hibernate.dialect"&gt; <br />
            &nbsp; &nbsp; &nbsp; &nbsp; net.sf.hibernate.dialect.MySQLDialect <br />
            &nbsp; &nbsp; &nbsp; &lt;/prop&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;prop key="hibernate.show_sql"&gt; <br />
            &nbsp; &nbsp; &nbsp; &nbsp; false <br />
            &nbsp; &nbsp; &nbsp; &lt;/prop&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;prop key="hibernate.proxool.xml"&gt; <br />
            &nbsp; &nbsp; &nbsp; &nbsp; C:/MyWebApps/.../WEB-INF/proxool.xml <br />
            &nbsp; &nbsp; &nbsp; &lt;/prop&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;prop key="hibernate.proxool.pool_alias"&gt; <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spring <br />
            &nbsp; &nbsp; &nbsp; &lt;/prop&gt; <br />
            &nbsp; &nbsp; &lt;/props&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &lt;/bean&gt; <br />
            &nbsp; <br />
            &lt;!-- Transaction manager for a single Hibernate <br />
            SessionFactory (alternative to JTA) --&gt; <br />
            &lt;bean id="myTransactionManager" <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;class="org. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; springframework. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; orm. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hibernate. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HibernateTransactionManager"&gt; <br />
            &nbsp; &lt;property name="sessionFactory"&gt; <br />
            &nbsp; &nbsp; &lt;ref local="mySessionFactory"/&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &nbsp; &lt;/bean&gt;</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
<br />
<br />
可以看出：每个对象都可以在Spring 配置信息中用&lt;bean&gt;标签引用。在这里，mySessionFactory引用了HibernateSessionFactory，而myTransactionManager引用了HibernateTransactionManage。 注意代码中myTransactionManger Bean有个sessionFactory属性。 HibernateTransactionManager有个sessionFactory setter 和 getter方法，这是用来在Spring启动的时候实现&#8220;依赖注入&#8221; （dependency injection）的。 在sessionFactory 属性里 引用mySessionFactory。这两个对象在Spring容器初始化后就被组装了起来了。 这样的搭配让你从 单例（singleton objects）和工厂（factories）中解放了出来，降低了代码的维护代价。 mySessionFactory.的两个属性，分别是用来注入mappingResources 和 hibernatePropertes的。通常，如果你在Spring之外使用Hibernate,这样的设置应该放在hibernate.cfg.xml中的。 不管怎样,Spring提供了一个便捷的方式-----在Spring内部配置中并入了Hibernate的配置。 如果要得到更多的信息，可以查阅Spring API。 <br />
<br />
<br />
<br />
<br />
<br />
既然我们已经组装配置好了Service Beans，就需要把Business Service Object和 DAO也组装起来，并把这些对象配到一个事务管理器（transaction manager）里。 <br />
<br />
<br />
<br />
在Spring中的配置信息： <br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code"><br />
            &lt;!-- ORDER SERVICE --&gt; <br />
            &lt;bean id="orderService" <br />
            &nbsp; class="org. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;springframework. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;transaction. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;interceptor. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TransactionProxyFactoryBean"&gt; <br />
            &nbsp; &lt;property name="transactionManager"&gt; <br />
            &nbsp; &nbsp; &lt;ref local="myTransactionManager"/&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &nbsp; &lt;property name="target"&gt; <br />
            &nbsp; &nbsp; &lt;ref local="orderTarget"/&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &nbsp; &lt;property name="transactionAttributes"&gt; <br />
            &nbsp; &nbsp; &lt;props&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;prop key="find*"&gt; <br />
            &nbsp; &nbsp; &nbsp;PROPAGATION_REQUIRED,readOnly,-OrderException <br />
            &nbsp; &nbsp; &nbsp; &lt;/prop&gt; <br />
            &nbsp; &nbsp; &nbsp; &lt;prop key="save*"&gt; <br />
            &nbsp; &nbsp; &nbsp;PROPAGATION_REQUIRED,-OrderException <br />
            &nbsp; &nbsp; &nbsp; &lt;/prop&gt; <br />
            &nbsp; &nbsp; &lt;/props&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &lt;/bean&gt; <br />
            &nbsp; <br />
            &lt;!-- ORDER TARGET PRIMARY BUSINESS OBJECT: <br />
            Hibernate implementation --&gt; <br />
            &lt;bean id="orderTarget" <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;class="com. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; meagle. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; service. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; spring. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OrderServiceSpringImpl"&gt; <br />
            &nbsp; &lt;property name="orderDAO"&gt; <br />
            &nbsp; &nbsp; &lt;ref local="orderDAO"/&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &lt;/bean&gt; <br />
            &nbsp; <br />
            &lt;!-- ORDER DAO OBJECT --&gt; <br />
            &lt;bean id="orderDAO" <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;class="com. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; meagle. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; service. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dao. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hibernate. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OrderHibernateDAO"&gt; <br />
            &nbsp; &lt;property name="sessionFactory"&gt; <br />
            &nbsp; &nbsp; &lt;ref local="mySessionFactory"/&gt; <br />
            &nbsp; &lt;/property&gt; <br />
            &lt;/bean&gt;</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
<br />
<br />
<br />
图4 是我们对象搭建的一个提纲。 从中可以看出，每个对象都联系着Spring，并且能通过Spring注入到其他对象。把它与Spring的配置文件比较，观察他们之间的关系 <br />
<br />
<img src="http://www.onjava.com/onjava/2004/04/07/graphics/spring_wiring.gif" border="0"  alt="" /> <br />
<br />
<span style="font-style: italic">图 4. Spring就是这样基于配置文件，将各个Bean搭建在一起。</span> <br />
<br />
这个例子使用一个TransactionProxyFactoryBean，它定义了一个setTransactionManager()。 这对象很有用，他能很方便的处理你申明的事物还有Service Object。 你可以通过transactionAttributes属性来定义怎样处理。 想知道更多还是参考TransactionAttributeEditor吧。 <br />
<br />
TransactionProxyFactoryBean 还有个setter. 这会被我们 Business service object（orderTarget）引用， orderTarget定义了 业务服务层，并且它还有个属性，由setOrderDAO()引用。这个属性 <br />
<br />
<br />
<br />
Spring 和Bean 的还有一点要注意的： bean可以以用两种方式创造。 这些都在单例模式（Sington）和原型模式（propotype）中定义了。 默认的方式是singleton,这意味着共享的实例将被束缚。 而原形模式是在Spring用到bean的时候允许新建实例的。当每个用户需要得到他们自己Bean的Copy时，你应该仅使用prototype模式。（更多的请参考设计模式中的单例模式和原形模式） <br />
<br />
<span style="font-weight: bold">提供一个服务定位器（Providing a Service Locator）</span> <br />
既然我们已经将我们的Serices和DAO搭配起来了。我们需要把我们的Service显示到其他层。 这个通常是在Struts或者Swing这层里编码。一个简单方法就是用 服务定位器返回给Spring context 。当然，可以通过直接调用Spring中的Bean来做。 <br />
<br />
下面是一个Struts Actin 中的服务定位器的一个例子。 <br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code"><br />
            public abstract class BaseAction extends Action { <br />
            &nbsp; <br />
            &nbsp; private IOrderService orderService; <br />
            &nbsp; <br />
            &nbsp; public void setServlet(ActionServlet <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;actionServlet) { <br />
            &nbsp; &nbsp; super.setServlet(actionServlet); <br />
            &nbsp; &nbsp; ServletContext servletContext = <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;actionServlet.getServletContext(); <br />
            &nbsp; <br />
            &nbsp; &nbsp; WebApplicationContext wac = <br />
            &nbsp; &nbsp; &nbsp; WebApplicationContextUtils. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getRequiredWebApplicationContext( <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;servletContext); <br />
            &nbsp; <br />
            &nbsp; &nbsp; &nbsp; this.orderService = (IOrderService) <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;wac.getBean("orderService"); <br />
            &nbsp; } <br />
            &nbsp; <br />
            &nbsp; protected IOrderService getOrderService() { <br />
            &nbsp; &nbsp; return orderService; <br />
            &nbsp; } <br />
            } <br />
            &nbsp;</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
<span style="font-weight: bold">UI 层配置 （UI Layer Configuration）</span> <br />
<br />
这个例子里UI层 使用了Struts framework. 这里我们要讲述一下在给程序分层的时候， 哪些是和Struts部分的。我们就从一个Struts-config.xml文件中的Action的配置信息开始吧。 <br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code"><br />
            struts-config.xml file. <br />
            <br />
            &lt;action path="/SaveNewOrder" <br />
            &nbsp; &nbsp; type="com.meagle.action.SaveOrderAction" <br />
            &nbsp; &nbsp; name="OrderForm" <br />
            &nbsp; &nbsp; scope="request" <br />
            &nbsp; &nbsp; validate="true" <br />
            &nbsp; &nbsp; input="/NewOrder.jsp"&gt; <br />
            &nbsp; &lt;display-name&gt;Save New Order&lt;/display-name&gt; <br />
            &nbsp; &lt;exception key="error.order.save" <br />
            &nbsp; &nbsp; path="/NewOrder.jsp" <br />
            &nbsp; &nbsp; scope="request" <br />
            &nbsp; &nbsp; type="com.meagle.exception.OrderException"/&gt; <br />
            &nbsp; &lt;exception key="error.order.not.enough.money" <br />
            &nbsp; &nbsp; path="/NewOrder.jsp" <br />
            &nbsp; &nbsp; scope="request" <br />
            &nbsp; &nbsp; type="com. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; meagle. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exception. <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; OrderMinimumAmountException"/&gt; <br />
            &nbsp; &lt;forward name="success" path="/ViewOrder.jsp"/&gt; <br />
            &nbsp; &lt;forward name="failure" path="/NewOrder.jsp"/&gt; <br />
            &lt;/action&gt;</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
SaveNewOrder 这个Action是用来持久化UI层里的表单提交过来Order的。这是Struts中一个很典型的Action; 注意观察这个Action中exception配置，这些Exceptions也在Spring 配置文件(applicationContext-hibernate.xml)中配置了（就在 business service object 的transactionAttributes属性里）。 当异常在业务层被被抛出时，我们可以控制他们，并适当的显示给UI层。 <br />
<br />
第一个异常，OrderException,在持久层保存order对象失败的时候被触发。这将导致事物回滚并且通过BO把异常回传到Struts这一层。 <br />
<br />
第二个异常，OrderMinimumAmountException也同第一个一样。 <br />
<br />
<br />
<br />
<br />
<br />
搭配整和的最后一步 通过是让你显示层和业务层相结合。这个已经被服务定位器（service locator）实现了（前面讨论过了）， 这里服务层作为一个接口提供给我们的业务逻辑和持久层。 <br />
<br />
<br />
<br />
SaveNewOrder Action 在Struts中用一个服务定位器（service locator）来调用执行业务方法的。 方法代码如下： <br />
<br />
<br />
<br />
</span>
<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td><span class="genmed"><strong><font size="2">代码:</font></strong></span></td>
        </tr>
        <tr>
            <td class="code">public ActionForward execute( <br />
            <br />
            &nbsp; ActionMapping mapping, <br />
            <br />
            &nbsp; ActionForm form, <br />
            <br />
            &nbsp; javax.servlet.http.HttpServletRequest request, <br />
            <br />
            &nbsp; javax.servlet.http.HttpServletResponse response) <br />
            <br />
            &nbsp; throws java.lang.Exception { <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; OrderForm oForm = (OrderForm) form; <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; // Use the form to build an Order object that <br />
            <br />
            &nbsp; // can be saved in the persistence layer. <br />
            <br />
            &nbsp; // See the full source code in the sample app. <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; // Obtain the wired business service object <br />
            <br />
            &nbsp; // from the service locator configuration <br />
            <br />
            &nbsp; // in BaseAction. <br />
            <br />
            &nbsp; // Delegate the save to the service layer and <br />
            <br />
            &nbsp; // further upstream to save the Order object. <br />
            <br />
            &nbsp; getOrderService().saveNewOrder(order); <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; oForm.setOrder(order); <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; ActionMessages messages = new ActionMessages(); <br />
            <br />
            &nbsp; messages.add( <br />
            <br />
            &nbsp; &nbsp; &nbsp; ActionMessages.GLOBAL_MESSAGE, <br />
            <br />
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new ActionMessage( <br />
            <br />
            &nbsp; &nbsp; &nbsp; "message.order.saved.successfully")); <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; saveMessages(request, messages); <br />
            <br />
            &nbsp; <br />
            <br />
            &nbsp; return mapping.findForward("success"); <br />
            <br />
            }</td>
        </tr>
    </tbody>
</table>
<span class="postbody"><br />
<br />
总结 <br />
<br />
这篇文章在技术和构架方面掩盖了很多低层的基础信息， 文章的主要的意图在于让你意识到如何给你应用程序分层。 分层可以&#8220;解耦&#8221;你的代码——允许新的组件被添加进来，而且让你的代码易于维护。 这里用到的技术只是专注于把&#8220;解偶&#8221;做好。 不管怎样，使用这样的构架可以让你用其他技术代替现在的层。 例如，你可能不使用Hibernate实现持久化。既然你在DAO中面向接口的编程的，所以你完全可以用iBATIS来代替。或者，你也可能想用Struts外的其他的技术或者框架替换现在的UI层（转换久层，实现层并不应该直接影响到你的业务逻辑和业务服务层）。 用适当的框架搭建你的Web应用，其实也不是一件烦琐的工作，更主要的是它&#8220;解耦&#8221;了你程序中的各个层。 <br />
<br />
<br />
<br />
<br />
<br />
后记： <br />
<br />
看完这篇文章后，只是觉得很喜欢，于是就翻译了，当然同时也准备着挨大家扔来的鸡蛋：）。 <br />
<br />
这篇文章里并没有太多的技术细节，和详细的步骤。如果你从未使用过这些框架而在运行实例程序遇上困难的话，可以到CSDN论坛Java Open Source版发贴，我一定会详细解答的（啊哦，这不算做广告吧？）， <br />
<br />
文章是从一个构架的角度讲述了如何搭配现有的开源框架进行分层， 有太多的术语我都不知道怎么表达，而且可能有很多语句存在错误。如果影响了你的阅读，请你直接点原文地址，我同时也象你说声抱歉。 <br />
<br />
<br />
<br />
作者简介：Mark Eagle 高级软件工程师，亚特兰大。 <br />
翻 译：Totodo,软件工程师 </span></font>
<img src ="http://www.blogjava.net/microlab4321/aggbug/149561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-09-29 13:58 <a href="http://www.blogjava.net/microlab4321/articles/149561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Myeclipse平台struts+hibernate+spring项目开发示例 </title><link>http://www.blogjava.net/microlab4321/articles/137571.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 17 Aug 2007 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137571.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137571.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137571.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 接：Myeclipse开发struts+hibernate+spring新手入门---环境配置如果您按照上篇文章配置成功，可以进行开发简单的J2EE项目。开发前准备:&nbsp;&nbsp;&nbsp; 1、新建项目包：如下图：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dao：数据层；service：逻辑层；web：web展现层。2、建立好三...&nbsp;&nbsp;<a href='http://www.blogjava.net/microlab4321/articles/137571.html'>阅读全文</a><img src ="http://www.blogjava.net/microlab4321/aggbug/137571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-17 16:11 <a href="http://www.blogjava.net/microlab4321/articles/137571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)Myeclipse开发struts+hibernate+spring新手入门---环境配置 </title><link>http://www.blogjava.net/microlab4321/articles/137568.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Fri, 17 Aug 2007 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/137568.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/137568.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/137568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/137568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/137568.html</trackback:ping><description><![CDATA[<p align=center><strong><span>Myeclipse</span></strong><strong><span>开发</span><span>struts+hibernate+spring</span></strong><strong><span>小记</span></strong></p>
<p><strong><span>开发前准备工作：</span></strong><strong></strong></p>
<p><span>1</span><span>、下载</span><span>eclipse3.1</span><span>版本</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>下载地址：</span></p>
<p><span>2</span><span>、下载</span><span>Myeclipse</span><span>插件</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>下载地址：</span></p>
<p><span>3</span><span>、根据需要下载所需要的数据库驱动。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>部分下载地址：</span></p>
<p><span>4</span><span>、下载的</span><span>eclipse3.1</span><span>进行解压缩。安装</span><span>Myeclipse</span><span>，分为手工安装和自动安装两种安装方法。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>具体安装方法如下：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>手工安装：</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>自动安装：</span></p>
<p><span>5</span><span>、安装完成后。启动</span><span>Myeclipse</span><span>。</span></p>
<p><strong><span>准备开发工作：</span></strong><strong></strong></p>
<p><span>步骤：</span></p>
<p><strong><span>1</span></strong><strong><span>、新建项目：</span></strong></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>New&gt;projects</span><span>后进入下图</span></p>
<p align=center></p>
<p><span>本文主要介绍开发</span><span>Web Project</span><span>项目，因此需要选择</span><span>Web Project</span><span>，下一步，进入下图：</span></p>
<p align=center></p>
<p><span><img height=499 alt=a.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/a.JPG" width=521 border=0><br>Project Name</span><span>：为需要建立的项目名称。填写好项目名称后，</span><span>Finish</span><span>。新建项目完成。本文在项目命名为</span><span>test.</span><span>。</span></p>
<p><span>项目建立完成之后，在</span><span>Myeclipse</span><span>视图中，</span><span>Package Explorer</span><span>中显示如下：<br></span></p>
<p><span><img height=180 alt=b.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/b.JPG" width=325 align=left border=0>test</span><span>：为项目名称。</span></p>
<p><span>Src</span><span>：为源文件所放路径。</span></p>
<p><span>WebRoot</span><span>：为</span><span>Web root folder</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span><br><br><br>2</span></strong><strong><span>、加载</span><span>Struts</span></strong></p>
<p><span><span>&nbsp;&nbsp; </span></span><span>在所建立项目</span><span>test</span><span>上右键后，提示如下页面：<br></span></p>
<p>&#160;</p>
<p><span><img height=269 alt=c.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/c.JPG" width=552 border=0><br><br>&nbsp; 在弹出的菜单中，根据图例提示，选择</span><span>Myeclipse</span><span>后在弹出的二级菜单中选择</span><span>Add Struts Capabilities&#8230;</span><span>后提示如下图所示：</span></p>
<p>&#160;</p>
<p><span><img height=451 alt=d.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/d.JPG" width=721 border=0><br>在弹出的对话框中，设置如下：</span></p>
<p><span>Struts config path</span><span>：默认，一般不需要改变。</span></p>
<p><span>Struts specification</span><span>：选择</span><span>Struts</span><span>版本，在此项目中，选择</span><span>Struts 1.2</span><span>版本。</span></p>
<p><span>Base Package for new classes</span><span>：设置为空。</span></p>
<p><span>取消</span><span>Install Struts TLDs</span><span>选项。</span></p>
<p><span>其他默认：</span></p>
<p><span>Finish.</span><span>后在</span><span>Package Explorer</span><span>的</span><span>Lib</span><span>包如下：<br></span></p>
<p>&#160;</p>
<p><span><img height=324 alt=e.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/e.JPG" width=260 border=0><br>到此，加载</span><span>Struts</span><span>完成。在此需要关注</span><span>Struts-config.xml</span><span>文件。</span></p>
<p><strong><span>3</span></strong><strong><span>、加载</span></strong><strong><span>hibernate:</span></strong></p>
<p><span>同加载</span><span>struts</span><span>方式类似，选择</span><span>Myeclipse</span><span>后在弹出的二级菜单中选择</span><span>Add Hibernate Capabilities&#8230;</span><span>后提示如下图所示：<br></span></p>
<p align=center></p>
<p><span><img height=411 alt=f.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/f.JPG" width=594 border=0><br>可以根据提示，选择</span><span>Hibernate Specification</span><span>：本项目选择</span><span>Hibernate3</span><span>，其他默认，</span><span>Next&gt;<br></span></p>
<p><span>默认后直接下一步。在此可以去掉</span><span>Configuration File Name</span><span>中的内容。</span><span>Next&gt;<br></span><span><img height=412 alt=h.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/h.JPG" width=591 border=0><br><br>后去掉下一级页面的</span><span>Create SessionFactory class</span><span>选项。然后</span><span>Finish</span><span>，</span><span>Finish</span><span>完成后，在</span><span>Lib</span><span>目录下会提示相关的</span><span>jar</span><span>包。</span></p>
<p><span>4</span><span>、加载</span><span><a title=心得与体会 href="http://www.blogjava.net/shmily432685"><a title=心得与体会 href="http://www.blogjava.net/shmily432685">spring in action</a> in action</a></span></p>
<p><span>同加载</span><span>struts</span><span>方式类似，选择</span><span>Myeclipse</span><span>后在弹出的二级菜单中选择</span><span>Add <a title=心得与体会 href="http://www.blogjava.net/shmily432685"><a title=心得与体会 href="http://www.blogjava.net/shmily432685">spring in action</a> in action</a> Capabilities&#8230;</span><span>后提示如下图所示：<br><br></span></p>
<p align=center></p>
<p><span><img height=503 alt=g.JPG src="http://www.blogjava.net/images/blogjava_net/shmily432685/subject/g.JPG" width=530 border=0><br><br>选择所需要的</span><span><a title=心得与体会 href="http://www.blogjava.net/shmily432685"><a title=心得与体会 href="http://www.blogjava.net/shmily432685">spring in action</a> in action</a></span><span>包，然后默认下一步，直到完成。</span></p>
<p><span>到此，</span><span>Struts+hibernate+spring</span><span>配置完成。</span></p>
<p><span>附加：在项目名称的右键后进入</span><span>Properties</span><span>然后进入</span><span>Java Build Path</span><span>后查看加载的</span><span>jar</span><span>包。</span></p>
<p><span>具体项目的开发详细文档请见下一篇文章《</span><span>struts+hibernate+spring</span><span>项目开发示例》</span></p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/137568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-17 16:04 <a href="http://www.blogjava.net/microlab4321/articles/137568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java程序员要掌握的十个JSP中的标签库 </title><link>http://www.blogjava.net/microlab4321/articles/136299.html</link><dc:creator>冬天出走的猪</dc:creator><author>冬天出走的猪</author><pubDate>Mon, 13 Aug 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/microlab4321/articles/136299.html</guid><wfw:comment>http://www.blogjava.net/microlab4321/comments/136299.html</wfw:comment><comments>http://www.blogjava.net/microlab4321/articles/136299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/microlab4321/comments/commentRss/136299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/microlab4321/services/trackbacks/136299.html</trackback:ping><description><![CDATA[<p>Standard </p>
<p>这个库必不可少，因为它结合了对普通JSP的大量核心改进。它的一些特性包括：XML操作库、SQL库、特殊国际化功能、以及对迭代器和其它程序控制机制的支持。在需要高级流程控制结构、国际化功能或XML支持时使用这个库。 </p>
<p>DateTime </p>
<p>这个库提供各种操作日期和时间的工具，包括恢复当前日期和时间、生成日期和月份列表、格式化日期和时间、时区转换。使用这个库可以方便地把日期和时间操作程序加入到你的应用程序中。 </p>
<p>Mailer </p>
<p>这个库通过一个用户定义的SMTP服务器支持邮件发送，为你的JSP应用程序增加电子邮件发送功能。它还支持多位收件人、定制标题、MIME附件和错误处理。当需要在JSP页面中创建和发送电子邮件消息时使用这个库。 </p>
<p>Cache </p>
<p>这个库为一个网站提供一个简单的缓冲框架。它将缓冲页面转译给客户端，允许你缓冲部分页面，缩短响应时间。如果你的网站接收许多流量，使用这个库不时为客户端提供页面缓冲快照而非&#8220;实况&#8221;页面，从而减轻服务器负载和页面处理时间。 </p>
<p>XTages </p>
<p>这个库提供程序简化用XSLT解析和转换XML文档的过程。它可用于将一个XSLT转换应用于XML文档中、增加或删除XML节点、评估Xpath表达式和定义模板规则。当你需要高级XML/XSLT处理功能使用这个库。 </p>
<p>Regexp </p>
<p>这个库允许你在JSP应用程序中使用与Perl5兼容的常规表达式。这个库支持Perl的匹配(m)、替换(s)和分解操作符。当你需要模式匹配和替代的常规表达式支持时使用这个库。 </p>
<p>JSP Controls </p>
<p>这个库允许你建立单个页面组件，如登录表格或进度条，它们可以进行单独更新。这个库对AJAX应用程序特别有用，虽然它也可用在非AJAX模式中。在建立AJAX类型的JSP应用程序时使用这个库。 </p>
<p>Pagers </p>
<p>这个库为数据集实施一个分页系统，简化在大型数据集（如数据库搜索结果）中来回移动的操作过程。它还包括各种分页样式，支持可浏览的结果目录。当你的应用程序需要一个粗劣的分页系统时使用这个库。 </p>
<p>JDBForms </p>
<p>这个库可以在数据库连接和表单元素之间建立链接，建立定制行动迅速简化数据库驱动的Web应用程序的开发。它还支持分类、搜索、过滤和样式功能，并使用一个基于SWING的界面。要迅速开发数据库支持的JSP应用程序时使用这个库。 </p>
<p>Google Tag Library </p>
<p>这个库可以执行和处理Google搜索，检查拼写并且访问Google.com缓存中的页面。使用这个库给你的网站增加Google搜索功能，或创建一个使用Google.com数据库的搜索引擎。</p>
<img src ="http://www.blogjava.net/microlab4321/aggbug/136299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/microlab4321/" target="_blank">冬天出走的猪</a> 2007-08-13 10:13 <a href="http://www.blogjava.net/microlab4321/articles/136299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>