从”修改模块”中看程序的健壮性
先看以下代码
/**
业务流程:
用户点击修改,将记录的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,作为修改是否成功的标志