从”修改模块”中看程序的健壮性

 

先看以下代码

/**
	业务流程:
	用户点击修改,将记录的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,作为修改是否成功的标志