每天学点SpringMVC-数据绑定以及格式化

1. springmvc的数据绑定流程

如图,根据request参数和方法入参会生成一个DataBinder对象,然后会由ConversionService进行数据类型转换以及Validator进行数据校验最终生成BindingResult对象

(反正是这个意思吧,:-D)

2. 自定义数据转化器

  2.1 编辑自定义转换器并实现Converter接口

/**
 * Created by pawn on 2017/9/23.
 */
@Component
public class EmployeeConvertor implements Converter<String,Employee> {

    @Autowired
    DepartmentDao departmentDao ;

    @Override
    public Employee convert(String s) {
        //GG-gg@pawn.com-1-1
        if(s != null){
            String[] vals = s.split("-") ;
            if(vals != null || vals.length == 4){
                String lastName = vals[0] ;
                String email = vals[1] ;
                int gender = Integer.parseInt(vals[2]) ;
                int departmentId = Integer.parseInt(vals[3]) ;
                Department department = departmentDao.getDepartment(departmentId);
                return new Employee(null,lastName,gender,email,department) ;
            }
        }
        return null;
    }
}

 2.2 spring-mvc中进行配置

 <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"></mvc:annotation-driven>

    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="employeeConvertor"></ref>
            </set>
        </property>
    </bean>

 2.3 编写目标方法使用

@RequestMapping(value = "/savewithstring.do")
    public String savaWithString(@RequestParam("employee") Employee employee){
        System.out.println("=========>Save");
        employeeDao.save(employee) ;
        return "redirect:../page/emp/list.do" ;
    }

  2.4 EmployeeConverter转换器会将string类型参数转换为Employee对象,有一点不明白的是,之前提到的目标方法参数没有@RequestParam注解,但是表单里面的各个字段能自动填充到Employee对象中,如果有大神能看到,求帮忙留言解惑!

3. <mvc:annotation-driven>作用

原理一窍不通,不过我想的是这个注解一定要加上,否则估计会生成很多奇怪的问题

4 . @InitBinder注解

5. 数据格式化

   5.1 保证spring-mvc.xml中有<mvc:annotation-driven>注解

        自定义conversion-service时需要使用 FormattingConversionServiceFactoryBean

   5.2 在目标属性中添加@DateTimeFormat和@NumberFormat等注解

   5.3 个人理解: 目标方法的入参如果有@ModelAttribute注解应该和无注解一样,是已经经过数据转换、数据绑定以及数据格式化后的最终产物,而加了@RequestParm注解的入参只是经过数据转换的中间产物,瞎想的,如果有误,麻烦留言更正

原文地址:https://www.cnblogs.com/xpawn/p/7582361.html