SSM整合_实现增删改查_新增

2023-05-16

写在前面

SSM整合_年轻人的第一个增删改查_基础环境搭建
SSM整合_年轻人的第一个增删改查_查找
SSM整合_年轻人的第一个增删改查_新增
SSM整合_年轻人的第一个增删改查_修改
SSM整合_年轻人的第一个增删改查_删除
GitHub:https://github.com/say-hey/ssm_crud
Gitee:https://gitee.com/say-hey/ssm_crud

  有用吗?对于学完Spring、SpringMVC、Mybatis还无从下手的同学来说这是一个很好引子。对于正在学习同一个案例的同学,可能解决一些问题。对于需要这个案例的同学可以直接获取。

  有什么?xml配置文件编写,引入一个简单的前端框架,使用MyBatis Generator逆向工程生成一些代码,使用框架简单快速搭建一个页面,好用的分页工具PageHelper,简单的前后端分离,发送ajax请求,利用json传递数据,增、删、改、查的简单实现。

  简单吗?内容很简单,涉及Java代码不多,但是对于新手来说,最困难的部分是各种环境搭建、配置文件、版本冲突,如果能够根据错误提示动手解决,那就是一大进步。

  怎么学?如果有时间可以在B站搜索:ssm整合crud,雷丰阳讲的。如果想看到每个功能的实现过程和源码,可以在这里学习,每个步骤都有注释。也可以作为复习快速浏览。

3、新增

前端格式校验、用户名校验、后端校验、JSR303校验,效果如图

请添加图片描述

请添加图片描述

1. 员工新增模态框

使用弹出模态框作为新增模块,参考Bootstrap代码

  1. index.jsp添加新增模态框代码

        <!-- 为新增按钮增加模态框 ,利用按钮绑定单击事件-->
        <!-- Modal -->
        <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog"
             aria-labelledby="myModalLabel">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal"
                                aria-label="Close">
                            <span aria-hidden="true">&times;</span>
                        </button>
                        <h4 class="modal-title" id="myModalLabel">员工添加</h4>
                    </div>
                    <div class="modal-body">
                        <!-- 添加表单 -->
                        <form class="form-horizontal" id="model-form">
                            <!-- 姓名 -->
                            <div class="form-group">
                                <label for="empName_add_input" class="col-sm-2 control-label">EmpName</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" name="empName" id="empName_add_input"
                                           placeholder="empName">
                                    <!-- 用来显示错误提示 -->
                                    <span class="help-block"></span>
                                </div>
                            </div>
                            <!-- 邮箱 -->
                            <div class="form-group">
                                <label for="email_add_input" class="col-sm-2 control-label">Email</label>
                                <div class="col-sm-10">
                                    <input type="email" class="form-control" name="email" id="email_add_input"
                                           placeholder="empName@123.com">
                                    <!-- 用来显示错误提示 -->
                                    <span class="help-block"></span>
                                </div>
                            </div>
                            <!-- 性别 -->
                            <div class="form-group">
                                <label class="col-sm-2 control-label">Gender</label>
                                <div class="col-sm-10">
                                    <!-- 单选 -->
                                    <label for="gender1_add_input"> <input type="radio"
                                                                           name="gender" id="gender1_add_input"
                                                                           name="gender" value="M" checked>
                                        男
                                    </label>
                                    <label for="gender2_add_input"> <input type="radio"
                                                                           name="gender" id="gender2_add_input"
                                                                           name="gender" value="F">
                                        女
                                    </label>
                                </div>
                            </div>
                            <!-- 部门下拉框 -->
                            <div class="form-group">
                                <label class="col-sm-2 control-label">DeptName</label>
                                <div class="col-sm-10">
                                    <!-- 部门下拉列表使用ajax查询出来的动态拼接,值为部门id --> 
                                    <select class="form-control" name="dId" id="deptName_add_select"></select>
                                </div>
                            </div>
    
                        </form>
    
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                        <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
                    </div>
                </div>
            </div>
        </div>
    
  2. 绑定单击事件

        //添加模态栏
        $("#emp_add_modal_btn").click(function() {
    		//显示模态框
            $("#empAddModal").modal({
                //模态框参数,点击背景不关闭
                backdrop : "static"
            });
        });
    
  3. 查询部门动态拼接

    1. 创建一个查询部门的方法

          //新增模态框
          $("#emp_add_modal_btn").click(function() {
              //添加模态栏之前将所表单信息清空,包括两项验证的css样式,显示模态栏之后就是空的
              //reset()方法是dom下的,使用[0]
              $("#empAddModal form")[0].reset();
              //清空输入格式、重名校验的css样式
              reset_form("#empAddModal form");
              //获取所有部门信息
              getDepts("#deptName_add_select");
              //添加模态框,在模态框中需要所有部门,所以需要查询所有部门信息
              $("#empAddModal").modal({
               //模态框参数,点击背景不关闭
                  backdrop : "static"
           });
          });
        	//后面用
          //新增模态框--清除表单数据,样式
          function reset_form(ele) {
              $(ele)[0].reset();
              //该元素下所有css清除
              $(ele).find("*").removeClass("has-error has-success");
              //显示警告信息部分清空
              $(ele).find(".help-block").text("");
          }
      
    2. 发送查询部门的ajax请求

          //新增模态框--请求所有部门信息
       function getDepts(ele){
      
           //---注意这里要清空---
              $(ele).empty();
              $.ajax({
                  url:"${PATH}/depts",
                  type:"GET",
                  success:function(result){
                      //console.log(result);
                      //动态拼接
                  }
              });
          }
      
    3. 创建DepartmentController

      package com.ssm.controller;
      
      import com.ssm.bean.Department;
      import com.ssm.bean.Msg;
      import com.ssm.service.DepartmentService;
      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 java.util.List;
      
      /**
       * 部门信息
       */
      @Controller
      public class DepartmentController {
      
          @Autowired
       private DepartmentService departmentService;
      
       /**
           * 获取所有部门信息
           * @return
           */
          @ResponseBody
          @RequestMapping("/depts")
          public Msg getDepts() {
              List<Department> depts = departmentService.getDepts();
              return Msg.success().add("depts", depts);
          }
      }
      
    4. 创建DepartmentService

      package com.ssm.service;
      
      import com.ssm.bean.Department;
      import com.ssm.dao.DepartmentMapper;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      import java.util.List;
      
      /**
       * 部门信息
       */
      @Service
      public class DepartmentService {
      
          @Autowired
       DepartmentMapper departmentMapper;
      
          /**
           * 查询所有部门
           */
          public List<Department> getDepts(){
              //方法本身可以添加查询条件,如果为null代表查所有
              List<Department> list = departmentMapper.selectByExample(null);
              return list;
          }
      }
      
    5. 动态拼接

          //新增模态框--请求所有部门信息
          function getDepts(ele){
      
              //---注意这里要清空---
              $(ele).empty();
              $.ajax({
              url:"${PATH}/depts",
              type:"GET",
                  success:function(result){
                      //console.log(result);
                      $.each(result.extend.depts,function(index,item){
                          //创建出option并添加到select中
                          var optionEle = $("<option></option>").append(item.deptName).attr("value",item.deptId);
                          optionEle.appendTo(ele);
                      });
                  }
              });
          }
      
    6. 效果
      请添加图片描述

2. 基本员工新增

  1. 绑定保存按钮

        //------------------增删改查都使用REST风格-------------------
        //新增保存信息 
        $("#emp_save_btn").click(function(){
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url:"${PATH}/saveemp",
                type:"POST",
                data:$("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success:function(result){
                    //1.添加成功,关闭模态框
                    $("#empAddModal").modal("hide");
                    //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                    //合理性,所以不会超出,这里使用全局参数,数据总条数
                    to_page(totalRecord+1);
                }
            });
    
  2. EmployeeController

        @ResponseBody
        @RequestMapping(value = "/saveemp",method = RequestMethod.POST)
        public Msg saveEmp(Employee employee, BindingResult result) {
            employeeService.saveEmp(employee);
            return Msg.success();
        }
    
  3. EmployeeService

        /**
         * 保存emp员工,insert
         * @param employee
         */
        public void saveEmp(Employee employee) {
            //这个是有选择插入,insert()全插入,包括id
            employeeMapper.insertSelective(employee);
        }
    

3. 前端校验

一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后

  1. (内部Java格式验证)+ ajax用户名验证(实现方法看下一小节)

        //1.(内部Java格式验证)+ ajax用户名验证
        //新增保存信息--ajax用户名校验
        //由于在java内又做了一次格式验证,所以这个方法相当于即验证了格式,又验证了重名
        $("#empName_add_input").blur(function () {
    
            //发送ajax请求,验证用户名是否可用
            var empName = this.value;
            $.ajax({
                url: "${PATH}/checkname",
                data: "empName=" + empName,
                type: "POST",
                success: function (result) {
                    console.log(result);
                    //获取到返回值,Msg中的状态码
                    if (result.code == 2333) {
                        show_validate_msg("#empName_add_input", "success", "用户名可用");
                        //因为使用了两种方式验证,格式和重名,会有css样式冲突覆盖,所以再加一次验证
                        //自定义属性,或全局变量
                        //给添加按钮添加自定义属性,在提交时判断是否通过两项验证。
                        $("#emp_save_btn").attr("ajax-vl", "success");
    
    
                    } else if (result.code == 5555) {
                        show_validate_msg("#empName_add_input", "error", result.extend.msg);
    
                        $("#emp_save_btn").attr("ajax-vl", "error");
    
                    }
                }
            });
        });
    
  2. 邮箱格式独立校验

        //2. 邮箱独立验证
        //新增保存信息--独立邮箱格式验证
        $("#email_add_input").blur(function () {
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                //return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
            }
            //最后方法通过
            //return true;
        })
    
  3. 格式+用户名验证+提交保存请求

        //3. 格式+用户名验证+提交保存请求,一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,
        //为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后
        //新增保存信息--请求
        $("#emp_save_btn").click(function () {
            //点击就发送请求,保存使用POST请求
    
    
            //1.先验证ajax重名校验,防止用户输入重复用户名之后,直接输入正确的邮箱,点击提交,重名的验证提示会被覆盖
            //ajax-vl是ajax重名校验之后添加的自定义属性,用于表示提交按钮是否可用
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //2.点击保存按钮请求之前完整验证一遍输入格式
            //JQuery格式总验证
            if (!validate_add_form()) {
                return false;
            }
            //3.重名验证
            //ajax重名校验
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url: "${PATH}/saveemp",
                type: "POST",
                data: $("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success: function (result) {
                    //1.添加成功,关闭模态框
                    $("#empAddModal").modal("hide");
                    //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                    //合理性,所以不会超出,这里使用全局参数,参数值在上面分页时获取的,数据总条数+1保证不出现极端情况
                    to_page(totalRecord + 1);
                }
            });
        });
    
  4. 请求按钮JQuery格式总校验方法

        //新增保存信息--请求按钮JQuery格式总校验方法
        function validate_add_form() {
            console.log("validate_add_form()")
            //1.拿到校验的数据,使用正则表达式
            //根据bootstrap提供的组件
            //校验用户名
            var empName = $("#empName_add_input").val();
            var regName = /(^[a-zA-Z0-9_-]{2,8}$)|(^[\u2E80-\u9FFF]{2,5})/;
            if (!regName.test(empName)) {
                //alert("用户名可以是2-5位中文或者2-8位英文和数字的组合");
                show_validate_msg("#empName_add_input", "error", "用户名可以是2-5位中文或者2-8位英文和数字的组合");
                return false;
            } else {
                show_validate_msg("#empName_add_input", "success", "");
            }
            //2、校验邮箱信息
            var email = $("#email_add_input").val();
            var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
            if (!regEmail.test(email)) {
                //alert("邮箱格式不正确");
                show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
                return false;
            } else {
                show_validate_msg("#email_add_input", "success", "");
            }
            //最后方法通过
            return true;
        }
    
  5. 添加样式方法

        //新增保存信息--添加css样式
        //show_validate_msg显示校验状态,通过添加样式,ele表示被选择元素,status状态
        //用来判断是用什么样式,绿色、红色,msg提示信息
        function show_validate_msg(ele, status, msg) {
            //判断之前先清空之前样式
            $(ele).parent().removeClass("has-success has-error");
            $(ele).next("span").text("");
            if ("success" == status) {
                $(ele).parent().addClass("has-success");
                $(ele).next("span").text(msg)
            } else if ("error" == status) {
                $(ele).parent().addClass("has-error");
                $(ele).next("span").text(msg)
            }
        }
    

4. ajax用户名校验

如果添加相同的用户名会造成混淆,所以在输入用户名之后立即进行校验

  1. 发送ajax请求(与上一节相同)

        $("#empName_add_input").blur(function () {
    
            //发送ajax请求,验证用户名是否可用
            var empName = this.value;
            $.ajax({
                url: "${PATH}/checkname",
                data: "empName=" + empName,
                type: "POST",
                success: function (result) {
                    console.log(result);
                    //获取到返回值,Msg中的状态码
                    if (result.code == 2333) {
                        show_validate_msg("#empName_add_input", "success", "用户名可用");
                        //因为使用了两种方式验证,格式和重名,会有css样式冲突覆盖,所以再加一次验证
                        //自定义属性,或全局变量
                        //给添加按钮添加自定义属性,在提交时判断是否通过两项验证。
                        $("#emp_save_btn").attr("ajax-vl", "success");
    
    
                    } else if (result.code == 5555) {
                        show_validate_msg("#empName_add_input", "error", result.extend.msg);
                        $("#emp_save_btn").attr("ajax-vl", "error");
    
                    }
                }
            });
        });
    
  2. EmployeeController

        /**
         * 用户名查重
         * 前端校验,在失去焦点,保存之前都校验
         * @param empName
         * @return
         */
        @ResponseBody
        @RequestMapping("/checkname")
        public Msg checkEmpName(@RequestParam("empName")String empName) {
    
            //用户名格式校验
            String regx = "(^[a-zA-Z0-9_-]{2,8}$)|(^[\\u2E80-\\u9FFF]{2,5})";
            if(!empName.matches(regx)){
                return Msg.fail().add("msg", "用户名可以是2-5位中文或者2-8位英文和数字的组合");
            }
            //返回查询统计结果,true说明没有重名
            boolean b = employeeService.checkEmpName(empName);
            if(b) {
                return Msg.success();
            }else {
                return Msg.fail().add("msg", "用户名已存在");
            }
        }
    
  3. EmployeeService

        /**
         * 查询用户是否存在
         * 使用Example复杂查询
         *
         * @param name
         * @return
         */
        public boolean checkEmpName(String name) {
            //Example用法
            EmployeeExample example = new EmployeeExample();
            //创建查询条件
            EmployeeExample.Criteria criteria = example.createCriteria();
            //我的理解:这一句相当于添加了一个条件 where empName=name
            criteria.andEmpNameEqualTo(name);
            //统计查询结构
            long count = employeeMapper.countByExample(example);
            //返回true(0)说明没有重复用户名
            return count == 0;
        }
    

5. JSR303校验

前面是前端校验,现在是后端校验,针对Java

  1. 添加JSR303依赖

    		<!-- JSR303校验 -->
    		<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
    		<dependency>
    			<groupId>org.hibernate.validator</groupId>
    			<artifactId>hibernate-validator</artifactId>
    			<version>6.1.0.Final</version>
    		</dependency>
    
  2. 在JavaBean上添加注解

    public class Employee {
        private Integer empId;
    
        //JSR303自定义校验规则
        @Pattern(regexp = "(^[a-zA-Z0-9_-]{2,8}$)|(^[\\u2E80-\\u9FFF]{2,5})", message = "用户名可以是2-5位中文或者2-8位英文和数字的组合")
        private String empName;
    
        private String gender;
    
        @Pattern(regexp = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$",message = "邮箱格式不正确")
        private String email;
        
        //...
    
  3. 在Controller方法中使用,在参数前添加注解,在参数后面添加结果参数

        /**
         * 新增,保存用户,并验证
         *
         * 添加JSR303校验
         * @Valid表示校验下一个对象
         * BindingResult紧跟被校验对象,接收结果
         *
         * @param employee
         * @return
         */
        @ResponseBody
        @RequestMapping(value = "/saveemp",method = RequestMethod.POST)
        public Msg saveEmp(@Valid Employee employee, BindingResult result) {
    
            if(result.hasErrors()) {
                //格式校验失败,返回信息
                Map<String ,Object> map = new HashMap<>();
                List<FieldError> fieldErrors = result.getFieldErrors();
                for(FieldError error : fieldErrors) {
                    System.out.println("错误的字段名:" + error.getField());
                    System.out.println("错误信息:" + error.getDefaultMessage());
                    //将错误信息放到map中
                    map.put(error.getField(), error.getDefaultMessage());
                }
                return Msg.fail().add("errorFields", map);
    
            }else if(!employeeService.checkEmpName(employee.getEmpName())){
                //后端在保存的时候再次验证是否存在用户名---有点 重复的感觉???
                //因为是在一起接收所以错误信息一定要一样,empName手动写上
                return Msg.fail().add("empName", "用户名已存在");
            }else {
    
                employeeService.saveEmp(employee);
                //不用这种:获取总页数,用在新增完之后跳转到最后一页,不过这样就会多查一次数据库
                //PageInfo<Employee> pageInfo = employeeService.getPage(null);
                //return Msg.success().add("pageInfo", pageInfo);
                return Msg.success();
            }
        }
    
  4. index.jsp提交按钮中处理返回结果

        //3. 格式+用户名验证+提交保存请求,一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,
        //为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后
        //新增保存信息--请求
        $("#emp_save_btn").click(function () {
            //点击就发送请求,保存使用POST请求
    
            //1.先验证ajax重名校验,防止用户输入重复用户名之后,直接输入正确的邮箱,点击提交,重名的验证提示会被覆盖
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //2.点击保存按钮请求之前完整验证一遍输入格式
            console.log("JQuery格式总验证")
            //方法一:JQuery格式总验证
            if (!validate_add_form()) {
                return false;
            }
            //3.重名验证
            console.log("ajax重名校验")
            //ajax重名校验
            if ($(this).attr("ajax-vl") == "error") {
                return false;
            }
            //1、模态框中填写的表单数据提交给服务器进行保存
            //2、发送ajax请求保存员工
            $.ajax({
                url: "${PATH}/saveemp",
                type: "POST",
                data: $("#empAddModal form").serialize(),
                //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
                //console.log($("#empAddModal form").serialize());
                //empName=Tom&email=Tom%40123.com&gender=M&dId=1
                success: function (result) {
    
                    //清除模态框和提示信息
                    $("#empAddModal form").find("*").removeClass("has-error has-success");
                    $("#empAddModal form").find(".help-block").text("");
    
                    //在这里判断后端JSR303校验结果,最后一次!!!!!!!!!真的
                    //前后端验证可以独立运行,注释前端后端也能实现一样效果
                    if(result.code == 2333){
    
                        //alert(result.msg);
                        //1.添加成功,关闭模态框
                        $("#empAddModal").modal("hide");
                        //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                        //合理性,所以不会超出,这里使用全局参数,数据总条数+1保证不出现极端情况
                        to_page(totalRecord + 1);
                    }else{
                        //失败,显示信息,有几个就显示几个
                        //undefined 就是没找到这个错误,说明正确,可用alert(result.extend.errorFields.empName)验证
                        //用户名格式
                        //alert(result.extend.errorFields.empName)
    
                        //用户名格式和查重,因为查重的属性格式和格式验证不同,所以不能分开
                        //result.extend.errorFields.empName 格式验证
                        //result.extend.empName 查重验证
                        if(undefined != result.extend.errorFields ){
                            //格式错误
                            if(undefined != result.extend.errorFields.empName){
                                show_validate_msg("#empName_add_input","error",result.extend.errorFields.empName);
                            }
                        }else{
                            if(undefined != result.extend.empName){
                                //查重错误
                                show_validate_msg("#empName_add_input","error",result.extend.empName);
                            }
                        }
                        //邮箱格式判断
                        if(undefined != result.extend.errorFields){
                            if(undefined != result.extend.errorFields.email){
                                show_validate_msg("#email_add_input","error",result.extend.errorFields.email);
                            }
                        }
                    }
                }
            });
        });
    

6. 完整代码

模态框

    <!-- 为新增按钮增加模态框 ,利用按钮绑定单击事件-->
    <!-- Modal -->
    <div class="modal fade" id="empAddModal" tabindex="-1" role="dialog"
         aria-labelledby="myModalLabel">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal"
                            aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title" id="myModalLabel">员工添加</h4>
                </div>
                <div class="modal-body">
                    <!-- 添加表单 -->
                    <form class="form-horizontal" id="model-form">
                        <!-- 姓名 -->
                        <div class="form-group">
                            <label for="empName_add_input" class="col-sm-2 control-label">EmpName</label>
                            <div class="col-sm-10">
                                <input type="text" class="form-control" name="empName" id="empName_add_input"
                                       placeholder="empName">
                                <!-- 用来显示错误提示 -->
                                <span class="help-block"></span>
                            </div>
                        </div>
                        <!-- 邮箱 -->
                        <div class="form-group">
                            <label for="email_add_input" class="col-sm-2 control-label">Email</label>
                            <div class="col-sm-10">
                                <input type="email" class="form-control" name="email" id="email_add_input"
                                       placeholder="empName@123.com">
                                <!-- 用来显示错误提示 -->
                                <span class="help-block"></span>
                            </div>
                        </div>
                        <!-- 性别 -->
                        <div class="form-group">
                            <label class="col-sm-2 control-label">Gender</label>
                            <div class="col-sm-10">
                                <!-- 单选 -->
                                <label for="gender1_add_input"> <input type="radio"
                                                                       name="gender" id="gender1_add_input"
                                                                       name="gender" value="M" checked>
                                    男
                                </label>
                                <label for="gender2_add_input"> <input type="radio"
                                                                       name="gender" id="gender2_add_input"
                                                                       name="gender" value="F">
                                    女
                                </label>
                            </div>
                        </div>
                        <!-- 部门下拉框 -->
                        <div class="form-group">
                            <label class="col-sm-2 control-label">DeptName</label>
                            <div class="col-sm-10">
                                <!-- 部门下拉列表使用ajax查询出来的动态拼接,值为部门id -->
                                <select class="form-control" name="dId" id="deptName_add_select"></select>
                            </div>
                        </div>

                    </form>

                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                    <button type="button" class="btn btn-primary" id="emp_save_btn">保存</button>
                </div>
            </div>
        </div>
    </div>

请求和方法

<script type="text/javascript">
    //------------------增删改查都使用REST风格-------------------

    //1.(内部Java格式验证)+ ajax用户名验证
    //新增保存信息--ajax用户名校验
    //由于在java内又做了一次格式验证,所以这个方法相当于即验证了格式,又验证了重名
    $("#empName_add_input").blur(function () {

        //发送ajax请求,验证用户名是否可用
        var empName = this.value;
        $.ajax({
            url: "${PATH}/checkname",
            data: "empName=" + empName,
            type: "POST",
            success: function (result) {
                console.log(result);
                //获取到返回值,Msg中的状态码
                if (result.code == 2333) {
                    show_validate_msg("#empName_add_input", "success", "用户名可用");
                    //因为使用了两种方式验证,格式和重名,会有css样式冲突覆盖,所以再加一次验证
                    //自定义属性,或全局变量
                    //给添加按钮添加自定义属性,在提交时判断是否通过两项验证。
                    $("#emp_save_btn").attr("ajax-vl", "success");

                } else if (result.code == 5555) {
                    show_validate_msg("#empName_add_input", "error", result.extend.msg);
                    $("#emp_save_btn").attr("ajax-vl", "error");

                }
            }
        });
    });

    //2. 邮箱独立验证
    //新增保存信息--独立邮箱格式验证
    $("#email_add_input").blur(function () {
        var email = $("#email_add_input").val();
        var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
        if (!regEmail.test(email)) {
            //alert("邮箱格式不正确");
            show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
            //return false;
        } else {
            show_validate_msg("#email_add_input", "success", "");
        }
        //最后方法通过
        //return true;
    })

    //3. 格式+用户名验证+提交保存请求,一共有两种验证方式 1.输入框焦点单独验证 2.提交按钮总验证,
    //为了不两种方式的css样式相互覆盖,每种方式都验两遍,格式在前,用户名在后
    //新增保存信息--请求
    $("#emp_save_btn").click(function () {
        //点击就发送请求,保存使用POST请求

        //1.先验证ajax重名校验,防止用户输入重复用户名之后,直接输入正确的邮箱,点击提交,重名的验证提示会被覆盖
        if ($(this).attr("ajax-vl") == "error") {
            return false;
        }
        //2.点击保存按钮请求之前完整验证一遍输入格式
        console.log("JQuery格式总验证")
        //方法一:JQuery格式总验证
        if (!validate_add_form()) {
            return false;
        }
        //3.重名验证
        console.log("ajax重名校验")
        //ajax重名校验
        if ($(this).attr("ajax-vl") == "error") {
            return false;
        }
        //1、模态框中填写的表单数据提交给服务器进行保存
        //2、发送ajax请求保存员工
        $.ajax({
            url: "${PATH}/saveemp",
            type: "POST",
            data: $("#empAddModal form").serialize(),
            //.serialize()方法能将表单中数据序列化,直接发送给controll封装成Bean
            //console.log($("#empAddModal form").serialize());
            //empName=Tom&email=Tom%40123.com&gender=M&dId=1
            success: function (result) {

                //清除模态框和提示信息
                $("#empAddModal form").find("*").removeClass("has-error has-success");
                $("#empAddModal form").find(".help-block").text("");

                //在这里判断后端JSR303校验结果,最后一次!!!!!!!!!真的
                //前后端验证可以独立运行,注释前端后端也能实现一样效果
                if(result.code == 2333){

                    //alert(result.msg);
                    //1.添加成功,关闭模态框
                    $("#empAddModal").modal("hide");
                    //2.来到最后一页,显示插入的数据,可以直接跳到一个很大的页数,因为
                    //合理性,所以不会超出,这里使用全局参数,数据总条数+1保证不出现极端情况
                    to_page(totalRecord + 1);
                }else{
                    //失败,显示信息,有几个就显示几个
                    //undefined 就是没找到这个错误,说明正确,可用alert(result.extend.errorFields.empName)验证
                    //用户名格式
                    //alert(result.extend.errorFields.empName)

                    //用户名格式和查重,因为查重的属性格式和格式验证不同,所以不能分开
                    //result.extend.errorFields.empName 格式验证
                    //result.extend.empName 查重验证
                    if(undefined != result.extend.errorFields ){
                        //格式错误
                        if(undefined != result.extend.errorFields.empName){
                            show_validate_msg("#empName_add_input","error",result.extend.errorFields.empName);
                        }
                    }else{
                        if(undefined != result.extend.empName){
                            //查重错误
                            show_validate_msg("#empName_add_input","error",result.extend.empName);
                        }
                    }
                    //邮箱格式判断
                    if(undefined != result.extend.errorFields){
                        if(undefined != result.extend.errorFields.email){
                            show_validate_msg("#email_add_input","error",result.extend.errorFields.email);
                        }
                    }
                }
            }
        });
    });

    //新增保存信息--请求按钮JQuery格式总校验方法
    function validate_add_form() {
        console.log("validate_add_form()")
        //1.拿到校验的数据,使用正则表达式
        //根据bootstrap提供的组件
        //校验用户名
        var empName = $("#empName_add_input").val();
        var regName = /(^[a-zA-Z0-9_-]{2,8}$)|(^[\u2E80-\u9FFF]{2,5})/;
        if (!regName.test(empName)) {
            //alert("用户名可以是2-5位中文或者2-8位英文和数字的组合");
            show_validate_msg("#empName_add_input", "error", "用户名可以是2-5位中文或者2-8位英文和数字的组合");
            return false;
        } else {
            show_validate_msg("#empName_add_input", "success", "");
        }
        //2、校验邮箱信息
        var email = $("#email_add_input").val();
        var regEmail = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
        if (!regEmail.test(email)) {
            //alert("邮箱格式不正确");
            show_validate_msg("#email_add_input", "error", "邮箱格式不正确");
            return false;
        } else {
            show_validate_msg("#email_add_input", "success", "");
        }
        //最后方法通过
        return true;
    }

    //新增保存信息--添加css样式
    //show_validate_msg显示校验状态,通过添加样式,ele表示被选择元素,status状态
    //用来判断是用什么样式,绿色、红色,msg提示信息
    function show_validate_msg(ele, status, msg) {
        //判断之前先清空之前样式
        $(ele).parent().removeClass("has-success has-error");
        $(ele).next("span").text("");
        if ("success" == status) {
            $(ele).parent().addClass("has-success");
            $(ele).next("span").text(msg)
        } else if ("error" == status) {
            $(ele).parent().addClass("has-error");
            $(ele).next("span").text(msg)
        }
    }
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSM整合_实现增删改查_新增 的相关文章

  • 信号降噪方法

    傅里叶变换 只能获取一段信号总体上包含哪些频率的成分 xff0c 但是对各成分出现的时刻并无所知 对非平稳过程 xff0c 傅里叶变换有局限性 短时傅里叶变换 xff08 Short time Fourier Transform STFT
  • C++ 带通滤波

    Butterworth Filter Coefficients The following files are for a library of functions to calculate Butterworth filter coeff
  • python之collections

    collections是日常工作中的重点 高频模块 xff0c 包含了一些特殊的容器 xff0c 针对Python内置的容器 xff0c 例如list dict set和tuple xff0c 常用类型有 xff1a namedtuple
  • git 指定下载文件,目录

    1 创建路径 mkdir gitfile cd lt 路径 gt eg xff1a cd home gitfile 2 创建一个空的本地仓库 git init 3 连接远程仓库GitHub git remote add f origin l
  • Ubuntu v4l2 视屏流花屏问题

    之前用的好好解析YUV xff0c MJPEG 换了个核心板就不好使了 xff0c opencv3 4 6 gt gt gt opencv4 5 5 xff0c Mat xff0c cvMat xff0c IplImage 的类型转换也不好
  • qt qmake .qrc hasmodification time xxx in the future

    原因 xff1a 跨平台生成的 qrc 文件创建时间与目标平台时间不一致导致 xff0c 如win写的 copy 到 Linux xff0c 再编译可能会遇到该bug 导致无法qmake 与 build 解决 xff1a touch qrc
  • (转)python图像操作

    转自 xff1a zbxzc 侵删 使用PIL完成 python view plain copy span class hljs keyword import span Image span class hljs comment 打开图像
  • 关于input to reshape is a tensor 的问题

    span class hljs keyword for span index name span class hljs operator in span enumerate classes class path 61 cwd 43 name
  • mobileNet训练自己的样本

    span class hljs keyword import span matplotlib pyplot span class hljs keyword as span plt span class hljs keyword import
  • 关于屏幕适配之比例布局

    对于平板等需求场合 xff0c 它们的屏幕比例以16 xff1a 10和16 xff1a 9等为主 xff0c 但是屏幕尺寸各异 xff0c 分辨率各异 xff0c 即便是同一尺寸也有多种分辨率 xff0c 这种时候无论是使用dp还是px
  • 机器学习实战:ValueError: invalid literal for int() with base 10: '0.000000'

    在logistic回归一章中 xff0c 在将训练数据转换为int型时 xff0c 会出现日下报错 xff1a ValueError invalid literal for int with base 10 0 000000 只需将下面一句
  • cuda-8.0安装心得

    cuda 8 0安装 xff08 这两天不小心把原来的显卡驱动搞崩 xff0c 挣扎了好久 xff0c 只好重新走一遍 xff09 cuda 安装条件 gcc5 3 0 xff08 版本不能太高 xff09 sudo apt get ins
  • 在GPU刨过的坑

    这两天回学校这两天先是把自己的linux系统给强制删除了 xff0c 然后导致重启无法正常引导进入win xff0c 最后win也救不活了 xff0c 还不好重装系统 xff0c 各种文件损坏 xff0c 简单粗暴的翻车血泪史 捷径路上总是
  • [ArchLinux] 搜狗拼音输入法的安装

    配置源 在ArchlinuxCN源中有很多方便中国用户使用的包 xff0c 其中也包含了经常使用的搜狗拼音输入法 xff0c 于是我们需要先配置ArchlinuxCN源 xff0c 这样我们就可以使用自带的包管理器Pacman直接安装搜狗拼
  • [ArchLinux] 安装及KDE桌面环境安装配置

    ArchLinux 安装及KDE桌面环境安装配置 首先 xff0c 安装之前 xff0c 需要一个 启动介质 xff0c 我这里习惯使用USB设备作为启动介质 xff0c 这是由于ArchLinux滚动更新的特性 xff0c 而且占用空间很
  • 使用crontab执行定时任务时加flock独占锁防止进程堆积

    使用crontab执行定时任务 此处为每分钟执行一次 加flock独占锁防止进程堆积 注意给 var run 读写权限 xff0c 或者放到一个有读写权限的文件夹 span class token operator span span cl
  • macOs 安装liplpcap

    1 xff0c 下载liplpcap http www tcpdump org 1 在tcpdump网站下载libpcap的latest release 2 tar zxvf 3 configure make amp make instal
  • Android应用开发常用知识(4)

    Android string 中product的使用 Android的资源文件string xml会出现下面同名的字符串 xff1a lt string name 61 34 build type 34 product 61 34 tv 3
  • VR行业的发展现状和前景

    5G技术的应用推广 xff0c 加速推动虚拟现实不断发展和完善 xff0c VR产业迅速在各个领域和行业都得到广泛应用 xff0c 最好直观的感受就是知觉体验得到了良好的增强作用 本文的主要内容是简单概括VR技术的发展现状和发展前景 一 V
  • org.apache.ibatis.annotations不存在

    今天遇到了一个很有意思的bug 有人 xff08 还不止一个人 xff09 来问我 xff0c 为什么项目启动不了 xff0c 我说不可能啊 xff0c 我这不跑得好好的吗 xff0c 而且成功启动的也不止我一个啊 然后他就说 xff0c

随机推荐

  • 【学习笔记】Ubuntu双系统+搭建个人服务器

    Ubuntu双系统 43 搭建个人服务器 前言1 Ubuntu 43 Win双系统1 1 制作U盘启动盘1 2 系统分盘1 3 安装Ubuntu系统 2 搭建个人服务器2 1 设置root2 2 配置ssh2 3 向日葵连接 3 内网穿透3
  • (原创)开发微信公众平台遇到的乱码等问题的解决

    1 ngrok内网映射问题 首先这个工具是外国人写的 服务器也在国外 但是tunnel部属在国内 支持ngrok绝大多数功能 http www tunnel mobi 命令行中使用方法 在CMD命令中先切换到ngrok所在的位置再进行如下操
  • iOS给应用添加支持的文件类型/根据文件类型打开应用

    iOS给应用添加支持的文件类型 根据文件类型打开应用 之前写过类似的文章 IOS UTI 统一类型标识符 根据文件后缀打开APP 和 自定义UTI 注册你的APP所支持的文件类型 这里 再次总结说明 已经存在的UTL类型 苹果官方文档提供了
  • 编程之美 -- 中国象棋将帅问题

    下过中国象棋的朋友都知道 xff0c 双方的 将 和 帅 相隔遥远 xff0c 并且它们不能照面 在象棋残局中 xff0c 许多高手能利用这一规则走出精妙的杀招 假设棋盘上只有 将 和 帅 二子 xff08 为了下面叙述方便 xff0c 我
  • C++单元测试工具 -- CppUnit

    CppUnit 作为C 43 43 语言的一款测试工具 xff0c 其实也是一个开源项目 xff0c 与JUnit一样 xff0c 用来方便开发人员进行单元测试的工具 项目地址 xff1a http sourceforge net apps
  • 拒绝游戏!发愤图强!

    立帖为证 xff01 xff01 xff01
  • C++ STL — 第6章 STL容器(二)deque

    C 43 43 STL容器deque和vector很类似 xff0c 也是采用动态数组来管理元素 使用deque之前需包含头文件 xff1a include lt deque gt 它是定义在命名空间std内的一个class templat
  • C++ STL — 第6章 STL容器(三)list

    一 list基础 List使用一个双向链表来管理元素 图一显示了list的结构 图一 list的结构 任何型别只要具备赋值和可拷贝两种性质 xff0c 就可以作为list的元素 二 list的功能 list的内部结构和vector和dequ
  • STL list remove和sort函数

    include lt iostream gt include lt list gt include lt iterator gt using namespace std bool cmp int a int b return a gt b
  • 排序 -- 简单选择排序

    选择排序 思想 xff1a 每一趟 n i 43 1 xff08 i 61 1 2 3 n 1 xff09 个记录中选择关键字最小的记录作为有序序列的第i个记录 简单选择排序 xff1a 通过n i次关键字间的比较 xff0c 从n i 4
  • HDOJ 1106 排序

    题目地址 xff1a http acm hdu edu cn showproblem php pid 61 1106 Problem xff1a 输入一行数字 xff0c 如果我们把这行数字中的 5 都看成空格 xff0c 那么就得到一行用
  • ftp创建文件权限问题

    一 问题 有一个这样的需求 xff0c admin为一个Linux为其FTP应用创建的一个有权限限制的用户 xff0c 通过admin用户可以进行登录FTP服务 xff0c 登录FTP服务后 xff0c 创建文件夹 xff0c 该文件夹的用
  • lottie加载动画,第一次有延迟问题

    lottie是airbnb推出的一个直接将AE工程转化为动画的工具 ae project gt data json gt LottieComposition gt Lottie动画 之前做一个比较复杂的动画 xff0c 花了两天时间都在画各
  • CentOS 7防火墙快速开放端口配置方法

    CentOS 7防火墙快速开放端口配置方法 这篇文章主要为大家详细介绍了CentOS 7防火墙开放端口的快速方法 xff0c 感兴趣的小伙伴们可以参考一下 一 CentOS 7快速开放端口 xff1a CentOS升级到7之后 xff0c
  • C语言unsigned char、char与int之间的转换

    C语言unsigned char char与int之间的转换 2016年10月23日 18 40 50 bladeandmaster88 阅读数 xff1a 11347更多 个人分类 xff1a c语言基础 先来看一道题 xff1a cha
  • Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

    1 jvm 堆内存 dalvik 堆内存 不同手机中app进程的 jvm 堆内存是不同的 xff0c 因厂商在出厂设备时会自定义设置其峰值 比如 在Android Studio 创建模拟器时 xff0c 会设置jvm heap 默认384m
  • RabbitMq(一) RabbitMq工作模型

    RabbitMq工作模型 Mq基础RbbitMq工作模型RabbitMq基本使用原生apiSpring集成Springboot集成 RabbitMq进阶知识订单延迟关闭队列满了 总结 Mq基础 message queue 消息队列 特点 x
  • SSM整合_实现增删改查_基础环境搭建

    写在前面 SSM整合 年轻人的第一个增删改查 基础环境搭建 SSM整合 年轻人的第一个增删改查 查找 SSM整合 年轻人的第一个增删改查 新增 SSM整合 年轻人的第一个增删改查 修改 SSM整合 年轻人的第一个增删改查 删除 GitHub
  • SSM整合_实现增删改查_查找

    写在前面 SSM整合 年轻人的第一个增删改查 基础环境搭建 SSM整合 年轻人的第一个增删改查 查找 SSM整合 年轻人的第一个增删改查 新增 SSM整合 年轻人的第一个增删改查 修改 SSM整合 年轻人的第一个增删改查 删除 GitHub
  • SSM整合_实现增删改查_新增

    写在前面 SSM整合 年轻人的第一个增删改查 基础环境搭建 SSM整合 年轻人的第一个增删改查 查找 SSM整合 年轻人的第一个增删改查 新增 SSM整合 年轻人的第一个增删改查 修改 SSM整合 年轻人的第一个增删改查 删除 GitHub