struts2 参数和action 分离 . 第四种 参数传递方式

传统的struts传参有三种

  • 1. 通过属性传参
  • 2. 通过域模型传参
  • 3. 通过模型驱动传参数

以上这三种各有利弊,总之一句话概括,无法完全的实现业务和参数分离.总得在自己的Action中定义相关的get set 方法.

希望能实现参数传递跟业务action完全分离.故封装了模型驱动参数获取方式.

 

封装后的BaseActionSupport 如下:

 

package com.myfeike.struts.base;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * Created by izerui.com on 14-4-30.
 *
 * Action 基类,封装了泛型参数get set 方法
 * 注入spring applicationContext 对象
 *
 * @param <T> 参数类
 */
public class BaseActionSupport<T> extends ActionSupport implements ModelDriven<T>,ApplicationContextAware{

    /**
     * 声明的参数类
     * <br/><em>不建议名称修改为param
     * 可能会跟页面param对象冲突,导致通过struts取值机制冲突</em>
     */
    protected T formParam;
    /**
     * spring 上下文
     */
    protected ApplicationContext applicationContext;

    /**
     * 构造参数对象
     */
    public BaseActionSupport() {
        if(formParam==null){
            try {
                formParam = getParameterizedTypeClass().newInstance();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }


    private Class<T> getParameterizedTypeClass(){
        // 获取泛型类型
        Type type = getClass().getGenericSuperclass();
        Type[] trueType = ((ParameterizedType) type).getActualTypeArguments();
        return (Class<T>) trueType[0];
    }

    public T getFormParam() {
        return formParam;
    }

    public void setFormParam(T formParam) {
        this.formParam = formParam;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 将泛型参数类映射为Struts的默认参数包装对象
     */
    @Override
    public T getModel() {
        return formParam;
    }
}

  

如此一来,action 还可以这样写:

-Action

public class YourAction extends BaseActionSupport<YourParam> {

    //TODO your code ....
    //在需要获取request参数的地方只需要通过 formParam对象get你需要的参数即可

}
 

-param class 就是一个简单的po类.随你写喽!

public class yourParam{
    // 各种 param fields
    // 各种 get set
}
 

OK 所有的action请求,都会自动的封装到你定义的param类中. 前提这个类要有不带参数的构造方法,要有你希望获取的参数的get set 方法.

其实就是把action中的各种 get set 放到了一个统一的param类中.

一个action 一个 param类. 是不是很清晰.业务跟参数代码分离了. struts action 是不是更易读了.

附: 顺带将 BaseActionSupport 放入了一个applicationContext

这样所有的action 都可以直接使用applicationContext 对象,如果您不喜欢可以自行去掉.

步骤如下:

  • 1. 删除 protected ApplicationContext applicationContext;
  • 2. 删除 applicationContext 的 set方法
  • 3. 去掉实现的接口 ApplicationContextAware

不过建议留着吧.

  • 当你用上 spring 的event 的时候,你会需要它.
  • 当你需要动态的根据className 或者 classType 获取bean 的时候,你会需要它.

项目地址:

           https://github.com/izerui/struts2-advanced-modelDriven

上张图:

猜你喜欢

转载自jhaij.iteye.com/blog/2059136