ssm练手(CRUD) 8、实现修改功能

在实现之前,先声明下请求时候代表的意义

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中在最后(元素顺序很重要)添加如下内容这一步特别重要,请看我另一篇博客:http://blog.csdn.net/zyf2333/article/details/77886028

    <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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值