使用门面模式进一步地解耦Spring与Struts的整合
首先自定义一个继承自Struts Action的BaseAction.java类,如下:
在这个代码中,只是简单地提供了一个insertUser(User user)的方法。
下面是实现这个接口的类ForumFacadeImpl的实现代码:
import org.rainlife.common.persistence.dao.base.IUserDao;
import org.rainlife.persistence.entity.User;
import org.rainlife.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.rainlife.common.persistence.dao.hibernate.UserDaoHibernate" autowire="byType"/>
首先配置一个userDao的Bean,它的class属性指向实现IUserDao的实现类UserDaoHibernate,并且通过autowire来实现自动装配。
下面是配置ForumFacade:

<bean id="forum" class="org.rainlife.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.rainlife.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.rainlife.service.facade.IForumFacade;
/**
* 用作Struts Action的基类,我们编写的Struts Action类都从BaseAction继承
* 由此得到IForumFacade对象,从而访问服务层的业务方法。
* @author rainlife
*
*/
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.rainlife.persistence.entity.User;
public interface IForumFacade
{
public void insertUser(User user);
}
分享到:
相关推荐
在Spring框架的核心特性之一就是依赖注入(Dependency Injection, DI),它是一种设计模式,用于实现对象之间的解耦。依赖注入有三种方式:构造器注入、setter方法注入和接口注入。控制反转(Inversion of Control, ...
- **使用SLF4J**:SLF4J(Simple Logging Facade for Java)是一个日志门面,可以在运行时桥接到不同的日志实现。 - **使用Log4J**:Log4J是一个广泛使用的日志框架,Spring支持直接使用Log4J进行日志记录。 ### ...
- **业务层**:采用了门面模式(Façade Pattern),提供了一组对外接口,这些接口调用底层的服务组件完成具体的业务逻辑,使得控制层与持久层解耦。 - **持久层**:使用Hibernate进行数据持久化操作,提供了基本...
- 使用了抽象工厂模式、装饰者模式、代理模式和门面模式等设计模式,结合Spring的AOP思想处理日志和异常。 - 使用Dom4j解析XML,Log4j进行日志管理。 - Web层采用Struts框架,配合JSTL元素和AJAX技术。 - 控制...
MVC(Model-View-Controller)是一种广泛应用于Web开发的分层设计模式,它的核心思想是将应用的业务逻辑、数据处理和用户界面分离,以实现更好的组织和解耦。以下是对MVC各层的详细说明: 1. **模型层(Model)** ...