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

来源:互联网 发布:禁止在淘宝网上发布 编辑:程序博客网 时间:2024/06/08 06:15

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

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请求 */@Controllerpublic 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();    }}
原创粉丝点击