BaseAction
在做项目的时候,特别是在控制层和DAO层的时候,有没有发现很多的时候,我们的Action中有很多相同的代码,比如说:Action中的最基本增删改查,以及在显示数据的时候,要用到的分页显示,几乎涉及到很多数据的时候,我们都要写出分页显示的效果(一般写到DAO中),那么这里就有很多重复的代码。于是,就可以这么做。
1,在Action中我们提取出来公共的部分。该类要抽象,它是给子类用来继承的。在这里我们还需要实现modelDriven,为什么呢,在struts中有个易做图就是modelDiriven。我们实现modelDriven之后,在URL封装的数据就可以直接被model给封装在里面了。
public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{
}
这里为什么要继承ActionSupport呢,如果不继承的话,单个的BsetAction功能单一,如果没有继承的话,他会执行里面execute的方法。
在这里面,我们在调用Service里面方法的时候,我喜欢采用注解的方式,也可以用动态代理的方式,在spring配置文件中,配置通知和目标对象。我这里用注解来说明
比如:
@Resource
protected UserService userService;
在后面我就省略注解方式注入Service,因为就是上面的那种固定模式。
在BaseAction的构造函数,我们应该做些什么,T ,泛型,我们应该通过它获取到Model,以及的它类。
protected T model;
protected Class<T> modelClass();
public BaseAction(){
ParameterizedType pt =( ParameterizedType) this.class().getGenericSuperclass();
modelClass = (Class) pt.getActualTypeArguments()[0];
}
public T getModel(){
try{
if(model ==null){
model = modelClass.newInstance();
}
return model;
}cathc(Exception e){
throw new RuntimeException(e);
}
}
在这里,我说明一下,this.class(),其实是这里指的对象并不是BaseAction,因为是abstract是抽象类,不能有对象,而是指的是子类对象。
在action中有一个公共的代码,那就是获取当前用户,在操纵的时候,我们时不时要判断用户是否登陆,用户是否有权限等等。
//获取当前登陆的用户,这里很简单,我们只需要通过actionContext获取,至于什么是actionContext,我在struts详解中有说明
protected User getCurrentUser(){
return (User) ActionContext.getActionContext().getSession().get("user");
}
在一般的项目中,还有一些很普通的功能,比如说:文件上传下载。这里也可以写到BaseAction中
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd");
protected String upLoad(File upload){
String basePath = ServletActionContext.getServletContext.getRealPath("/WEB-INF/upload_files/");
String subPath = sdf.format(new Date());
//如果文件夹不存在就创建
File dir = new File(basePath + subPath);
if(!dir.exists){
dir.mkdirs();
}
String path = basepath + subPath + UUID.randomUUID().toString(); //使用UUID做为文件名,已解决重名的问题
File destFile = new File(path);
upload .renameTo(destFile);
}
这里为什么要建立分层建立文件夹,以及使用UUID做为文件名呢,因为,如果同一文件夹里面有多文件,打开效率会大大降低,用UUID做为文件名是解决重命名的问题,因为如果文件存在,renameTo方法就会失败,返回false。