javaEE SSH框架 BaseAction的抽取及测试

由于在真实的开发中,我们不可能只写一个Action,而是写很多Action,但是由于每一个Action我们都需要写下面的代码,这样就产生了大量的冗余代码,且代码的复用性也不好,于是我们就可以想办法把这些公共的代码抽取出来组成一个类,然后然其他类继承它,这样不是能更好的提高代码的复用性了吗?

下面我们开始抽取一个基类

package com.bos.web.action.base;

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

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/*
  控制层Action基类
*/
@Controller
public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {

	// 模型对象
	private T model;

	@Override
	public T getModel() {

		return model;
	}

	// 在构造方法中动态获取实体对象,通过反射创建模型对象
	public BaseAction() {
		
		ParameterizedType pt = (ParameterizedType)this. getClass().getGenericSuperclass();
		// 获取BaseAction声明的泛型数组
		Type[] arr = pt.getActualTypeArguments();
		
		Class<T> entityClass=(Class<T>) arr[0];
		//通过反射创建model对象
		try {
			model= entityClass.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

}

 在这里还要特别强调一点就是,如果我们在测试的时候添加了红框中的注解,那么是没有办法测试的

1、scope = singlton 单例模式,对象在容器中全局唯一,在IOC容器初始化的时候该对象就会被创建。

2、scope = prototype 多例模式,在每一次调用getBean的时候IOC容器才会创建该对象的实体,并且每次创建都是不同的对象。

测试代码 (抽取后当我们创建新的Action时是不是少写了很多代码呢)

package com.bos.web.action.base;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.bos.bean.base.Area;

@Controller
//@Scope(value="prototype")
public class AreaAction extends BaseAction<Area> {

}

 测试结果

猜你喜欢

转载自blog.csdn.net/luo609630199/article/details/81083041
今日推荐