我是靠谱客的博主 听话帽子,最近开发中收集的这篇文章主要介绍08.SpringMVC_数据绑定的流程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.当我们提交表单,将表单中的数据绑定的方法的入参的对象中时,会涉及到数据绑定的流程,数据绑定的流程分为:数据类型转换、数据格式化、数据校验

  1. 数据类型转换
  • SpringMVC默认为我们装配了以下类型转换器:
  • 如果SpringMVC默认的类型转换器不能满足我们的需求,我们可以自定义类型转换器,如:将一个字符串转换为Employee对象
    • 创建一个类实现Converter<S,T>接口
public class MyConverter implements Converter<String, Employee> {
   //  Tom-tom@atguigu.com-1-101 这种格式的写法转换
     @Override
     public Employee convert(String arg0) {
         Employee employee  = null;
          if( arg0 != null){
             String[] split = arg0.split( "-");
              if( split != null && split. length == 4){
                  //获取姓名
                 String lastName = split[0];
                  //获取邮箱
                 String email = split[1];
                  //获取性别
                  int gender = Integer.parseInt( split[2]);
                  //获取部门的id
                  int deptId = Integer.parseInt( split[3]);
                  //创建Employee对象
                  employee  = new Employee();
                  employee.setLastName( lastName);
                  employee.setEmail( email);
                  employee.setGender( gender);
                  employee.setDepartment( new DepartmentDao().getDepartment( deptId));
             }
         }
          return employee;
    }
}
  • 在SpringMVC配置文件中配置自定义的类型转换器
  <!-- 配置类型转换器 -->
     < bean id= "conversionService" class= "org.springframework.context.support.ConversionServiceFactoryBean" >
         < property name= "converters" >
              < set >
                  < bean class= "com.atguigu.springmvc.converter.MyConverter" ></ bean >
              </ set >
         </ property >
     </ bean >
     < mvc:annotation-driven conversion-service= "conversionService" ></ mvc:annotation-driven >
这个必须写在 < mvc:annotation-driven ></ mvc:annotation-driven >之前才行
// 测试自定义转换器
     @RequestMapping(value = "/testMyConverter", method = RequestMethod. POST)
     public String testMyConverter( @RequestParam( "employee") Employee employee) {
        // 保存该员工
       System. out.println( employee);
        employeeDao.save( employee);
        return "redirect:/getEmployees";
    
  • 备注:
   在Handler中通过 @InitBinder这个标签在数据绑定的过程不允许给某一个属性赋值
 @InitBinder
    public void initGender(WebDataBinder dataBinder){
        //数据绑定的过程不允许给性别赋值
        dataBinder.setDisallowedFields("gender");
    }
  • @InitBinder方法不能有返回值,它必须声明为void。
  • @InitBinder方法的参数通常是 WebDataBinder

  • 备注:
<mvc:annotation-driven/>配置在什么时候必须配置?
  1. 直接配置响应的页面:无需经过控制器来执行结果 ;但会导致其他请求路径失效,需要配置mvc:annotation-driven标签<mvc:view-controller path="/success" view-name="success"/>
  2. 通过jQuery执行delete请求时,找不到静态资源,需要配置mvc:annotation-driven标签   
  3. 配置类型转换器服务时,需要指定转换器服务引用<mvc:annotation-driven conversion-service=“conversionService”/> 会将自定义的ConversionService 注册到 Spring MVC 的上下文中
  4. 数据验证,也需要配置 
3.数据的格式化
  • 我们可以通过@DateTimeFormat和@NumberFormat注解对应日期和数据进行格式化,只需要在要格式化的类的属性上添加以上注解即可
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private Date birthday;
     @NumberFormat(pattern= "#,###,###.##")
     private double salary;
  • 要使@DateTimeFormat和@NumberFormat注解起作用,必须配置<mvc:annotation-driven></mvc:annotation-driven>
< mvc:annotation-driven ></ mvc:annotation-driven >
配置,配置时不能指定conversion-service属性 ,否则,依然报错 400 。要把 <mvc:annotation-driven conversion-service="conversionService"/>注掉才行
备注:
FormattingConversionService 实现类, 既具有类型转换的功能,又具有格式化的功能
  • <mvc:annotation-driven/> 默认创建的 ConversionService 实例即为
  DefaultFormattingConversionService
4.数据校验
  • 我们可以通过Hibernate Validator进行数据校验,使用它需要到导入以下jar包
    classmate-0.8.0.jar
    hibernate-validator-5.0.0.CR2.jar
    hibernate-validator-annotation-processor-5.0.0.CR2.jar
    jboss-logging-3.1.1.GA.jar
    validation-api-1.1.0.CR1.jar
  • 然后在要校验的属性上添加对应的注解
     @NotEmpty
     private String lastName;
    
     @Email
     private String email;
    
     @Past
     private Date birthday;
  • 在要校验的属性对应的对象的前面添加@Valid注解,同时紧挨着该对象传入BindingResult类型的入参,通过它获取异常信息
// 添加新员工
     @RequestMapping(value = "/emp", method = RequestMethod. POST)
     public String addEmployee( @Valid Employee employee , BindingResult result) {
          // BindingResult结果集对象必须紧挨着被校验的employee对象,中间不能有其他参数
//       System.out.println(employee);
          int errorCount = result.getErrorCount();
          if( errorCount > 0){
              //证明有错误信息
             List<FieldError> fieldErrors = result.getFieldErrors();
              for (FieldError fieldError : fieldErrors) {
                  //获取出现异常的属性
                 String field = fieldError.getField();
                  //获取异常信息
                 String message = fieldError.getDefaultMessage();
                 System. out.println( field+ ":"+ message);
             }
              //转发到输入用户信息的页面
              return "input";
         }
          // 保存用户
          employeeDao.save( employee);
          return "redirect:/emps";
    }
  • 要想当校验的注解起作用,必须配置<mvc:annotation-driven></mvc:annotation-driven>
< mvc:annotation-driven ></ mvc:annotation-driven >
  • 通过<form:errors></form:errors>表单在前端页面显示错误信息
  <!-- SpringMVC提供的表单默认表单中的数据是必须要回显的,默认情况下,SpringMVC会以command 作为key从request域中
          查询模型数据,然后回显,找不到则会抛出异常。我们可以通过form表单的modelAttribute属性来指定在request域中放的模型数据的key
      -->
     < form:form modelAttribute= "employee" >
          <!-- 如果path的值为通配符*,将显示所有的错误信息,如果要显示对应的错误信息,将该值设置为属性名即可-->
<%--          <form:errors path="*"> </form:errors> --%>
         <!-- path属性就相当于input中的name属性 -->
          <!-- 当员工的id为null,即在添加新员工时再显示姓名 -->   
          < c:if test= "${ empty requestScope.employee.id } " >   
             姓名: < form:input path= "lastName" /> < form:errors path= "lastName" ></ form:errors > < br >
          </ c:if > 
         <!-- 对应更新来说,需要将POST请求转换为PUT请求,所以需要传一个请求参数_method --> 
         < c:if test= "${! empty requestScope.employee.id } " >
              < form:hidden path= "id" />
              < input type= "hidden" name= "_method" value= "put" >
         </ c:if >
        邮箱: < form:input path= "email" /> < form:errors path= "email" ></ form:errors > < br >
        性别: < form:radiobutton path= "gender" value= "1" label= "男" />
              < form:radiobutton path= "gender" value= "0" label= "女" />< br >
        部门: < form:select path= "department.id" items= "${requestScope.depts } " itemValue= "id" itemLabel= "departmentName" ></ form:select >
              < br >
        生日: < form:input path= "birthday" /> < form:errors path= "birthday" ></ form:errors > < br >
        期望薪资: < form:input path= "salary" />< br >
              < input type= "submit" >
     </ form:form >
  • 国际化错误信息
    • 在SpringMVC的配置文件中配置国际化资源文件
<!-- 配置国际化资源文件 -->
     < bean id= "messageSource" class= "org.springframework.context.support.ResourceBundleMessageSource" >
         < property name= "basename" value= "i18n" ></ property >
     </ bean >
  • 国际化资源文件(i18n_zh_CN.properties)
NotEmpty.employee.lastName= u7528u6237u540Du4E0Du80FDu4E3Au7A7A
Email.employee.email= u90AEu7BB1u683Cu5F0Fu4E0Du6B63u786E
Past.employee.birthday= u4EB2u7231u7684uFF0Cu4F60u51FAu751Fu7684u65F6u95F4u8FD8u6CA1u5230uFF0Cu5728u4F60u5988u5988u809Au5B50u91CCu518Du5446u4E9Bu65F6u65E5u5427uFF01uFF01uFF01



最后

以上就是听话帽子为你收集整理的08.SpringMVC_数据绑定的流程的全部内容,希望文章能够帮你解决08.SpringMVC_数据绑定的流程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(27)

评论列表共有 0 条评论

立即
投稿
返回
顶部