`

spring与struts结合

阅读更多

为了在Struts中加载Spring context,需要在struts-config.xml文件中加入如下部分:

Xml代码 复制代码
  1. <struts-config>  
  2. <plug-in  
  3.          className="org.springframework.web.struts.ContextLoaderPlugIn">  
  4.      <set-property property="contextConfigLocation"  
  5.          value="/WEB-INF/applicationContext.xml" />  
  6. </plug-in>  
  7. </struts-config>  
<struts-config>
<plug-in
         className="org.springframework.web.struts.ContextLoaderPlugIn">
     <set-property property="contextConfigLocation"
         value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>

 

第一种方法:

       通过Struts的plug-in在Struts和Spring之间提供了良好的结合点。通过plug-in我们实现了Spring context的加载,不过仅仅加载Spring context并没有什么实际的意义,还应该经过配置将Struts的Action交给Spring容器进行管理。

Xml代码 复制代码
  1. <action-mappings>  
  2. <action path="/login"  
  3.              type="org.springframework.web.struts.DelegatingActionProxy"  
  4.              name="loginForm">  
  5.       <forward name="success" path="/main.jsp" />  
  6.       <forward name="failure" path="/login.jsp" />  
  7. </action>  
  8. </action-mappings>  
<action-mappings>
<action path="/login"
             type="org.springframework.web.struts.DelegatingActionProxy"
             name="loginForm">
      <forward name="success" path="/main.jsp" />
      <forward name="failure" path="/login.jsp" />
</action>
</action-mappings>

        在form bean这个节点上与传统的Struts配置没有什么区别,而在Action上面则发生了变化。在传统的action节点上type属性写入action类的完整类名,而和Spring结合后在这点上是使用了Spring提供的DelegatingActionProxy作为action的type属性,DelegatingActionProxy同样是org.apache.struts.action.Action的一个子类,它将把调用请求转交给真正的Action实现。通过这样的方式,Spring获得了Action实例的管理权,它将对Action进行调度,并为Struts提供所需的Action实例。这样,就可以将Action看作是Spring的一个bean,它就可以享受Spring的所有服务,如依赖注入、实例管理、事务管理等。
       在applicationContext.xml中相应的配置如下的节点:

Xml代码 复制代码
  1. <beans>  
  2. .......   
  3.     <bean name="/login" singleton="false">  
  4.         <property name="userDAO">  
  5.            <ref bean="userDAOProxy" />  
  6.         </property>  
  7.     </bean>  
  8. </beans>  
<beans>
.......
    <bean name="/login" singleton="false">
        <property name="userDAO">
           <ref bean="userDAOProxy" />
        </property>
    </bean>
</beans>


       最后这个bean的配置是关键,这个名为“/login”的bean与Struts中的

Xml代码 复制代码
  1. <action path="/login" ……>  
  2. ……   
  3. </action>  
<action path="/login" ……>
……
</action>

 

       节点相对应,这样,Spring Bean Name与Struts Action Path相关联,当Struts加载对应的Action时,DelegatingActionProxy就根据传入的path属性,在Spring Context寻找对应bean,并将其实例返回给Struts。与此同时,还可以看到,"/login" bean 中包含了一个userDAO 引用,Spring 在运行期将根据配置为其提供userDAO 实例,以及围绕userDAO 的事务管理服务。这样一来,对于Struts 开发而言,我们既可以延续Struts 的开发流程,也可以享受Spring 提供的事务管理服务。而bean 的另外一个属性singleton="false",指明了Action 的实例获取方式为每次重新创建。这也解决了Struts中令人诟病的线程安全问题。

 

第二种方法:
       为了在 struts-config.xml 文件中配置 DelegatingRequestProcessor,你需要重载 <controller> 元素的 “processorClass” 属性。 下面的几行应该放在 <action-mapping> 元素的后面。

Xml代码 复制代码
  1. <controller>  
  2. <set-property property="processorClass"value="http://www.zhmy.com/org.springframework.web.struts.DelegatingRequestProcessor"/>  
  3. </controller>         
<controller>
<set-property property="processorClass"value="http://www.zhmy.com/org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>

 

增加这些设置之后,不管你查询任何类型的 Action,Sping都自动在它的context配置文件中寻找。 实际上,你甚至不需要指定类型。下面两个代码片断都可以工作:

<action path="/user" type="com.whatever.struts.UserAction"/><action path="/user"/>      

如果你使用 Struts 的 modules 特性,你的 bean 命名必须含有 module 的前缀。 举个例子,如果一个 Action 的定义为 <action path="/user"/>,而且它的 module 前缀为“admin”, 那么它应该对应名为 <bean name="/admin/user"/> 的 bean。

       如果你在 Struts 应用中使用了 Tiles,你需要配置 <controller> 为 DelegatingTilesRequestProcessor。

       如果第二种方法不行,再用第一种方法。至此,SS组合已经将Struts MVC以及Spring中的Bean管理、事务管理融为一体。如果算上userDAO 中的Hibernate 部分,我们就获得了一个全面、成熟、高效、自顶而下的Web 开发框架。

一个简单示例:

下面由我来演示spring + struts的最简单的示例,没有数据库,高手飘过,呵呵。

我用的是myeclipse3.2。

      首先建立web工程ssh,加入spring框架,加入struts框架,

   增加struts的 action,form,jsp组合,命名为login.

        struts-config.xml中action为

     <action
       attribute="loginForm"
       input="/login.jsp"
       name="loginForm"
       path="/login"
       scope="request"
      type="org.springframework.web.struts.DelegatingActionProxy" />

注意 type类型由spring来代理,当我们访问"/login"的时候,struts会跟据type类型来查找Spring 环境中的动作,为些,我们还要加载spring环境,可以在struts中加入一个plugin,同样在struts-config.xml中加入

   <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
     <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml" />
   </plug-in>

      这时我们就在struts中加载了spring.

下面就是要把struts 动作注册为spring的bean.

      在beans.xml中加入

<bean name="/login"
   class="com.hdlb.struts.action.LoginAction">
</bean>

这样,我们就能访问"/login"这个动作了。只不过它由spring代理了。

下面写action

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
   LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
   if("test".equals(loginForm.getName())&&("test").equals(loginForm.getPwd())){
    System.out.println("登陆成功");
   }else{
    System.out.println("登陆失败");
   }
   return null;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics