`
齐晓威_518
  • 浏览: 618146 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Spring与Struts的整合_使用ActionSupport代替Action

 
阅读更多

有一种方法可以用于Spring与Struts的整合:让Action在程序中手动获得ApplicationContext实例。在这种整合策略下,Struts的Action不接受IoC容器管理,Action的代码与Spring API部分耦合,造成代码污染。
这种策略也有其好处:代码的可读性非常强,Action的代码中显式调用业务逻辑组件,而无需等待容器注入。
Action中访问ApplicationContext有两种方法:
1.利用WebApplicationContextUtils工具类
2.利用ActionSupport支持类

WebApplicationContextUtils可以通过ServletContext获得Spring容器实例。ActionSupport类则提一个更简单的方法:getWebApplicationContext(),该方法用于获取ApplicationContext实例。
Spring扩展了Struts的标准Action类,Spring的Action在Struts的Action后加上Suppport,Spring的Action有如下:
1.ActionSupport。
2.DispatchActionSupport。
3.LookupDispatchActionSupport。
4.MappingDispatchActionSupport。

下面分别给出利用ActionSupport的示例代码:
新的业务控制器,继承Spring的ActionSupport类

public class LoginAction extends ActionSupport
{
//依然将ValidBean作为成员变量
private ValidBean vb;
//构造器,注意:不可在构造器中调用getWebApplicationContext()方法
public LoginAction(){}
//完成ValidBean的初始化
public ValidBean getVb(){
   return (ValidBean)getWebApplicationContext().getBean("vb");
}
    //必须重写该核心方法,该方法actionForm将表单的请求参数封装成值对象
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception
{
   //form由ActionServlet转发请求时创建,包装了所有的请求参数
   LoginForm loginForm = (LoginForm)form;
   //获取username请求参数
   String username = loginForm.getUsername();
   //获取pass请求参数
   String pass = loginForm.getPass();
   //下面作服务器端的数据校验
   String errMsg = "";
   if (username == null || username.equals("")){
    errMsg += "您的用户名丢失或没有输入,请重新输入";
   }else if(pass == null || pass.equals("")){
    errMsg += "您的密码丢失或没有输入,请重新输入";
   }else{//如果用户名和密码不为空,才调用业务组件
    if (getVb().valid(username,pass)){//vb是业务逻辑组件,通过上面的初始化方法获得
     return mapping.findForward("welcome");
    }else{
     errMsg = "您的用户名和密码不匹配";
    }
   }
   //判断是否生成了错误信息,
   if (errMsg != null && !errMsg.equals("")){
    //将错误信息保存在request里,则跳转到input对应的forward对象
    request.setAttribute("err" , errMsg);
    return mapping.findForward("input");
   }else{//如果没有错误信息,跳转到welcome对应的forward对象
    return mapping.findForward("welcome");
   }
  }
}

这种整合策略下,表现层的控制器组件不再接受IoC容器管理。因此没有了控制器context,应将原有的action-servlet.xml文件删除,并修改plug-in元素,不要加载该文件。还要修改action配置,将action配置的type元素修改成实际的处理类。这种整合策略也有个好处:代码可读性更强,对传统Struts应用开发的改变很小,容易使用。
将该Action部署在struts-config.xml中,Struts将负责创建该Action。struts-config.xml文件的源代码如下:

<!-- XML文件版本,编码集-->
<?xml version="1.0" encoding="gb2312"?>
<!-- struts配置文件的文件头,包括dtd等信息-->
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<!-- struts配置文件的根元素-->
<struts-config>
<!-- 配置formbean,所有的formbean都放在form-beans元素里定义-->
<form-beans>
   <!-- 定义了一个formbean,确定formbean名和实现类-->
   <form-bean name="loginForm" type="lee.LoginForm"/>
</form-beans>
<!-- 定义action部分,所有的action都放在action-mapping元素里定义-->
<action-mappings>
   <!-- 这里只定义了一个action。action的类型为ActionSuport的子类 -->
   <action path="/login" type="type="lee.LoginAction" name="loginForm" scope="request" validate="true" input="/login.jsp" >
    <!-- 定义action内的两个局部forward元素-->
    <forward name="input" path="/login.jsp"/>
    <forward name="welcome" path="/welcome.html"/>
   </action>
</action-mappings>
<!-- 加载国际化的资源包-->
<message-resources parameter="mess"/>
<!--- 装载验证的资源文件-->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
   <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
   <set-property property="stopOnFirstError" value="true"/>
</plug-in>
</struts-config>

此时,Spring无需使用配置Action的配置文件,这种配置方式非常简单。只需要业务逻辑组件的配置文件,业务逻辑组件的配置文件如下:

<?xml version="1.0" encoding="gb2312"?>
<!-- 指定Spring 配置文件的dtd>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- spring配置文件的根元素 -->
<beans>
<!-- 配置ValidBean实例-->
<bean id="vb" class="lee.ValidBeanImpl"/>
</beans>

该配置文件中的业务逻辑组件由于Spring容器负责实现,而ActionSupport能够先定位Spring容器,然后获得容器的业务逻辑组件。

这种整合策略的执行效果与前面两种整合策略的执行效果完全相同。
从代码中分析,在这种整合策略下,业务控制器再次退回到Struts起初的设计:仅由struts-config.xml中Action充当,而避免了像DelegatingActionProxy整合策略的性能低下,因为可以只需要创建实际的Action实例。
这种整合策略的代价是代码污染。

还有一种如下所示 ,则需要Struts的Action接受IoC容器管理

DispatchAction和MappingDispatchAction区别  

2009-08-01 10:53:43|  分类: 0904重听笔记 |  标签: |举报 |字号 订阅

 
 

DispatchAction和MappingDispatchAction的区别
DispatchAction是MappingDispatchAction的父类,

用同一表单提交到同一个action而需要两个不同方法业务做处理的解决方式说明两个Action的不同

DispatchAction:
一个类继承DispatchAction后,写自定义方法名(按照execute方法格式),分别处理不同的业务逻辑
public class LoginAction extends DispatchAction{

 public ActionForward add(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){}
 
 public ActionForward modify(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){}
}

 

在配置文件中写法如下,只需要写一个action标签:
<action path="/login" type="org.whatisjava.LoginAction" name="loginForm" parameter="method">
<forward......./>
</action>
注意parameter="method" 该配置指定要传来的表单需要一个名为method的属性来指定调用org.whatisjava.LoginAction类中的何种方法
表单代码如下:
<html:form action="login.do">
<table>
<tr>
 <th><bean:message key="username"/></th> <!--bean:message读资源文件里指定的key-->
 <th><html:text property="username" size="15"></td>
</tr>
<tr>
 <th><bean:message key="pass"/></th> <!--bean:message读资源文件里指定的key-->
 <th><html:text property="pass" size="15"></td>
</tr>
<tr>
 <td>
<!--注意这里隐藏域 为了给action传一个parameter,配置文件中的parameter指定为这里的name为"method"-->
<!--两个提交按钮不同的提交method.value的值分别为modify和add,是action中的方法名-->
  <input type="hiden" name="method" value="add"/>
  <input type="submit" value='<bean:message key="button.add"/>' onClick="method.value='add'">
  <input type="submit" value='<bean:message key="button.modify"/>' onClick="method.value='modify'">
 </td>
</tr>


MappingDispatchAction:
一个类继承MappingDispatchAction
public class LoginAction extends MappingDispatchAction{

 public ActionForward add(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){}
 
 public ActionForward modify(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){}
}


配置文件为两个方法配置不同的<action>,有几个方法就写几个action标签
<!--这里的parameter指定的为action类中的自定义方法的名字-->
<!--这里path为两个不同的path,而DispatchAction只需要一个path-->
<action path="/add" type="org.whatisjava.LoginAction" name="loginForm" parameter="add">
<forward......./>
</action>
<action path="/modify" type="org.whatisjava.LoginAction" name="loginForm" parameter="modify">
<forward......./>
</action>

表单的代码也有所不同
第一个submit按钮的onClick="document.loginForm.action='add.do'"
第二个submit按钮的onClick="document.loginForm.action='modify.do'"


DispatchAction需要表单传不同的参数来区别不同的业务方法
MappingDispatchAction需要两个不同的action标签指定不同的parameter来找对应方法,提交的path也不一样

自己写一个DispatchAction模仿struts提供的,用到反射技术
public class DispatchAction extends Action {
 private Map map = Collections.synchronizedMap(new HashMap());

 @Override
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  String param = mapping.getParameter();
  String methodName = request.getParameter(param);

  Method method = (Method) map.get(methodName);
  if (method == null) {
   Class clazz = this.getClass();
   method = clazz.getMethod(methodName, new Class[] {
     ActionMapping.class, ActionForm.class,
     HttpServletRequest.class, HttpServletResponse.class });
   map.put(methodName, method);
  }

  ActionForward forward = (ActionForward) method.invoke(this,
    new Object[] { mapping, form, request, response });

  return forward;
 }

分享到:
评论

相关推荐

    spring_struts2_mybatis_注解的小实例

    在本项目"spring_struts2_mybatis_注解的小实例"中,我们将深入探讨如何使用SSM(Spring、Struts2、MyBatis)框架来实现一个基础的增删改查(CRUD)功能。SSM是Java Web开发中常用的三大组件,它们各自负责不同的...

    Struts2_Spring_Example.zip_spring struts2_struts2-examp

    3. **Action 类**:这些类继承自 `ActionSupport` 或自定义的 Struts2 动作类,并且被声明为 Spring Bean。Struts2 通过 ActionProxy 将请求转发到 Spring 容器来创建动作类实例。 4. **Service 类**:这些类通常...

    Spring + struts 整合的三种主要方式

    本文将详细介绍Spring与Struts整合的三种主要方式:使用Spring的`ActionSupport`、使用Spring的`DelegatingRequestProcessor`类以及全权委托方式。 #### 1. 使用Spring的`ActionSupport` 使用Spring的`...

    Spring和Struts整合---继承ActionSupport的方法

    在Spring与Struts整合时,我们的自定义Action通常会继承`ActionSupport`,这样可以利用它的便利功能: 1. **execute()方法**: 这是Action的核心方法,用于处理HTTP请求并返回一个表示结果的字符串,例如"success"或...

    使用Spring , ActionSupport ,struts1整合实例

    通过这个简单的整合实例,我们可以看到Spring和Struts1结合使用的优势:Spring负责管理对象生命周期和提供业务逻辑,而Struts1则专注于处理用户请求和展现逻辑。这种分工合作使得代码结构更清晰,降低了耦合度,有利...

    Spring与Struts2整合

    下面将详细介绍Spring与Struts2整合的相关知识点。 **一、整合背景** Spring和Struts2的整合主要基于两者的互补性。Spring提供了一种全面的业务层和持久层管理方案,而Struts2则专注于视图和控制层。整合这两者可以...

    整合Spring与Struts的几种方法

    2. **使用DelegatingRequestProcessor替换RequestProcessor**:在`struts-config.xml`中,将Struts的RequestProcessor替换为Spring的`DelegatingRequestProcessor`,并在Spring配置文件中定义与Struts `&lt;action-...

    Struts2_Spring与Hibernate整合应用_学生成绩管理系统

    通过本次实验,不仅能够掌握Struts2、Spring与Hibernate三个框架的基本使用方法,还能够深入理解如何将这些框架有效整合起来,构建出稳定可靠的应用系统。此外,还能学习到如何合理地组织代码结构,以及如何有效地...

    Spring整合Struts

    ### Spring与Struts的整合:实现灵活的企业级应用开发 在企业级应用开发领域,Spring框架和Struts框架都是极具影响力的技术。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,提供了良好的环境管理和...

    Spring 和struts 整合的三种方式

    总结来说,Spring与Struts的整合主要通过ActionSupport、DelegatingRequestProcessor和全权委托这三种方式实现,每种方式都有其适用场景和优缺点。选择哪种方式取决于项目需求,如对事务管理的需求、对依赖注入的...

    Spring 和 struts 整合的三种方式

    这种方式是通过让Struts的Action类继承Spring的`ActionSupport`类,使Action类能够访问Spring的ApplicationContext。首先,在`struts-config.xml`中配置`ContextLoaderPlugIn`插件,加载Spring的上下文配置文件,...

    Spring与Struts整合3种方式实例

    这种方法是让 Struts 的 Action 类不再继承自 Struts 的 `Action` 类,而是继承 Spring 提供的 `ActionSupport` 类。这样,Action 类可以访问 Spring 容器,但同时也意味着 Action 类与 Spring 有较高的耦合度,且 ...

    [有源代码]spring_struts_hibernate整合方案

    7. **示例代码**:压缩包中的文档和源代码示例可能涵盖了不同的整合方式,如使用Struts2的ActionSupport类集成Spring,通过Spring的AOP进行异常处理,以及如何在Struts2的拦截器中利用Spring的Service层等。...

    spring和struts整合的三种方案

    然而,使用 `ActionSupport` 类(方法一)会使得 Struts Action 与 Spring 紧密耦合,因为它需要 Action 直接从 Spring 容器获取依赖,这违背了依赖注入的原则。相比之下,使用 `DelegatingRequestProcessor` 或 `...

    使用Spring 的ActionSupport 类整合 Struts,Hibernate实例

    3. **配置Struts2**:创建Struts2的配置文件,如`struts.xml`,定义Action及其对应的处理方法,Action类应继承自Spring的ActionSupport。别忘了配置Spring插件,让Struts2知道如何与Spring集成。 4. **配置...

    spring 和 struts整合

    将Spring与Struts整合可以充分利用两者的优点,实现松耦合和高效的业务逻辑处理。 在整合Spring和Struts的过程中,主要涉及以下几个关键点: 1. **配置Struts Action**: 在`struts-config.xml`中,我们需要定义...

    Spring_Struts_Hibernate整合教程(作者:陈文光)

    - **技巧1**:使用Spring的ActionSupport,通过继承自Spring的ActionSupport类来增强Struts Action的功能。 - **技巧2**:覆盖RequestProcessor,通过重写Struts的RequestProcessor来改变请求处理流程。 - **技巧3**...

    Spring与Hibernate整合,Spring与Struts2整合源代码

    在Spring与Struts2整合时,主要目的是将Spring的依赖注入和事务管理等能力引入到Struts2的控制器层,以提高代码的可测试性和模块化。以下是一个简单的整合步骤: 1. 创建Web项目,并添加Struts2的必要库文件,包括...

    struts2_jar

    在`struts.xml`中,你可以声明Action类、指定URL与Action的映射关系,以及设置结果页面。 3. **拦截器(Interceptors)**:Struts2的拦截器机制使得开发者可以实现预处理和后处理逻辑,如日志记录、权限验证、事务...

Global site tag (gtag.js) - Google Analytics