当前位置:编程学习 > 网站相关 >>

提取出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。
  
 
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,