Struts+Spring+Hibernate+WebService集成架构Word下载.docx
- 文档编号:22274610
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:25
- 大小:213.98KB
Struts+Spring+Hibernate+WebService集成架构Word下载.docx
《Struts+Spring+Hibernate+WebService集成架构Word下载.docx》由会员分享,可在线阅读,更多相关《Struts+Spring+Hibernate+WebService集成架构Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
Struts框架利用ActionFormBean来进行视图和控制器之间表单数据之间表单数据的传递,如下图所示:
Struts框架把用户输入的表单数据保存在ActionFormBean中,把它传递给控制器Action,Action可以对ActionFormBean中数据进行修改,JSP文件使用Struts标签读取修改后的ActionFormBean中的信息,重新设置HTML表单。
二、控制层
控制层中的控制器Action接受用户的输入并调用业务层的业务方法和表示层的组件去完成用户的需求。
当Web用户单击Web页面中的提交按钮来发送HTML表单时,控制器接收请求并调用相应的业务层方法去处理请求,然后调用相应的视图来显示业务层返回的数据。
Struts中的控制器由ActionServlet类和Action类来实现,ActionServlet主要负责接收HTTP请求信息,根据配置文件struts-config.xml的配置信息,把请求转发给适当的Action对象。
如果该Action对象不存在,ActionServlet会先创建这个Action对象,Action充当用户请求和业务逻辑处理之间的适配器,其功能是将请求与业务逻辑分开,Action根据用户请求调用相关的业务逻辑组件,业务逻辑由Spring的IoC、AOP、DAO、ORM来完成,Action类侧重于控制应用程序的流程,而不是实现应用程序的逻辑。
为了使用Action中使用到Spring受管理JavaBean、IoC、AOP来调用Spring的业务逻辑、事务管理、安全性服务。
Spring对Struts提供了这种集成服务,通过org.springframework.web.struts.DelegatingRequestProcessor类充当Action的代理,将StrutsAction配置在SpringApplicationContext中,而且Action不必继承于ActionSuport,每次客户请求StrutsAction时,DelegatingRequestProcessor将充当代理的作用,即通过它将Action请求转发给SpringIoC容器进行处理。
通过这样的方式,Spring获得了对Action实例的管理权,它将对Action进行调度,并为Struts提供所需的Action实例。
既然Action已经由Spring全权接管,那么就可以将此Action看作是Spring中的一个Bean,它可享受Spring提供的所有服务(依赖注入、实例管理、事务管理等)。
三、业务层
业务层应该和表示层以及控制层之间保持独立,在本集成分层框架中,位于上层的表示层和控制层依赖于下层的业务层的实现,而下层业务层不应该依赖于上层的表示层和控制器的实现。
业务层提供了处理应用程序的业务逻辑和业务校验,如验证用户登录系统的密码是否正确;
提供了管理事务,允许与其它层相互作用的接口,如使用Spring的管理事务Bean和DAO层的DAO接口类(DAO层)以及给Action(控制层)提供业务接口。
业务层还提供了管理业务层级别的对象的依赖、管理程序的执行(从业务层到持久层)等。
四、DAO层
DAO提供了访问关系型数据库所需要的所有操作的接口,其中包括创建数据库、定义表、字段和索引,建立表间的关系,更新和查询数据库等,DAO将底层数据(Hibernate持久对象)访问操作和业务层(business层)逻辑分离开,对业务层(business层)提供面向对象的数据访问接口。
而业务层(business层)调用DAO接口实现各种业务方法,如验证用户密码是否正确业务方法,并向控制层(Action类)提供调用业务方法的接口。
五、持久层
由集成图可看出,Web应用的另一个末端是持久层Hibernate,Hibernate是一个ORM(O/RMapping)工具,没有Hibernate时,通常使用JDBC来连接数据库,并利用连接池来改善性能,利用事务服务来保证可靠性,还会利用JNDI(javanaming&
directoryinterface)来传递数据源,配合SQL语言来完成数据库的查询操作。
但Hibernate可以复杂性的JDBC过程以对象系统映射的方式对开发者透明,将需要经验和技巧的设计部分封装在PO对象和XML映射文件的配置中。
使用了Hibernate应用程序就不需发直接面对JDBC代码,由PO对象和Hibernate的API来取代。
Hibernate利用hibernate.cfg.xml或hibernate.properties文件来配置Hibernate所使用的包括数据库和连接池等在内的资源,Hibernate利用*.hbm.xml来描述POJO和数据库资源的映射关系。
六、RMI
(RemoteMethodInvoke)
Spring提供类用于集成各种远程访问技术,对远程访问的支持可以降低在用POJO实现支持远程访问业务时的开发难度。
Spring提供了对远程方法调用(RMI)的支持,借助于Spring提供的RmiProxyFactoryBean和RmiServiceExporter可以开发RMI应用。
RMI服务器集成了Aglets的运行环境AgletContext,并实现了Agent相关业务方法,由业务层通过RMI的业务接口DAO来完成Agent相关的业务。
七、集成实现
7.1Spring集成Struts1.x
Struts是基于MVC的,它实现了Model2模型的Web应用框架,Struts框架的核心作用其提供的灵活的控制层,它是基于JavaServlet、JavaBean、ResourceBundle、XML等技术构建的。
Spring对Struts提供了两种集成方式:
1、通过覆盖Struts中的RequestProcessor
将Spring从Struts动作中分离是一个更巧妙的设计选择。
分离的一种方法是使用org.springframework.web.struts.DelegatingRequestProcessor类来覆盖Struts的RequestProcessor请求处理程序,如配置清单如下:
通过Spring的DelegatingRequestProcessor对Struts进行整合,在struts-config.xml配置文件中
<
?
xmlversion="
1.0"
encoding="
UTF-8"
>
!
DOCTYPEstruts-configPUBLIC"
-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.2//EN"
"
http:
//struts.apache.org/dtds/struts-config_1_2.dtd"
struts-config>
<
data-sources/>
form-beans>
form-beanname="
deptForm"
type="
org.itfuture.www.form.DeptForm"
/>
/form-beans>
global-exceptions/>
global-forwards/>
action-mappings>
action
attribute="
name="
parameter="
m"
path="
/deptAction"
scope="
request"
type="
org.itfuture.www.action.DeptAction"
validate="
false"
forwardname="
dept"
/dept.jsp"
/forward>
test"
/WEB-INF/jsp/test.jsp"
/action>
/action-mappings>
controllerprocessorClass="
org.springframework.web.struts.DelegatingRequestProcessor"
/>
message-resourcesparameter="
org.itfuture.www.ApplicationResources"
plug-inclassName="
org.springframework.web.struts.ContextLoaderPlugIn"
set-propertyproperty="
contextConfigLocation"
value="
/WEB-INF/applicationContext.xml"
/plug-in>
/struts-config>
利用了<
controller>
标记来用DelegatingRequestProcessor覆盖默认的StrutsRequestProcessor。
下一步是在Spring配置文件中注册该动作,spring配置如下:
在Spring配置文件中注册一个动作
beans
xmlns="
//www.springframework.org/schema/beans"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
//www.springframework.org/schema/beanshttp:
//www.springframework.org/schema/beans/spring-beans-2.0.xsd"
beanid="
now"
class="
java.util.Date"
/bean>
beanname="
prototype"
(1)
propertyname="
date"
ref="
/property>
/beans>
注意:
在
(1)处,使用名称属性注册了一个bean,以匹配struts-config动作Action映射路径名称。
DeptAction动作揭示了一个JavaBean属性,允许Spring在运行时填充属性(通过set依赖注入),具体实现如下:
具有JavaBean属性的Struts动作DeptAction
packageorg.itfuture.www.action;
importjava.util.Date;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.struts.action.ActionForm;
importorg.apache.struts.action.ActionForward;
importorg.apache.struts.action.ActionMapping;
importorg.apache.struts.actions.DispatchAction;
importorg.itfuture.www.form.DeptForm;
publicclassDeptActionextendsDispatchAction{
privateDatedate;
publicDeptAction()
{
System.out.println("
DeptAction()---------"
);
}
publicActionForwardexecute(ActionMappingmapping,ActionFormform,
HttpServletRequestrequest,HttpServletResponseresponse){
DeptFormdeptForm=(DeptForm)form;
request.setAttribute("
date);
returnmapping.findForward("
publicDategetDate(){
returndate;
publicvoidsetDate(Datedate)
(1)
this.date=date;
}
如上的代码中,您可以了解到如何创建Struts动作。
在
(1)处,我创建了一个JavaBean属性。
DelegatingRequestProcessor自动地配置这种属性。
这种设计使Struts动作并不知道它正被Spring管理,并且使您能够利用Sping的动作管理框架的所有优点。
由于您的Struts动作注意不到Spring的存在,所以您不需要重写您的Struts代码就可以使用其他控制反转容器来替换掉Spring。
DelegatingRequestProcessor方法的确比第一种方法好,但是仍然存在一些问题。
如果您使用一个不同的RequestProcessor,则需要手动整合Spring的DelegatingRequestProcessor。
添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。
此外,还有过一些使用一系列命令来代替StrutsRequestProcessor的传闻。
这种改变将会对这种解决方法的使用寿命造成负面的影响。
2、将动作管理委托给Spring
一个更好的解决方法是将Strut动作管理委托给Spring。
您可以通过在struts-config动作映射中注册一个代理来实现。
代理负责在Spring环境中查找Struts动作。
由于动作在Spring的控制之下,所以它可以填充动作的JavaBean属性,并为应用诸如Spring的AOP拦截器之类的特性带来了可能。
具体使用步骤如下:
在struts-config.xml中配置
empForm"
org.itfuture.www.form.EmpForm"
method"
/empAction"
org.springframework.web.struts.DelegatingActionProxy"
>
emp"
/emp.jsp"
—也可以把该配置放到web.xml中-->
上面是一个典型的struts-config.xml文件,只有一个小小的差别。
它注册Spring代理类的名称,而不是声明动作的类名,如
(1)处所示。
DelegatingActionProxy类使用动作映射名称查找Spring环境中的动作。
这就是我们使用ContextLoaderPlugIn声明的环境。
将一个Struts动作注册为一个Springbean是非常直观的,如下面所示。
我利用动作映射使用<
bean>
标记的名称属性(在这个例子中是"
/empAction"
)简单地创建了一个bean。
这个动作的JavaBean属性像任何Springbean一样被填充:
在Spring环境中注册一个Struts动作
--管理对象,即管理bean-->
--构造子(即构造函数)依赖注入-->
sessionFactory"
class="
org.springframework.orm.hibernate3.LocalSessionFactoryBean"
<
configLocation"
--set依赖注入-->
<
value>
classpath:
hibernate.cfg.xml<
/value>
empimpl"
org.itfuture.www.impl.EmpImpl"
org.itfuture.www.action.EmpAction"
dao"
动作委托的优点
动作委托解决方法是这三种方法中最好的。
Struts动作不了解Spring,不对代码作任何改变就可用于非Spring应用程序中。
RequestProcessor的改变不会影响它,并且它可以利用SpringAOP特性的优点。
动作委托的优点不止如此。
一旦让Spring控制您的Struts动作,您就可以使用Spring给动作补充更强的活力。
例如,没有Spring的话,所有的Struts动作都必须是线程安全的。
如果您设置<
标记的singleton属性为“false”,那么不管
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts Spring Hibernate WebService 集成 架构
![提示](https://static.bdocx.com/images/bang_tan.gif)