类型转换器使用
ConversionServiceFactoryBean
格式化数据 注解 依赖的bean为:
FormattingConversionServiceFactoryBean
如上图所示,可以看到两者只相差了Formatting,进入源码
发现这两个类中都包含converters属性,所以,当前数据格式化的注解所依赖的bean可以把原类型转换器依赖的bean给替换掉
删除以后发现mvc注解驱动报错:
如下图
根据提示看到FormattingConversionServiceFactoryBean的id值与Spring core
重复了,改为conversionService2
格式化数据注解 @DateTimeFormat
在对象属性上面添加注解,并设置pattern值
日期格式通常为“yyyy-MM-dd”:年月日
这个固定前端传过来的日期格式必须是:2022-11-09 这种格式,其他写法如:2022/11/09都不可以
public class Account {
private int cardNo;
private String name;
private String password;
private Double balance;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
//get set方法
//构造方法
//toString()
}
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/test/testFormat" method="post">
卡号:<input type="text" name="cardNo"><br/>
账户:<input type="text" name="name"><br/>
密码:<input type="text" name="password"><br/>
余额:<input type="text" name="balance"><br/>
生日:<input type="text" name="birthday"><br/>
<input type="submit" value="点击提交数据">
</form>
</body>
</html>
Contrller
直接打印form表单提交过来的数据
@RequestMapping("/testFormat")
public String testFormat(Account account){
System.out.println(account);
return "success";
}
tomcat运行
input中用户提交的是String类型的数据“1997-04-20”,经过@DateTimeFormat注解转换为java.util.Date格式
用户输入错误的格式
BindingResult获取错误信息
通过BindingResult收集验证错误信息
@RequestMapping("/testFormat")
public String testFormat(Account account, BindingResult bindingResult){//报错信息会保存在bindingResult对象中
System.out.println(account);
//打印报错信息
if(bindingResult.getErrorCount()>0){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
System.out.println(fieldError.getDefaultMessage());
}
}
return "success";
}
Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'birthday'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.util.Date] for value '1997/04/20'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [1997/04/20]
发现格式错误也运行成功,因为对BindingResult的处理相当于trycatch,处理异常,所以不会报错
也可以把报错信息在success.jsp页面打印出来,放到request作用域中
@RequestMapping("/testFormat") //报错信息会保存在bindingResult对象中
public String testFormat(Account account,
BindingResult bindingResult,
Map<String,Object> map)
{
System.out.println(account);
//打印报错信息
if(bindingResult.getErrorCount()>0){
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
System.out.println(fieldError.getDefaultMessage());
}
map.put("errors",fieldErrors);
}
return "success";
}
前端取值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="lyx" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
报错如下:
<div>
<lyx:forEach items="${requestScope.errors}" var="error">
${error.getDefaultMessage()}
</lyx:forEach>
</div>
</body>
</html>
tomcat运行,控制台和前端报错信息一致
注意:
报错信息
BindingResult bindingResult
必须是方法第二个形参
因为它保存的是前一个形参的错误信息,
总结:
public String testFormat(Account account, BindingResult bindingResult, Map<String, Object> map) { //打印错误信息 //把错误信息放到request作用域中 }
需要验证的数据是Account中的birthday,springMVC要求,如果校验失败,则将错误信息自动放入改对象之后,下一个BindingResult中,中间不能插入其他参数,即Account account,BindingResult result 之间不能由其他参数。
如果要将控制台的错误信息,传值给.jsp页面,可以通过Map放到request作用域中
@NumberFormat
对象属性添加@NumberFormat
@NumberFormat(pattern = "###,###")
private int cardNo;
input用户输入100,553,@NumberFormat注解可以转换为int类型数据100553,输出结果如下: