首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

提掏出Action公共的部分BaseAction

2013-10-22 
提取出Action公共的部分BaseActionBaseAction在做项目的时候,特别是在控制层和DAO层的时候,有没有发现很多

提取出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。  

         

热点排行