如图 想添加一位学生 前台规划如图所示所需学生姓名,学号,学院,班级,年级,性别,公寓以及宿舍名
学生表构造如下
外键对应班级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")
@ResponseBody
public 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
@Override
public int addStud(String studName, String studNo, String collName, String clasName, String grade, String sex,
String aparName, String dormName) {
//学生信息添加成功flag默认未成功
int flag = 0;
// 拿到学院Id
String colleaId = colleageDao.getCollIdByName(collName);
// 拿到班级Id
String clasId = classesDao.getClassIdByClassName(clasName);
// 拿到dormId
String 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
此时尝试向该宿舍添加学生:
成功。