读书人

提掏出Action公共的部分BaseAction

发布时间: 2013-10-22 16:17:03 作者: rapoo

提取出Action公共的部分BaseAction
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。

读书人网 >编程

热点推荐