Struts+Spring+Hibernate的技术实现

一、三个框架简介

Struts:

Struts是目前JavaWebMVC框架中不争的王者。经过长达五年的发展,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工具根据数据库的表结构生成而来,一般的结构如下:

<?xmlversion="1.0"?>

<!DOCTYPEhibernate-mappingPUBLIC

"-//Hibernate/HibernateMappingDTD//EN"

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

<hibernate-mappingpackage="org.shingwai.website.bean">

<classtable="IncInfo">

<idcolumn="incName"length="250"

unsaved-value="null">

<generatorclass="native"/>

</id>

<propertycolumn="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>

<reflocal="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>

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

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

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

<propkey="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接口定义

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

publicinterfaceIIncInfoDAO{

publicIncInfofindAll();

}

DAO接口实现类

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

publicclassIncInfoHibernateDAOextendsHibernateDaoSupportimplementsIIncInfoDAO{

privatestaticfinalStringLOAD_ALL="fromIncInfoinc";

publicIncInfofindAll(){

Listlist=this.getHibernateTemplate().find(LOAD_ALL);

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

returnnull;

}else{

return(IncInfo)list.get(0);

}

}

}

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

2、业务层Service的实现

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

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

Service接口

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

publicinterfaceIIncInfoService{

publicIncInfofindAll();

}

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

publicclassIncInfoServiceImplimplementsIIncInfoService{

privateIIncInfoDAOincInfoDAO;

publicvoidsetIncInfoDAO(IIncInfoDAOincInfoDAO){

this.incInfoDAO=incInfoDAO;

}

publicIncInfofindAll(){

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

returnincInfoDAO.findAll();

}

}

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

该定义中注入了incInfoDAO。

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

3、表示层的实现

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

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

AbstractApplicationContextappContext=newClassPathXmlApplicationContext("/applicationContext.xml")

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

Listlist=incInfoService.findAll();

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

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

<!--transactionManager-->

<bean

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

<property>

<reflocal="mySessionFactory"/>

</property>

</bean>

<!--baseTxProxy-->

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

<property>

<refbean="transactionManager"/>

</property>

<property>

<props>

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

</props>

</property>

</bean>

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

<beanparent="baseTxProxy">

<property>

<beanclass="com.spring.test.tran.BookService">

<property>

<reflocal="bookDAO"/>

</property>

</bean>

</property>

</bean>

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

<beanclass="org.shingwai.website.service.impl.IncInfoServiceImpl">

<property>

<reflocal="incInfoDAO"/>

</property>

</bean>

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

<property>

<reflocal="mySessionFactory"/>

</property>

</bean>

publicclassIncInfoHibernateDAOextendsHibernateDaoSupportimplementsIIncInfoDAO{

privatestaticfinalStringLOAD_ALL="fromIncInfoinc";

publicIncInfofindAll(){

Listlist=this.getHibernateTemplate().find(LOAD_ALL);

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

returnnull;

}else{

return(IncInfo)list.get(0);

}

}

}

相关推荐