使用门面模式进一步地解耦Spring与Struts的整合

使用门面模式进一步地解耦SpringStruts的整合

 

首先自定义一个继承自Struts ActionBaseAction.java类,如下:

在这个代码中,只是简单地提供了一个insertUser(User user)的方法。

    下面是实现这个接口的类ForumFacadeImpl的实现代码:

import  org.flying_huang.common.persistence.dao.base.IUserDao;
import  org.flying_huang.persistence.entity.User;
import  org.flying_huang.service.facade.IForumFacade;
public   class  ForumFacade  implements  IForumFacade
{
    
private IUserDao userDAO;
    
public void insertUser(User user) {
        
this.userDAO.makePersistent(user);
        
    }

    
public void setUserDAO(IUserDao userDAO) {
        
this.userDAO = userDAO;
    }

}

这个类是IForumFacade接口的实现类,在这个类里面,拥有一个IUserDao的属性,并且提供一相应的set方法,这样,我们就可以使用Spring的依赖注入将注入相应DAO实现。在insertUser()方法的实现代码中,直接调用 IUserDao中的makePersistent()方法来实现User对象的持久化(这里我使用的是Hibernate持久层)

 

下面来看一下在 Spring 中的 Bean 的配置,如下:
< bean  id ="userDao"  class ="org.flying_huang.common.persistence.dao.hibernate.UserDaoHibernate"  autowire ="byType" />

首先配置一个userDaoBean,它的class属性指向实现IUserDao的实现类UserDaoHibernate,并且通过autowire来实现自动装配。

下面是配置ForumFacade:

< bean  id ="forum"  class ="org.flying_huang.service.facade.impl.ForumFacade" >
    
< property  name ="userDAO" >
        
< ref  bean ="userDao" />
    
</ property >
</ bean >

这里配置了一个id”forum”Bean,并且将userDao注入到了ForumFacade中。

在上面的BaseAction就可以通过getBean(“forum”)来获得ForumFacade的实例。

 

下面来看一下一个具体的Struts Action是如何写的,如下:

public   class  RegisterAction  extends  BaseAction  {

    @Override
    
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
        RegisterForm form 
= (RegisterForm) form;
        User user 
= new User();
        user.setUsername(form.getUsername());
        user.setPassword(form.getPassword());
        
//通过IForumFacade门面来获取我们需要的业务方法
        getForum().insertUser(user);
        mapping.findForward(
"success");
    }

}

可以看到,这个RegisterAction继承自我们自己的BaseAction,可以直接使用getForum().insertUser(user)方法来持久化User对象。

这样,在Struts的配置文件struts-config.xml中,就不需要使用Spring的代理类DelegatingActionProxy

Action委托给Spring进行管理,而在Spring的配置文件beans.xml中也并不用采用

<bean name=”/register”class=”org.sunxin.forum.web.struts.action.RegisterAction”>

的这种方式来管理相应的Action了。

import  javax.servlet.ServletContext;
import  org.apache.struts.action.Action;
import  org.apache.struts.action.ActionServlet;
import  org.springframework.web.context.WebApplicationContext;
import  org.springframework.web.context.support.WebApplicationContextUtils;
import  org.flying_huang.service.facade.IForumFacade;

/**
 * 用作Struts Action的基类,我们编写的Struts Action类都从BaseAction继承
 * 由此得到IForumFacade对象,从而访问服务层的业务方法。
 * 
@author  flying_huang
 *
 
*/
public   abstract   class  BaseAction  extends  Action
{
    
private  IForumFacade forum;

    
public  IForumFacade getForum()
    {
        
return  forum;
    }
    
    
/**
     * 从Spring上下文中得到IForumFacade对象。
     
*/
    @Override
    
public   void  setServlet(ActionServlet actionServlet)
    {
        
super .setServlet(actionServlet);
        
if  (actionServlet  !=   null )
        {
            ServletContext servletContext 
=  actionServlet.getServletContext();
            WebApplicationContext wac 
=  WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
            
this .forum  =  (IForumFacade) wac.getBean( " forum " );
        }
    }
}

这个BaseAction.java调用setServlet(ActionServlet actionServlet)方法将Spring的上下文环境附加入Struts中。这样的话,当我们的每一个具体的Action需要获取某一个服务方法的时候,只需要调用getForm()就可以了。

在上面的代码中,我们可以看到,还定义了一个IForumFacade接口(”I”开头,表示此类为一个接口类),下面看一下这个IForumFacade接口的代码:

 

import  org.flying_huang.persistence.entity.User;
public   interface  IForumFacade
{
    
public   void  insertUser(User user);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值