使用 Spring 管理 Struts 的 Action可以充分利用Spring 的 Ioe 功能,使 Action 无须关心业务逻辑组件的实现,而由 Spring 负责为 Action注入业务逻辑组件引用,从而实现更好地解祸。

  为了让 Struts 将请求转发到 Spring 容器内的 bean,系统将采用 DelegatingRequestProcessor 的整合策略。因为这种策略无需 Struts 创建 Action 实例,直接由 Spring 容器负责创建 Action 实例,并为其注入依赖关系。使系统更早将请求转发给 Spring 容器控制。采用这种整合策略,必须在 struts-config.xrnl 文件中配置 controller 元素,并通过指定 processorClass 属性指定 DelegatingRequestProcessor 处理器。即在配置文件中增加如下代码:

<controller inputForward="true"processorClass="org.
springfrarnework.web.struts.DelegatingRequestProcessor"/>

  经过这个简单的配置,则无须为struts-config.xrnl中的 Action配置 class属性,因为Struts无须负责创建Action实例,由DelegatingRequestProcessor直接将请求转发到Spring容器内。

下面是struts-config.xrnl文件中 Action的配置代码:

 

<!--添加消息评论…>
<action path="/addNewsReview"name="
addNewsReviewForm"scope="request"validate="true"
input="i口put">
<forward narne="failure"path=刷 /loadNewsReviewByNews.do"/>
<forward name="success" path="/loadNewsReviewByNews.do"/>
<faction>

  在上面的配置代码中,没有为action 元素确定 class 属性,只有当采用DelegatingRequestProcessor代替了默认的RequestProcessor后,才允许这样配置。

DelegatingRequestProcessor转发请求时,请求被转发给Spring容器中同名的bean处理,因此必须在Spring容器中配置同名的bean。对于上面Action的配置,必须在Spring容器中配置如下的bean:

<bean name="/addNewsReview" class="org.
yeeku.action.AddReviewAction">
<property name="mgr" ref="facadeManager"/>
</bean>


  下面是整个应用struts-config.xrnl配置文件的源代码:

 

<?xml version="l.O" encoding="GBK"?><!--Struts配置文件的文件头,包含DTD等信息>
<!DOCTYPE struts-configPUBLiC
O-//Apache Software Foundation//DTD Struts Configuration
1.2//EN""http://struts.apache.org/dtds/struts-config_l_2.dtd">
<!--Struts配置文件的根元素-->
<struts-config>
<!--在 form-beans元素里配置所有的ActionForm-->
<form-beans>
<!--配置登录所使用的Form-->
<form-beanname="loginForm"type="org.apache.struts.validator.
DynaValidatorForm">
<l一配置 loginForm的两个属性><form-property name="user"
type="java.lang.String" /><form-property name="pass"
type="java.lang.String" /></form-bean><!添加消息所用的Form-->
<form-bean name="addNewsForm" type="org.apache.struts.validator.
乌'naValidatorForm">
<!--配置 addNewsForm的三属性-->
<form-property name="title" type="java.lang.String"
/><form-property name="content" type="java.lang.String" />
<form-propertyname="categoryid"type="java.lang.String" />
</form-bean><l…添加消息评论所用的 Form-->
<form-bean name="addNewsReviewForm" type="org.apache.struts.
validator.乌'naValidatorForm">
<!--配置 addNewsReviewForm 的两个属性…〉
<form-property name="content" type="java.lang.String"
/><form-property name="newsld" type="java.lang.String"/>
</form-bean>
</form-bean/〉
<!--配置所有的Action映射--〉
<action-mappings>
<!--处理登录--〉
<action path="/processLogin"
name="loginForm"
scope="request"validate="true"
~nput="input">
<forward name="input" path="/index.jsp" /><forward
name="success" path="/listCate.do" />
<faction><!-登出系统--〉
<action path="/logout" scope="request"><forward
name="success" path="/index.jsp"/><faction>
<!--进入主页面--〉
<action path="/listCate" scope="request"><forward
name="success" path="/main.jsp"/><faction><!根据种类加载所有消息 --〉
<action path="/loadNewsByCategory" scope="request">
<forward name="failure" path="/listCate.do"/><forward
name="success" path="/category_view.jsp"/><faction><!添加消息 -->
<action path="/addNews"name="addNewsForm"scope=//request"
validate="true"
~nput="input">
<forward name="failure" path="/loadNewsByCategory.do"/>
<forward name="success" path="/loadNewsByCategory.do"/>
<faction>
<!--根据消息 id加载所有评论->
<actionpath="/loadNewsReviewByNews"scope="request">
<forward name="success" path="/news_view.jsp"/>
<faction>
<!--添加消息评论--〉
<action path="/addNewsReview"
name="addNewsReviewForm"
scope="request"
validate="true"
input="input">
<forward name="failure" path="/loadNewsReviewByNews.do"/>
<forward name="success" path="/loadNewsReviewByNews.do"/>
<faction>
<faction-mappings>
<!--配置控制属性-->
<controller inputForward="true"
processorClass="org.springframework.web.struts.DelegatingRequest
Processor"/><!配置国际化的消息资源-->
<message-resources parameter="resource"/>
<!-- 配置数据校验的框架--〉
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"value="/WEB-INF/validator-rules.刀口1 ,
/WEB-INF/validation.泪nl"/>
<set-property property="stopOnFirstError"value=町 true"/>
</plug-in><!-配置用于Spring整合的插件框架--〉
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/
daoContext.xml,
/WEB-INF/applicationContext.xml,
/WEB-INF/action-Servlet.xml"/> '
</plug-in>
</struts-config>

 

  这个配置文件与Struts 基本的配置文件并没有太多的不同,区别在于该配置文件的action 元素没有 class 属性,以及使用 DelegatingRequestProcessor 代替了系统默认的RequestProcessor。

  注意:虽然action元素没有确定class属性,但也允许指定class属性,只是不会有任何作用。

  Spring对 Action 的配置采用单独的文件配置action-Servlet.xml,该文件中配置了所有的 Actionbean。

  因为所有的Action都需要为其注入业务逻辑组件,所以此处采用继承简化了Actionbean的配置。具体的配置文件代码如下:

 

<?xml version="l.O" encoding="GBK"?>
<!-- Spring配置文件的文件头,包含DTD等信息--〉
<lDOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""
http://www.springframework.org/dtd/spring-beans.dtd">
<!--Spring配置文件的根元素>
<beans>
<!--配置 Action模板,用于被其他Action继承>
<bean id="actionTemplate" abstract="true"
singleton="false"><property name="mgr" ref="facadeManager"/></bean>
<!--处理登录--〉
<bean name="/processLogin" class="org.yeeku.action.LoginAction"
parent="actionTemplate"/>
<!--登出系统〉
<bean name="/logout"class="org.yeeku.action.Logout"/>
<'列出所有的消息分类--〉
<bean name="/listCate"class="org.yeeku.action.ListCate"
parent="actionTemplate"/>
<!-- 根据种类列出所有消息--><bean name="/loadNewsByCategory"
class="org.yeeku.action.LoadNewsByCategory"parent="actionTemplate"/>
<!添加消息--〉
<beanname="/addNews" class="org.yeeku.action.
AddNewsAction"parent="actionTemplate"/>
<!-- 根据消息查看所有的评论><bean name="/
loadNewsReviewByNews" class="org.yeeku.action.LoadReviews
ByNews"parent="actionTemplate"/><1-添加消息评论>
<bean name="/addNewsReview" class="org.yeeku.action.AddReviewAction"
parent="actionTemplate"/>
</beans>


  至此,已经基本完成了Struts与 Spring 的整合。当ActionServlet拦截到用户请求时,则调用 DelegatingRequestProcessor,该处理器将请求转发到Spring容器中的bean,由该bean负责调用业务逻辑组件处理用户请求,井将处理结果呈现给用户。

posted on 2012-12-06 19:37  月亮之城  阅读(1754)  评论(0编辑  收藏  举报