您的位置:首页 > 编程语言 > Java开发

springmvc相关问题及解决方法

2015-08-31 21:29 465 查看
问题:① 数据类型的转换、格式化 ② 数据校验 ③校验后数据的处理④怎么在页面显示错误消息,以及消息的定制⑤处理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才能完整的传递文件数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息