springmvc相关问题及解决方法

本文介绍如何在Spring MVC中实现数据类型的转换与格式化、数据校验、错误消息的定制显示及JSON处理等内容,并解释了文件上传时表单属性enctype的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 问题:① 数据类型的转换、格式化 ② 数据校验 ③校验后数据的处理④怎么在页面显示错误消息,以及消息的定制⑤处理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才能完整的传递文件数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值