`
hbczzsw
  • 浏览: 41959 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts+Spring+Hibernate的技术实现

阅读更多
一、三个框架简介

Struts:

Struts是目前Java Web MVC框架中不争的王者。经过长达五年的发展,Struts已经逐渐成长为一个稳定、成熟的框架,并且占有了MVC框架中最大的市场份额。

Spring:

Spring是一个开源框架,它是为了解决企业应用开发的复杂性而开发的。Spring使使用基本的JavaBeans来完成以前只可能由EJB完成的事情变得可能了。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。在Spring中应用对象被声明式地组合在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等),让开发者更专注于应用逻辑。所有的这些特征使开发者能够编写更干净、更易管理、并且更易于测试的代码。

Hibernate:

Hibernate是高性能的开源框架。提供O/R映像功能,通过XML配置文件能够将对象映像到数据库。对数据操作进行了封装,能够方便简洁地解决大多数的数据持久化操作。

二、实现架构图

架构介绍
Filter:Web过泸器,继承javax.servlet.Filter,用于处理只要客户请求就必须初始化或处理的实例。例如可以在这里进行请求的编码转换,为了更好地支持中文,更好的方法就是把客户端的请入信息转换成UTF-8格式,并存于数据库中,这种转换就可以在过泸器中进行处理。

ActionServlet:是Struts提供的总控制器,在这里接收来自客户端的所有请求,并根据请求参数和Struts配置文件struts-config.xml决定请求由那个具体的Action来处理。

Action:由Struts提供的Action类,继承Struts的org.apache.struts.action.Action类。客户的不同请求,可以由不同的Action来处理(由ActionServlet总控制器选择)。Action用于处理客户请求的具体操作,比如调调用Service层的方法进行数据保存或读取。Action还根据struts-config.xml配置选择页面的转发。对客户输入的信息进行验证。

ActionForm::由Struts提供的Form类,继承Struts的org.apache.struts.action.ActionForm类。用于封装来自客户窗体的信息,并可以对信息进行初级有效性验证。

Jsp和tiles-defs.xml:tiles-defs.xml由Strtus提供,用于页面的定义,可以定义JSP模板,不同页面都可以断承该模板。Jsp用于表示界面,可以在Jsp中书写Struts标签由不牵涉任何Java代码。

Service接口:定义Service的接口,给上层调用。这里编写上层所需方法的定义。

Service接口实现:这里实现Service接口方法的具本实现,并实现商务逻辑。该类为了支持Spring的依赖注入功能,需要实现一个setXxxDAO()的方法,这样类就可以利用注入来的DAO进行数处理。在这一层利用Spring的事务管理,对这层的方法进行事务声明管理。

DAO接口:这里定义DAO数据访问层的接口,给业务层Service调用。

DAO接口实现:这里具体实现DAO接口的所有方法,只进行数据的保存、读取、更新等动作,不牵涉事务。该类继承Spring的org.springframework.orm.hibernate3.support.HibernateDaoSupport类,可以不再理会Hibernate的API,即可进行Hibernate方式的数据操作。可以让代码更简洁,有条理。

Spring:这是系统的中心部分,这里在一个XML配置文件中定义了大部分的系统Bean,并对它们进行集中管理。定义了DAO层、Service层的所有类。定义了事务,并且定义了方法的事务策略。

三、各层的具体实现

1、底层的数据访问DAO层实现

      Hibernate的表与对象映像文件,文件名类似xxxx.hbm.xml(xxxx为表名),它由Hibernate工具根据数据库的表结构生成而来,一般的结构如下:

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="org.shingwai.website.bean">

<class table="IncInfo">

<id column="incName" length="250"

unsaved-value="null">

<generator class="native"/>

</id>

<property column="incDesp"type="string" not-null="false"/>

</class>   

</hibernate-mapping>



第5行表示持久化类所处的包,第6行表示持久化类名和代表数据库的那个表,第7行表示数据表的主键及一些属性(如长度、字段名、类型等),第11行表示表的一个字段Spring中可以对Hibernate的表配置文件进行加载,而不用Hibernate独立的配置文件,这样就把Hibernate包含在Spring的管理中。把表配置文件加载到Spring中的样子如下:以下代码是Spring配置文件片段

<bean

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">



        <property>

            <ref local="dataSource" />

        </property>

        <property>

            <list>

               <value>org/shingwai/website/bean/ProductJPGImage.hbm.xml</value>

                <value>org/shingwai/website/bean/Category.hbm.xml</value>

                <value>org/shingwai/website/bean/IncInfo.hbm.xml</value>

                <value>org/shingwai/website/bean/SwcProduct.hbm.xml</value>

            </list>

        </property>

        <property>

            <props>

                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>

                <prop key="hibernate.show_sql">true</prop>

                <prop key="hibernate.jdbc.fetch_size">25</prop>

                <prop key="hibernate.jdbc.batch_size">50</prop>

            </props>

        </property>

    </bean>



以上代码表示把Hibernate的四个表配置文件加载到Spring管理中,它们是org/shingwai/website/bean/ProductJPGImage.hbm.xml

org/shingwai/website/bean/Category.hbm.xml

org/shingwai/website/bean/IncInfo.hbm.xml

org/shingwai/website/bean/SwcProduct.hbm.xml

分别代表数据表ProductJPGImage、Category、IncInfo、SwcProduct

<property>标签设定Hibernate的一些属性参数

      DAO接口定义

只是一个接口类,里面定义了一些方法,样子如下:

public interface IIncInfoDAO {  



        public IncInfo findAll();



}

      DAO接口实现类

它继承org.springframework.orm.hibernate3.support.HibernateDaoSupport类并实现了DAO接口,样子如下:

public class IncInfoHibernateDAO extends HibernateDaoSupport implements IIncInfoDAO {

        private static final String LOAD_ALL ="from IncInfo inc ";

        public IncInfo findAll() {

                List list = this.getHibernateTemplate().find(LOAD_ALL);

                if (list.size()==0)        {

                        return null;

                }else {

                        return (IncInfo)list.get(0);

                }

        }

}

HibernateDaoSupport类提供了一个操作Hibernate的Template,可以实现Hibernate的大多数操作而不用理会什么时候Open Session或是什么时候Close Session。所有这些都由Spring进行处理。只要调用它的getHibernateTemplate()方法,其它的就交给Spring吧。如上例的查询只有一行代码List list = this.getHibernateTemplate().find(LOAD_ALL);

2、业务层Service的实现

        在Spring配置文件中定义DAO,因为Service层需要注入DAO来进行数据操作。DAO在Spring的Bean定义如下所示:

它注入了由Spring实现的Hibernate sessionFactory,提供给它的HibernateDaoSupport类使用。(mySessionFactory 的定义见上文Spring加载Hibernate表配置文件)。我们在Service层实现里说明DAO在Spring中的定义是因为我们的Service层要使用到它。

      Service接口

一个普通的接口类,样子如下:

public interface IIncInfoService {       


        public IncInfo findAll();



}

       Service接口实现,它要实现一个setXxxDAO()方法,用于Spring的依赖注入。代码样子如下:

public class IncInfoServiceImpl implements IIncInfoService {       

        private IIncInfoDAO incInfoDAO;

        public void setIncInfoDAO(IIncInfoDAO incInfoDAO){

                this.incInfoDAO=incInfoDAO;           

        }

        public IncInfo findAll() {

                // TODO 这里可以加入业务逻辑

                return incInfoDAO.findAll();

        }

}

       在Spring中定义Service,那么客户端就可以通过Spring来调用Service的方法。



该定义中注入了incInfoDAO。

至此已经完成了DAO层和Service层的方法和Spring的Bean定义。

3、表示层的实现

表示层使用Struts框架,利用Jbuilder或Eclipse都可以很方便的创建ActionForm,Action。表示的其它技术将不在这里介绍,这里只说明在Action中如何调用Servie层的方法。

      在Action中通过Spring调用Service的方法,代码样例如下:

AbstractApplicationContext appContext=new ClassPathXmlApplicationContext("/applicationContext.xml")

IIncInfoService incInfoService=(IIncInfoService) appContext.getBean("incInfoService");

List list=incInfoService.findAll();



applicationContext.xml为Spring的配置文件名,通过实例appContext可以得到incInfoService实例。

4、附录Spring的声明式事务定义,样式如下:



<!-- transactionManager -->

    <bean

        class="org.springframework.orm.hibernate3.HibernateTransactionManager">

        <property>

            <ref local="mySessionFactory" />

        </property>

    </bean>

    <!-- baseTxProxy -->

    <bean     class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"    lazy-init="true" abstract="true">

        <property>

            <ref bean="transactionManager" />

        </property>

        <property>

            <props>

                <prop key="*">PROPAGATION_REQUIRED</prop>

            </props>

        </property>

    </bean>

    <!-- 事务定义示例bean  -->

        <bean parent="baseTxProxy">

        <property>

            <bean class="com.spring.test.tran.BookService">

                <property>

                    <ref local="bookDAO" />

                </property>

            </bean>

        </property>

    </bean>



第一段定义由那个类来进行事务管理;第二段定义一个事务代理模板,并定义事务策略;第三段定义一个需要进行事务管理的Bean,它继承了事务代理模板,把自己本身的实现类交给代理类来实现。

<bean class="org.shingwai.website.service.impl.IncInfoServiceImpl">

     <property>

        <ref local="incInfoDAO"/>

     </property>

</bean>



<bean id ="incInfoDAO" class="org.shingwai.website.dao.impl.IncInfoHibernateDAO">

     <property>

         <ref local="mySessionFactory"/>

     </property>

    </bean>



public class IncInfoHibernateDAO extends HibernateDaoSupport implements IIncInfoDAO {

        private static final String LOAD_ALL ="from IncInfo inc ";

        public IncInfo findAll() {

                List list = this.getHibernateTemplate().find(LOAD_ALL);

                if (list.size()==0)        {

                        return null;

                }else {

                        return (IncInfo)list.get(0);

                }

        }

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics