异常的处理(正确版)"/>
Spring事务机制以及异常的处理(正确版)
如图 想添加一位学生 前台规划如图所示所需学生姓名,学号,学院,班级,年级,性别,公寓以及宿舍名
学生表构造如下
外键对应班级id,宿舍id,宿舍表中管理公寓id,学院id
前台点击按钮事件绑定方法
$(document).ready(function() {//增加学生提交$("#addStudSub").click(function self() {// 禁用按钮$("#addStudSub").addClass('disabled');// 学院var coll = $("#seleColl").val();// 班级var clas = $("#seleClas").val();// 年级var grad = $("#seleGrade").val();// 性别var sex = $("#seleSex").val();// 公寓var apar = $("#seleApar").val();// 宿舍var dorm = $("#seleDorm").val();// 验证是否都被选择if (coll != '' && clas != ''&& grad != '' && sex != ''&& apar != '' && dorm != '') {$.ajax({url : "/gradPro/stud/addStud.action",data : {"studName":$("#studentName").val(),"studNo":$("#studentNo").val(),"collName":coll,"clasName":clas,"grade":grad,"sex":sex,"aparName":apar,"dormName":dorm},success : function(data) {//添加学生成功if ("1" == data.status) {// 成功后延时两秒跳转并提示信息countDown(2, data.message);} else if ("0" == data.status) {// 提示错误信息$("#alterTip").text(data.message);$("#alterTips").modal('show');}}})}// 如果存在未被选择else {// 提示并禁用按钮$("#subTips").hide().html("<label class='label label-danger'>请全部勾选选项</label>").show(500);//刷新页面setTimeout("location.reload()", 2000);}})
}
);
对应后台Controller层方法如下:(这不是重点,请看到Service层返回再看)
/*** 新增学生* @param studName* @param studNo* @param collName* @param clasName* @param grade* @param sex* @param aparName* @param dormName* @return*/@SuppressWarnings("finally")@RequestMapping("addStud.action")@ResponseBodypublic DataSet addStud(@RequestParam("studName") String studName, @RequestParam("studNo") String studNo,@RequestParam("collName") String collName, @RequestParam("clasName") String clasName, @RequestParam("grade") String grade,@RequestParam("sex") String sex, @RequestParam("aparName") String aparName, @RequestParam("dormName") String dormName) {DataSet data = new DataSet();try{//尝试添加学生studentService.addStud(studName,studNo,collName,clasName,grade,sex,aparName,dormName);data.setStatus("1");data.setMessage("添加学生成功");}//如果捕获到宿舍已经住满catch(DormHasAlaredyFullException e){data.setStatus(e.getErrorCode());data.setMessage(e.getErrorMSG());}finally{return data;}}
Service层的方法:如下图所示,先声明了一个事务@Transactional 配置代表这是一个Spring事务
如果查出宿舍总床位和入住人数已经相等,代表宿舍已住满,则这时抛出一个自定义宿舍已住满异常,事务结束。
否则继续下面逻辑,之前博客中也是应该如此处理。在返回controller层中捕获此异常,跟ajax请求做交互处理提示给用户。
@Transactional@Overridepublic int addStud(String studName, String studNo, String collName, String clasName, String grade, String sex,String aparName, String dormName) {//学生信息添加成功flag默认未成功int flag = 0;// 拿到学院IdString colleaId = colleageDao.getCollIdByName(collName);// 拿到班级IdString clasId = classesDao.getClassIdByClassName(clasName);// 拿到dormIdString dormId = dormitoryDao.getDormIdByDormName(dormName);// 先在宿舍中更新信息// 查询除宿舍总人数和已住人数DormitoryPageDto tempDto = dormitoryDao.selectTotalBedAndHave(dormId);// 如果公寓已经住满了if (tempDto.getHaveEver() == tempDto.getTotalBed()) {// 抛出公寓已经住满了异常DormHasAlaredyFullException de = new DormHasAlaredyFullException("0", "宿舍"+dormName+"已经住满了");throw de;} // 如果宿舍未住满else {// 如果宿舍只剩一张床铺if ((tempDto.getHaveEver() + 1) == tempDto.getTotalBed()) {// 住进学生后修改宿舍状态Dormitory dormitory = new Dormitory();dormitory.setDormitoryId(Integer.parseInt(dormId));dormitory.setStatus("1");dormitoryDao.alterStatus(dormitory);}// 添加学生信息Student student = new Student();student.setStudentName(studName);student.setStudentNo(studNo);student.setColleageId(Integer.parseInt(colleaId));student.setClassId(Integer.parseInt(clasId));student.setGrade(grade);student.setSex(sex);student.setDormitoryId(Integer.parseInt(dormId));student.setStatus("1");flag = studentDao.addStud(student);}return flag;}
自定义异常类很简单:
/*** 添加学生时宿舍已住满异常* @author BreakingBad_**/
public class DormHasAlaredyFullException extends RuntimeException {private static final long serialVersionUID = 1L;private String errorCode;private String errorMSG;public DormHasAlaredyFullException(String errorMSG) {super(errorMSG);}public DormHasAlaredyFullException(String code, String message) {this.setErrorCode(code);this.setErrorMSG(message);}public String getErrorCode() {return errorCode;}public void setErrorCode(String errorCode) {this.errorCode = errorCode;}public String getErrorMSG() {return errorMSG;}public void setErrorMSG(String errorMSG) {this.errorMSG = errorMSG;}
测试:
表中宿舍名为702-4的总床位为6,对应的学生外键指向该宿舍的人数也为6
此时尝试向该宿舍添加学生:
成功。
更多推荐
Spring事务机制以及异常的处理(正确版)
发布评论