使用门面模式进一步地解耦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 提供了管理业务对象的一致方法,并鼓励注入对接口编程而不是对类编程的良好习惯,使我们的产品在最大程度上解耦。Hibernate 是用来持久化数据的,提供了完全面向对象的数据库操作。Hibernate对JDBC进行了非常...
主要介绍了如何基于Spring使用工厂模式实现程序解耦,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
此代码只为显示spring的思想怎么产生,为什么要解耦,解耦到底是哪好?
对感应电动机的解耦控制及矢量控制的解耦性质进行了研究.从感应电动机变频调速系统 的非线性模型出发,分别利用非线性控制的状态反馈线性化方法和转子磁场定向方法对系统进行 了讨论.研究结果表明,感应电动机的矢量...
3 解耦控制系统的理论分析 3 3.1 双变量耦合系统 3 3.2 常见解耦方法简介 3 3.3 解耦补偿装置的设计及理论分析 4 4 仿真研究 7 4.1 双变量耦合系统的仿真 7 4.2 前馈补偿解耦控制的仿真 8 4.3 反馈补偿解耦控制的...
本程序用于解耦控制的控制器设计以及函数计算
技术: 1. spring事件驱动(ApplicationEventPublisher) 2. 策略模式处理事件 目的: 1. 通过event,代码逻辑异步处理 2. 通过策略模式,构建具体监听实现 3. 解耦 4. 容错(降低代码块错误风险)
该文档非常详细的介绍了怎样使用低代码平台进行数字化解耦
介绍了EventBus的使用,包含四种回调函数的使用,对于实现组件的解耦很有帮助
基于稀疏增强动态解耦的电力系统振荡模式与模态辨识方法.pdf
书中包含了一些开发良好设计和解耦的Web 应用程序的最佳实践,介绍了Spring 框架中的Spring MVC 和Spring Web Flow,以及着重介绍利用Spring 框架和Spring MVC 编写Web 应用程序的最佳方法。《深入解析Spring MVCgn ...
方便整合Struts、MyBatis、Hibernate、JPA等其他框架。 强化注解的使用,在控制器、Service、Dao都可以使用注解,方便灵活。 Spring MVC的工作流程如下: 用户通过视图层发送请求到服务器。 在服务器中请求被...
对于MIMO系统进行PID解耦控制,并利用响应信号观察解耦效果。
Guice与Spring框架都是依赖注入(Dependency Injection,DI)容器,它们的主要作用是将对象之间的依赖关系解耦,使得系统更加灵活、可维护和可扩展。下面我们来讨论Guice和Spring框架的区别。 Guice框架 Guice是...
LCL型并网逆变器的解耦控制与优化设计.pdf
基于matlab的解耦控制simulink仿真
方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring...Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
采用隶属函数型神经网与模糊控制融合的解耦方法(DMFFCNN)方法实现解耦控制。
它们只支持单一的继承,或者多级继承,这一变化最大的影响,我觉得是大大的降低了编程的难度,因为没有了C++的多级多脉继承,所以接口出现了,它支持多重继承,当然它的主要目的是为了实现解耦,将定义与实现分离。...
实验中使用 MATLAB/SIMULINK 软件对解耦控制系统进行仿真分析,并对几个实际应用系统进行解耦分析与设计。 一、实验目的 1. 进一步学习解耦控制系统的基本原理; 2. 利用 MATLAB/SIMULINK 有效进行解耦控制系统的...