hxtao001 2013-04-17 19:53
浏览 277
已采纳

关于代码如何组织的疑惑

刚入行,接触的项目不多,第一次接触的一个SSH项目是这样分层的
抽象一个Dao接口,这个接口包含对象基本增删改查,然后提供一个Dao实现(比如叫Support),至此Dao层结束,然后业务层接口继承Dao接口,业务层继承Support。然后每一个模块一个Action.这样做一个好处就是直接通用一个Dao,不用每个业务类都写一个Dao。但坏处就是因为涉及到泛型,每个个数据表都要对应一个业务对象。如果数据库中有很多的表,就会有很多业务接口业务实现。
具体结构看贴图:

另一个SSH项目是这样分的:
每个模块各一个增删改查Dao加Dao实现,Dao之前互相交错。

问题:个人觉得这两种设计都不好,那么该如何设计,还有,这两个项目中的业务层代码跟Dao层代码感觉都差不多,比如有一个业务层的代码是这样的:
public void deleteIp(Filterip ip){

    deleteDao.deleteIp(ip);
}

public void deleteDev(Devinfo devinfo){

    deleteDao.deleteDev(devinfo);
}

public void deleteBackup(Backup bp){

    deleteDao.deleteBackup(bp);
}

public void deleteDevdetail(Devdetail devdetail){

    deleteDao.deleteDevdetail(devdetail);
}

那这样分逻辑层有什么意义呢,然后最繁重的是action,判断都写在Action方法里面,导致一个方法少则一百多行,多则几百行,一个类上千行。

  • 写回答

4条回答

  • Dead_Knight 2013-04-17 21:10
    关注

    [code="java"]
    public String importFile() {
    // TODO Auto-generated method stub

    this.flag="import";
    //从此处开始属于预先校验部分。
    //这部分校验的全部放到一个StrutsUtils这样的工具类的validateFile方法中。统一返回String,如果为null,则验证成功,不为null,则验证失败,msg为失败信息
    if (myFile == null) {
    this.msg="导入文件名获取失败!";
    return SUCCESS;
    }

    if (fileName == null || "".equals(fileName)) {
    this.msg="导入文件名获取失败!";
    return SUCCESS;
    }
    String[] tempfn=fileName.split("_");
    SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
    boolean isImport=true;
    try {
    sdf.parse(tempfn[0]);
    } catch (ParseException e) {
    // TODO Auto-generated catch block
    isImport=false;
    }
    if(!isImport){
    this.msg="文件名不符合命名规则,请选择正确的备份文件导入!";
    return SUCCESS;
    }
    //从此处结束属于预先校验部分

    //下面文件处理部分,放到文件处理帮助类中,也可放到StrutsUtils工具类中。
    String localfilePath = ServletActionContext.getServletContext()
    .getRealPath("/backup/files");

    File imageFile = new File(localfilePath);

    if (!imageFile.exists()) {
    imageFile.mkdirs();
    }

    localfilePath += "/" + fileName;

    imageFile = new File(localfilePath);

    HttpServletRequest request = ServletActionContext.getRequest();
    HttpSession session = request.getSession();

    Object keyname = session.getAttribute("keyname");
    Object keyright = session.getAttribute("keyright");

    int right = 0;
    String pcname="";

    if (keyright != null) {
    right=Integer.valueOf(keyright.toString());
    }
    if(keyname!=null){
    pcname=keyname.toString();
    }
    //这里需要业务层处理,直接在action调用
    Backup bk=auditlogService.findBackupByName(fileName);
    if (!imageFile.exists()) {// 如果文件存在不覆盖,直接返回导入成功

    boolean isCopy=auditlogService.importFile(pcname, request.getRemoteAddr(), right, pcname, myFile, imageFile, request.getLocalAddr());

    if(!isCopy){
    this.msg="导入失败!";
    }else{
    this.msg="导入完成!";
    }

    }else{
    if(bk==null){//如果文件存在,数据库没有备份记录
    //下面若干语句应该放在业务层处理
    Backup bkis = new Backup();
    bkis.setName(fileName);
    bkis.setStatus("0");
    bkis.setAuthority(right);
    String createtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    .format(new Date());
    bkis.setCreatedate(createtime);

    auditlogService.backup(bkis);
    }
    Auditlog a = new Auditlog();
    a.setSn(sn);
    a.setInternettype(0);
    a.setTypeid(right);
    Auditlogtype auditlogtype = auditlogService.findTypeById(right);
    if (auditlogtype != null) {
    a.setTypename(auditlogtype.getName());
    }
    a.setCreatedate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    a.setAddress(request.getRemoteAddr());
    a.setSubname(pcname);
    a.setObjname(request.getLocalAddr());
    a.setActionid(9);
    a.setActionname("导入");
    a.setLevelid(1);
    a.setLevelname("一般");
    a.setExpandrecord("导入文件:" + fileName+" 文件已存在,不能重复导入!");
    a.setResult(1);
    auditlogService.save(a);
    this.msg="文件存在,不能重复导入!";

    }

    return SUCCESS;
    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 MATLAB yalmip 可转移负荷的简单建模出错,如何解决?
  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?