一、明确需求
保存 Employee对象 :
需要 empName email gender dId Id(因为是自增的所以不需要)
明确使用 rest 风格的操作方式 :
/depts 请求url
post 请求方式
数据存放在表单中,然后给springmvc pojo 赋值到bean中。
二、实现添加用户模态框
1、在原来的添加用户按钮上绑定事件
原来的按钮:
<!-- 按钮 --> <div class="row"> <div class="ml-auto mr-5"> <button class="btn btn-primary btn-sm" id="emp_add_modal_btn"> <i class="icon-file-alt icon-large"></i> 新增 </button> <button class="btn btn-danger btn-sm"> <i class="icon-trash icon-large"></i> 删除 </button> </div> </div>
js绑定事件:
//添加模态框的事件,一开始忘记添加#号了,emp_add_modal_btn
$("#emp_add_modal_btn").click(function(){
//发送ajax请求,弹出部门信息,显示在下拉列表中
getDepts();
//弹出模态框,static 代表 点击模态框 外面也不能关闭 模态框
$("#empAddModal").modal({
backdrop:"static"
});
});
getDepts()方法是为了从服务器端获取,部门以便在下拉框中填充。
function getDepts(){
$.ajax({
url:"${APP_PATH}/depts",
type:"GET",
success:function(result){
console.log(result);
//显示部门信息,在下拉列表中
// $("#dept_add_select") 换一种找法
//$("#empAddModal select")
//清除之前留下的 option 标签
$("#empAddModal select").empty();
$.each(result.extend.depts,function(){
var optionEle = $("<option></option>").attr("value",this.deptId).append(this.deptName);
optionEle.appendTo("#empAddModal select");
});
}
});
}
2、服务器返回部门信息
新建 DepartmentController.java
package com.ssm.crud.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ssm.crud.bean.Department;
import com.ssm.crud.service.DepartmentService;
import com.ssm.crud.util.Msg;
@Controller
public class DepartmentController {
@Autowired
DepartmentService departmentService;
@ResponseBody
@RequestMapping("/depts")
public Msg getDepts(){
return Msg.success().add("depts", departmentService.getAll()) ;
}
}
新建DepartmentService.java
package com.ssm.crud.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ssm.crud.bean.Department;
import com.ssm.crud.mapper.DepartmentMapper;
@Service
public class DepartmentService {
@Autowired
DepartmentMapper departmentMapper;
public List<Department> getAll(){
return departmentMapper.selectByExample(null);
}
}
Msg.java 之前已经提到过了
package com.ssm.crud.util;
import java.util.HashMap;
import java.util.Map;
/**
* 通用的返回的类
*
* @author lfy
*
*/
public class Msg {
//状态码 100-成功 200-失败
private int code;
//提示信息
private String msg;
//返回给浏览器的数据
private Map<String, Object> extend = new HashMap<String, Object>();
public static Msg success(){
Msg result = new Msg();
result.setCode(100);
result.setMsg("处理成功!");
return result;
}
public static Msg fail(){
Msg result = new Msg();
result.setCode(200);
result.setMsg("处理失败!");
return result;
}
public Msg add(String key,Object value){
this.getExtend().put(key, value);
return this;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Map<String, Object> getExtend() {
return extend;
}
public void setExtend(Map<String, Object> extend) {
this.extend = extend;
}
}
3、新建模态框并整合部门信息
<!-- 员工添加的模态框 -->
<div class="modal fade" id="empAddModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLongTitle">员工添加</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form>
<div class="form-group row">
<label class="col-sm-3 col-form-label">empName</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="empName_add_input" name="empName" value="empName">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">email</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="email_add_input" name="email" value="[email protected]">
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">gender</label>
<div class="col-sm-9">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="gender" id="gender1_add_input" checked value="M">
<label class="form-check-label" >男</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="gender" id="gender2_add_input" value="F">
<label class="form-check-label" >女</label>
</div>
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">departName</label>
<div class="col-sm-6">
<!-- 部门提交部门id即可 -->
<select class="custom-select my-1 mr-sm-2" name="dId" id="dept_add_select">
</select>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" id="emp_add_save_btn">保存</button>
</div>
</div>
</div>
</div>
前面已经在js中 ,将ajax返回的结果填入到了select标签中了:如下
$.each(result.extend.depts,function(){
var optionEle = $("<option></option>").attr("value",this.deptId).append(this.deptName);
optionEle.appendTo("#empAddModal select");
});
三、实现保存员工功能
1、前端部分:用js给保存按钮添加ajax事件:
//添加模态框 保存事件
$("#emp_add_save_btn").click(function(){
//1.将模态框框中的数据提交给服务器进行保存
//方式ajax请求,保存员工
//alert($("#empAddModal form").serialize());
$.ajax({
url:"${APP_PATH}/emp",
type:"POST",
data:$("#empAddModal form").serialize(),
success:function(result){
//经过测试,服务器返回的是 json形式的 Msg对象, 到了浏览器中 变成了 result。所以: result.msg 相当于Msg对象里面的msg属性
console.log(result);
//alert(result.msg);
//1、员工保存成功,需要关闭模态框。
$("#empAddModal").modal("hide");
//2、来到最后一页,显示刚才的数据;发送ajax请求,显示最后一页数据即可(用总记录数请求,保证是请求足够大,mybatis 分页插件 已经在mybatis-config.xml中配置了数据合法性校验,只会返回最后一页数据)
to_page(totalRecords);
}
});
});
特别提醒:js中 totalRecords 变量,是在 js代码一开始就有的
<script type="text/javascript">
//定义 全局变量,总记录数
var totalRecords ;
//1、页面加载完成以后,直接去发送ajax请求,要到分页数据
$(function(){
//去首页
to_page(1);
});
。。。
然后在 显示页面信息时,被赋值:
$("#page_info_area").append("当前第"+result.extend.pageInfo.pageNum+
"页,总共"+result.extend.pageInfo.pages+"页,总"+result.extend.pageInfo.total+"记录")
totalRecords = result.extend.pageInfo.total;
最后,在因为保存员工信息,跳转时,跳转到 最大记录数页:PageHelp 自动过滤最大页数
//添加模态框 保存事件
$("#emp_add_save_btn").click(function(){
//1.将模态框框中的数据提交给服务器进行保存
//方式ajax请求,保存员工
//alert($("#empAddModal form").serialize());
$.ajax({
url:"${APP_PATH}/emp",
type:"POST",
data:$("#empAddModal form").serialize(),
success:function(result){
//经过测试,服务器返回的是 json形式的 Msg对象, 到了浏览器中 变成了 result。所以: result.msg 相当于Msg对象里面的msg属性
console.log(result);
//alert(result.msg);
//1、员工保存成功,需要关闭模态框。
$("#empAddModal").modal("hide");
//2、来到最后一页,显示刚才的数据;发送ajax请求,显示最后一页数据即可(用总记录数请求,保证是请求足够大,mybatis 分页插件 已经在mybatis-config.xml中配置了数据合法性校验,只会返回最后一页数据)
to_page(totalRecords);
}
});
});
2、后端部分:
EmployeeController.java 【核心代码】
@Autowired
EmployeeService employeeService;
/**
* 员工保存
*
* @return
*/
@ResponseBody
@RequestMapping(value="/emp",method=RequestMethod.POST)
public Msg saveEmpWithJson(Employee employee){
System.out.println(employee);
employeeService.saveEmp(employee);
return Msg.success();
}
EmployeeService.java【核心代码】
@Autowired
EmployeeMapper employeeMapper;
public void saveEmp(Employee employee) {
//下面这个方法 是全部插入 ,包括 连自增的id 都是
//employeeMapper.insert(employee);
//下面这个方法是 有选择的插入,自增Id 被忽略 不会插入。
employeeMapper.insertSelective(employee);
}