从”修改模块”中看程序的健壮性
先看以下代码
/** 业务流程: 用户点击修改,将记录的entId传到本方法,本方法根据entId找到相应的记录,并将该记录送到修改页面去 按照正常的业务流程,这个流程中是不会出现异常的.但以下这种情况会导致异常: 从页面把entId传到本方法一般是通过超链接传递的,这种方式是把参数(即entId)暴露在浏览器地址栏中的,如果参数(即entId)被有意无意被改动,会出现三种情况: 第一种是把entId改成其他记录的,导致用户修改的不是用户本身想修改的;第二种是把entId修改成不合法的参数;第三种是修改后的entId在数据中查找不到相应的记录. 第二种,第三种情况本方法是做了处理的,即从数据库中查找不到相应的记录时返回到ERROR页面,然而第一种情况,本方法也无能为力.从技术上讲,本方法已经做到了健壮性. 所以从页面传参数到后天尽量还是不用超链接或者get方法. */ public String preUpdateEntcontactinfo() { enterpriseUser = mgr.getEntUserById(entId); if (enterpriseUser == null) { addActionError("系统错误!"); return ERROR; } return "update"; } /** 业务流程:用户将修改后的信息传到本方法,本方法进行持久化 本方法对entId为空是进行判断了的,如果为null直接返回,我当初就疑问为什么本方法里需要返回一个ent呢?看看下一个方法就明白其中的道理了. */ public EnterpriseUser updateEntcontactinfo(String entId, String performId, String contactPersonName, String contactPersonTel, String contactPersonMobile, String contactPersonEmail) { // entId entId不为空是修改的前置条件 // contactPersonName,contactPersonTel是需求要求必录项 Assert.hasText(entId, "Enterprise id is null"); Assert.hasText(contactPersonName, "ContactPersonName is null"); Assert.hasText(contactPersonTel, "ContactPersonTel is null"); EnterpriseUser ent = getEntUserById(entId); // 如果entId不合法,根据entId找不到相应的记录则返回null if (ent != null) { ent.setContactPersonName(contactPersonName); ent.setContactPersonMobile(contactPersonMobile); ent.setContactPersonName(contactPersonName); ent.setContactPersonTel(contactPersonTel); dao.explUpdateObject(ent); // 抛出ent更新的事件响应 eventMgr.fireObjectChangeEvnet(ent, ObjectChangeEvent.EVENT_TYPE_UPDATE, performId);// 抛出对象被创建事件 } return ent; } /** 业务流程:本方法是ACTION中的方法,调用上面方法进行修改,修改后返回到相应的页面 在本方法中是如何判断上面方法是否修改成功呢? 这个时候上面方法的返回值就很多有作用了,如果返回的是null,则说明修改一定失败了.如果不为空则说明修改成功了. */ public String updateEntcontactinfo() { String performerId = LoginedUserHelper.getPersonDetail().getUser() .getId(); EnterpriseUser entUser = mgr.updateEntcontactinfo(entId, performerId, enterpriseUser.getContactPersonName(), enterpriseUser.getContactPersonTel(), enterpriseUser .getContactPersonMobile(), enterpriseUser .getContactPersonEmail()); if (entUser == null) { addActionError("系统错误!"); return ERROR; } return SUCCESS; }
总结:
(1) 当参数暴露给用户时,我们要对参数进行检查过滤
(2) 遇到ID时,我们一般就会根据ID查到记录,这个时候我们就需要想到空指针,如果出现了空指针怎么办?
(3) 修改方法中需要返回bean,作为修改是否成功的标志