- 问题:① 数据类型的转换、格式化 ② 数据校验 ③校验后数据的处理④怎么在页面显示错误消息,以及消息的定制⑤处理json⑥为什么上传文件的表单里要加个属性enctype
解决:① 加入mvc:annotationDriven。。。,其默认创建
ConversionService的实例为FormatingConversionServiceFactoryBean;
在所需格式化的entity上加入注解(@DatetimeFormat(pattern=”yy-MM-DD”)
@NumberFormat(pattern=”#,###,###.#”
)
② ( 使用jsr303 [ hibernate validator 支持@Email @NotEmpty @length])使用注解 (@NotNull @past @future …)
步骤:加入jsr303 jar包(只要加入hibernate validator的jar);加入mvc:annotationDriven。。。,其默认创建LocaleValidatorFactoryBean;在对应的handler方法,在其所需校验的参数前(一般为某一entity实例)加入@valid注解即可
③BindingResult result原来存取验证的错误信息
public class Employ {
private Integer id;
@NotEmpty
private String lastName;
@Email
private String email;
//1表示男,2表示女
private Integer gender;
private Department department;
@Past
@DateTimeFormat(pattern="yy-MM-dd")
private Date birth;
@NumberFormat(pattern="#,###,###.#")
private Double salary;
//增加完成,回显数据
@RequestMapping(value="/emp",method=RequestMethod.POST)
public String writeEmp(@Valid Employ employ,BindingResult br,Map<String,Object> map){
System.out.println(employ);
employDao.saveEmploy(employ);
System.out.println(employ);
if(br.getErrorCount() > 0){
System.out.println("出错了!");
for(FieldError fe:br.getFieldErrors()){
System.out.println(fe.getField()+"--"+fe.getDefaultMessage());
}
}
map.put("departments", departmentDao.getDepartments());
map.put("employ", employ) ;
return "input";
}
注意:
public String writeEmp(@Valid Employ employ,BindingResult br,Map<String,Object> map)
需要校验的bean和其对应的BindingResult br之间不可以有其他的入参【必须连着,但可以有多高待检验的bean和result】
④ 在form中加入
即可完成错误消息的显示
定制错误消息:配置国际化资源文件(i18n.properties文件,需要配置resourceBundleMessageSource的bean),错误消息的键值对,键是校验注解的类名(Email,Past…没有@符号).对应bean在域对象中的属性名(一般是类名第一个字母小写).对应的bean中的属性名【NotEmpty.employ.lastName=lastName不可以是空值】;而值就是自己定制的错误消息
⑤ 加入jar包(三个core,databind,annotation),对应的handler方法用@responseBody注解修饰,入参使用@requestBody修饰;或者使用httpEntity《T》、responsEntity《T》{此处使用书名号。由于尖括号后面文字显示会异常}
$(function(){
$("#testJson").click(function(){
var href = this.href;
var args = {};
$.post(href,args,function(data){
for(var i=0;i<data.length;i++){
var lastName = data[i].lastName;
var id = data[i].id;
alert(id+" : "+lastName);
}
});
return false;
});
})
@ResponseBody
@RequestMapping(value="testJackson")
public Collection<Employ> testJason(){
return employDao.getEmployees();
}
⑥
enctype属性有三个值
1 application/x-www-form-urlencoded (默认值)
2 multipart/form-data
3 text/plain
其中1application/x-www-form-urlencoded是默认值,大家可能在AJAX里见过这个:xmlHttp.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”); 这两个要做的是同一件事情,就是设置表单传输的编码。在AJAX里不写有可能会报错,但是在HTML的form表单里是可以不写enctype=”application/x-www-form-urlencoded”的,因为默认HTML表单就是这种传输编码类型。而2multipart/form-data是用来指定传输数据的特殊类型的,主要就是我们上传的非文本的内容,比如图片或者mp3等等。3text/plain是纯文本传输的意思,在发送邮件时要设置这种编码类型,否则会出现接收时编码混乱的问题,网络上经常拿text/plain和text/html做比较,其实这两个很好区分,前者用来传输纯文本文件,后者则是传递html代码的编码类型,在发送头文件时才用得上。1和3都不能用于上传文件,只有multipart/form-data才能完整的传递文件数据。