点击阅读上一章
Spring mvc 数据绑定流程:
SpringMvc 将 ServletRequest 对象及目标方法的形参实例传给 webDataBinderFactory 实例, 以创建 DataBinder 实例对象. DataBinder 调用装配在 SpringMvc 上下文中的 ConversionService 组件进行类型转换和数据格式化工作, 将 Servlet 请求信息填充到形参对象中. 调用 Validator 主键对已经绑定了请求信息的形参对象精选数据有效性验证, 并最终生成数据绑定结果 BindingData 对象. SpringMVC 抽取 BindingResult 中的形参对象和校验错误对象, 将他们赋给处理方法的相应参数
我们查看源代码可以看到, 通过 WebDataBinderFactory 创建 DataBinder 对象
自定义类型转换器
当我们碰到一些特殊场合, 有可能需要我们自己定义类型转换器. 下麦呢来讲解一个自定义类型转器, 将字符串转换成 emp 对象, 当页面无法完成数据绑定或者类型转换时, springmvc 会抛出异常, 异常信息可以使用 BindingResult 来进行获取.
Spring 定义了三种类型的转换器接口, 实现任意一个转换器接口都可以作为自定义转换器注册到 ConversionServiceFactoryBean 中.
Convertre<S,T>: 将 S 类型转换为 T 类型.
ConverterFactory: 将相同系类的多个 "同质"Converter 封装在一起, 如果希望一种类型转换成另一种类型以及子类对象 (例如 String 转换成 Number 以 Number 的子类), 可以使用该转换器
GenericConverter: 会根据源类对象以及目标类对象所在的宿主类中的上下文信息精选类型转换.
- package com.spring.mvc.controller;
- import org.springframework.core.convert.converter.Converter;
- import org.springframework.stereotype.Component;
- @Component
- public class UserConverter implements Converter<String, User>{
- @Override
- public User convert(String source) {
- System.out.println(source);
- String users [] = source.split("-");
- User user = new User();
- user.setUno(Integer.valueOf(users[0]));
- user.setUsername(users[1]);
- user.setUserpass(users[2]);
- return user;
- }
- }
ConversionService 时 SpringMVC 中类型转换器的核心接口, 要添加自定义类型转换器, 需要实现该接口 / 利用 ConversionServiceFactoryBean 在 Spring 的 IoC 容器中第一一个 ConversionService, 并在 Bean 属性配置对于的类型转换器的实现类, SpringMvc 处理方法的形参绑定时就会自动调用该类型转换器.
- <!-- 将非 mapping 配置下的请求交给默认的 Servlet 来处理 -->
- <mvc:default-servlet-handler />
- <bean id="conversionService"
- class="org.springframework.context.support.ConversionServiceFactoryBean">
- <property name="converters">
- <set>
- <ref bean="userConverter" />
- </set>
- </property>
- </bean>
- <!-- 注册类型转换器 -->
- <mvc:annotation-driven conversion-service="conversionService" />
在实际的开发同需要配置:<mvc:annotation-driven /> 标签
数据格式化
对属性的输入 / 输出格式化, 其本质来讲依然属于类型转换的范畴. Spring 在格式化模块中定义一个实现 ConversionService 接口的 FarmattingConversionService 实现类, 该实现类扩展了 GenericConversionService, 因此它既具有类型转换的功能有具有格式化的功能. FormattingConversionService 拥有一个 FormattingConversionServiceFactoryBean 工厂类, 后者用于构造前者. 我们要注册这个
- <mvc:annotation-driven conversion-service="FormattingConversionServiceFactoryBean"
- />
- JSR303
jsr303 时 java 为 bean 数据合法性校验提供的标准框架, 它已经包含在 JavaEE6.0 中, JSR303 通过在 Bean 属性上标注类似 @NotNull,@Max 等标准的数据指定验证规则, 并通过标注的验证接口对 Bean 进行验证.
- @NotEmpty
- @NotNull
- private String name;
- @NotNull
- @NotEmpty
- private String age;
- @NotNull
- @NotEmpty
- private String email;
我们在前台使用 SpringMVC 提供的 Form 标签使用 Form:errors path 绑定属性即可
- @RequestMapping(value="/student",method=RequestMethod.POST)
- public String add(@Valid()Student student,BindingResult result){
- if (!result.hasErrors()) {// 判断是否有格式转换错误或者其他校验没通过
- userService.addStudent(student);
- return "redirect:list";
- }else
- return "addPage";
- }
SpringMvc 提示消息国际化
- <!-- 注册国际化信息, 必须有 id, 指定资源文件名称, 资源文件在 src 目录下 -->
- <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
- <property name="basename" value="message"></property>
- </bean>
来源: https://www.cnblogs.com/SimpleWu/p/9713536.html