在实现之前,先声明下请求时候代表的意义
URI含义:
/emp/{id} GET查询员工
/emp POST保存员工
/emp/{id} PUT修改员工
/emp/{id} DELETE 删除员工
其逻辑如下:
1、 点击编辑
2、 弹出用户修改的模态框(显示用户信息)
3、 用户更新
1)EmployeeController.java添加内容:
//处理查询员工请求的方法:
@ResponseBody
@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
public Msg getEmp(@PathVariable("id")Integer id){
//创建一个员工对象,指向Service层中找到的那个员工对象
Employee employee=employeeService.getEmp(id);
return Msg.success().add("emp", employee);
}
/*
* 更新员工
* 此处的{empId}一定要和Employee.java中的属性对应一样才能传入参数
*/
@ResponseBody
@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
public Msg updateEmp(Employee employee,HttpServletRequest request){
System.out.println("请求体中的值:"+request.getParameter("gender"));
System.out.println("将要更新的数据:"+employee);
employeeService.updateEmp(employee);
return Msg.success();
}
2)EmployeeService.java添加内容
//按照员工id查询员工
public Employee getEmp(Integer id) {
Employee employee=employeeMapper.selectByPrimaryKey(id);
return employee;
}
//员工更新
public void updateEmp(Employee employee) {
//按照主键,有选择的更新
employeeMapper.updateByPrimaryKeySelective(employee);
}
3)web.xml中在最后(元素顺序很重要)添加如下内容这一步特别重要,请看我另一篇博客:
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4)index.jsp(emmm,依旧是最后总结再整理吧,太乱了将就着)
package com.atguigu.crud.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.atguigu.crud.bean.Employee;
import com.atguigu.crud.bean.Msg;
import com.atguigu.crud.service.EmployeeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
/*
* 处理员工CRUD请求
*/
@Controller
public class EmployeeController {
@Autowired
EmployeeService employeeService;
/*
* 1、@ResponseBody令数据不会被解析,而是直接写入HTTP response body中
* (比如异步获取JSON数据就要用到这个)
* 2、想要@ResponseBody正常工作,需要导入jackson包。这个
* 包负责将对象转化为JSON字符串
*/
@RequestMapping("/emps")
@ResponseBody
public Msg getEmpsWithJson(@RequestParam(value="pn",defaultValue="1")Integer pn){
//这一段不变,查询数据
PageHelper.startPage(pn, 5);
List<Employee> emps=employeeService.getAll();
PageInfo page=new PageInfo(emps,5);
/*
* 此处我们不用添加model,直接返回page对象(里面的数据)
* 结合@ResponseBody,直接将JSON数据添加到response请求中
*/
return Msg.success().add("pageInfo",page);
}
//用于保存员工
/*
* 1、要支持JSR303校验,需要导入Hibernate-Validator的依赖
* 2、要使用,需要添加@Valid表示要校验Employee(该类中已经添加要求)
* 还要添加BindingResult来封装校验结果
*/
@RequestMapping(value="/emp",method=RequestMethod.POST)
@ResponseBody
public Msg saveEmp(@Valid Employee employee,BindingResult result){
if(result.hasErrors()){
//校验失败,需要返回失败,在模态框中显示校验失败的错误信息,遍历错误信息
//封装个map,用于返回错误信息
Map<String,Object> map=new HashMap<>();
List<FieldError> errors=result.getFieldErrors();
for(FieldError fieldError:errors){
System.out.println("错误的字段:"+fieldError.getField());
System.out.println("错误信息:"+fieldError.getDefaultMessage());
map.put(fieldError.getField(), fieldError.getDefaultMessage());
}
return Msg.fail().add("errorFields", map);
}else{
employeeService.saveEmp(employee);
return Msg.success();
}
}
//检查是否员工重复,输入的用户名是否可用
@ResponseBody
@RequestMapping("/checkuser")
public Msg checkuser(@RequestParam("empName")String empName){
//先判断用户名是否合法的表达式
String regx="(^[a-zA-Z0-9_-]{4,16}$)|(^[\u2E80-\u9FFF]{2,5})";
if(!empName.matches(regx)){
return Msg.fail().add("va_msg", "用户名必须是4-16数字字母组合,或者2-5位中文(后台校验)");
}
//数据库用户名重复校验
boolean b=employeeService.checkUser(empName);
if(b){
return Msg.success();
}else{
return Msg.fail().add("va_msg", "用户名已存在(后台校验)");
}
}
//处理查询员工请求的方法:
@ResponseBody
@RequestMapping(value="/emp/{id}",method=RequestMethod.GET)
public Msg getEmp(@PathVariable("id")Integer id){
//创建一个员工对象,指向Service层中找到的那个员工对象
Employee employee=employeeService.getEmp(id);
return Msg.success().add("emp", employee);
}
/*
* 更新员工
* 此处的{empId}一定要和Employee.java中的属性对应一样才能传入参数
*
* 如果之间发送ajax=PUT形式的请求,封装数据全部变成null
* 问题:
* 请求体中有数据,但是Employee封装不上;
*
* 原因:
* Tomcat中的问题:
* 1、将请求体中的数据,封装成一个map。
* 2、request.getParameter("empName")就会从map中取值
* 3、springmvc封装POJO时,会把POJO每个属性的值,request.getParameter("..");
*
* ajax发送PUT请求发送的血案
* put请求体中的数据,request.getParameter(".."),都拿不到数据
* Tomcat一看是put请求,就不会封装map,只有POST请求才封装ajax
*/
@ResponseBody
@RequestMapping(value="/emp/{empId}",method=RequestMethod.PUT)
public Msg updateEmp(Employee employee,HttpServletRequest request){
employeeService.updateEmp(employee);
return Msg.success();
}
}