SpringMVC(四)
- SpringMVC数据的格式化
以Date格式为例
配置:
<mvc:annotation-driven></mvc:annotation-driven>
在类变量处用注解标注
@DateTimeFormat(pattern="yyyy-mm-dd")
private Date birth;
//pattern为输入样式
例2:
@NumberFormat(pattern="#,###,###.#")
输入:1,234,567,8
输出:1234567.8
- 当类型转换失败时,如何得到错误消息
DataBinder会把错误信息放入到BinderResult里面,则可以在目标方法加入形参 BindingResult result
通过result的内置方法可以得到错误信息。
@RequestMapping(value="/emp",method=RequestMethod.POST)
public String save(Employee employee,BindingResult result) {
if(result.getErrorCount() > 0) {
System.out.println("出错啦!!");
for(FieldError error:result.getFieldErrors())
System.out.println(error.getField()+":"+error.getDefaultMessage());
}
System.out.println("save:"+employee);
employeeDao.save(employee);
return "redirect:/emps";
}
- JSR303数据校验
JSR303 通过在bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证
HibernateValidator是JRS303的一个参考实现,除支持所有标准的校验注解外,还支持以下扩展注解。
注解 | 功能 |
---|---|
被注释的元素必须是电子邮箱地址 | |
@Length | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 被注释的字符串必须为非空 |
@Range | 被注释的元素必须在合适的范围内 |
JSR 303校验方法:
1、导入hibernate Validator 的jar包,加入hibernate Validator 验证框架
2、在SpringMVC 配置文件中添加<mvc:annotation-driven/>
3、需要在bean的属性上添加对应的注解
4、在目标方法bean类型的签名添加@Valid注解
public String save(@Valid Employee employee,BindingResult result){
...
}
注意!!:需校验的Bean对象和其绑定结果对象或错误对象是成对出现的,它们之间不允许声明其他的入参
- SpringMVC错误消息的显示及国际化,错误后指向页面
-显示:可通过<form:erroes path="字段名">
显示错误信息
-指向页面:通过BindingResult的判断来进行指向页面的指定,必要可进行表单回显。
public String save(@Valid Employee employee,BindingResult result,Map<String,Object> map) {
if(result.getErrorCount() > 0) {
map.put("departments", departmentDao.getDepartments());
map.put("employees", employeeDao.getAll());
return "add";
}
-定制国际化错误信息显示
当一个属性校验失败后,校验框架会为该属性生成4个消息代码,这些代码以校验注解类名为前缀,结合modelAttribute、属性名及属性类型名生成多个消息代码。
当使用SpringMVC标签显示错误消息时,SpringMVC会查看WEB上下是否装配了对应的国际化消息,如果没有,则会显示默认的错误消息,否则使用国际化消息。
1、创建properties文件定制
格式:
键:校验注解名 . 类名(首字母小写). 属性名
值:提示的消息
2、配置国际化资源文件
SpringMVC配置文件中:
例:errorsmsg.properties
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="errorsmsg"></property>
</bean>
提示消息的国际化
若数据类型转换或数据格式转换时发生错误,或该有得参数不存在,或调用处理方法时发生错误,都会在隐含模型中创建错误消息。其错误代码前缀说明如下:
-required:不要参数不存在。如@RequiredParam(“param1”)标注了一个入参,但该参数不存在
-typeMismatch:在数据绑定时,发生数据类型不匹配的问题
-methodInvocation:SpringMVC在调用处理方法时发生了错误
- SpringMVC返回Json
1、加入jar包
2、编写目标方法,返回JSON对应的对象或集合
3、加入注解@ResponseBody
@ResponseBody
@RequestMapping("/testJson")
public Collection<Employee> testJson(){
return employeeDao.getAll();
}
- HTTPMessageConverter< T >
使用HTTPMessageConverter< T >将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring提供了两种途径:
-使用@RequestBody / @ResponseBody 对处理方法进行标注
-使用HTTPEntity< T > / ResponseEntity< T > 作为处理方法的入参或返回值
当控制器处理方法使用到上面的标注时,Spring首先根据请求头或响应头的Accept属性选择匹配的HTTPMessageConverter,进而根据参数类型或泛型类型的过滤匹配的HTTPMessageConverter,若找不到可用的HTTPMessageConverter将报错。
注意::@RequestBody和@ResponseBody不需要成对出现
@RequestBody / @ResponseBody :可实现上传功能
HTTPEntity< T > / ResponseEntity< T > :可实现下载功能
- 国际化
关于国际化:
1、在页面上能够根据浏览器语言设置的情况对文本,时间,数值进行本地化处理
2、可以在bean中获取国际化资源文件locale对于的消息
3、可以通过超链接切换Locale,而不再依赖于浏览器的语言设置情况
解决:
1、使用JSTL的fmt标签
分别设置对应的资源文件
2、在bean中注入ResourceBundleMessageSource的示例,使用其对应的getMessage方法即可
3、配置LocalResolver和LocaleChangeInterceptor