数据格式化1.基本介绍

说明:在我们提交数据(比如表单时),SpringMVC 是怎样对提交的数据进行转换和处理的

基本数据类型可以和字符串之间自动进行转换,比如:SpringMVC 上下文中内建了很多转换器,可以完成大多数 java 类型的转换工作。[相互转换,这里只列出部分]

ConversionService converters =    java.lang.Boolean-> java.lang.String:org.springframework.core.convert.support.ObjectToStringConverter@f874cajava.lang.Character -> java.lang.Number : CharacterToNumberFactory@f004c9java.lang.Character -> java.lang.String : ObjectToStringConverter@68a961java.lang.Enum -> java.lang.String : EnumToStringConverter@12f060ajava.lang.Number -> java.lang.Character : NumberToCharacterConverter@1482ac5java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory@126c6fjava.lang.Number -> java.lang.String : ObjectToStringConverter@14888e8java.lang.String -> java.lang.Boolean : StringToBooleanConverter@1ca6626java.lang.String -> java.lang.Character : StringToCharacterConverter@1143800java.lang.String -> java.lang.Enum : StringToEnumConverterFactory@1bba86ejava.lang.String -> java.lang.Number : StringToNumberConverterFactory@18d2c12java.lang.String -> java.util.Locale : StringToLocaleConverter@3598e1java.lang.String -> java.util.Properties : StringToPropertiesConverter@c90828java.lang.String -> java.util.UUID : StringToUUIDConverter@a42f23java.util.Locale -> java.lang.String : ObjectToStringConverter@c7e20ajava.util.Properties -> java.lang.String : PropertiesToStringConverter@367a7fjava.util.UUID -> java.lang.String : ObjectToStringConverter@112b07f……

2.基本数据类型和字符串自动转换

应用实例:基本数据类型可以和字符串之间自动地完成转换

(1)Monster.java

package com.li.web.datavalid.entity;/** * @author 李 * @version 1.0 */public class Monster {    private Integer id;    private String email;    private Integer age;    private String name;    public Monster() {}    public Monster(Integer id, String email, Integer age, String name) {        this.id = id;        this.email = email;        this.age = age;        this.name = name;    }    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @Override    public String toString() {        return "Monster{" +                "id=" + id +                ", email='" + email + '\'' +                ", age=" + age +                ", name='" + name + '\'' +                '}';    }}

(2)data_valid.jsp:

    SpringMVC[数据格式/验证等]

SpringMVC[数据格式/验证等]


<a href="https://www.cnblogs.com/liyuelian/archive/2023/02/14//addMonsterUI">添加妖怪

(3)MonsterHandler.java

package com.li.web.datavalid;import com.li.web.datavalid.entity.Monster;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import java.util.Map;/** * @author 李 * @version 1.0 * MonsterHandler 处理器响应用户提交数据 * @Scope(value = "prototype")表示每次请求MonsterHandler都会生成一个新的对象 */@Controller@Scope(value = "prototype")public class MonsterHandler {    /**     * 显示添加monster的页面     * 这里的 map,当我们向 map添加数据时,会默认存放到 request域中     * @param map     * @return     */    @RequestMapping(value = "/addMonsterUI")    public String addMonsterUI(Map map) {        //如果你跳转的页面使用了SpringMVC标签,就需要准备一个对象放入到request域中,        //该对象的属性名要对应SpringMVC的form标签的modelAttribute的属性名,否则报错        map.put("monster", new Monster());        return "datavalid/monster_addUI";    }    /**     * SpringMVC可以将提交的数据,按照参数名和形参对象的属性名匹配,     * 然后直接封装到对象中[模型数据]     * @param monster     * @return     */    @RequestMapping(value = "/save")    public String save(Monster monster) {        System.out.println("monster---" + monster);        return "datavalid/success";    }}

(4)monster_addUI.jsp:

    添加妖怪

添加妖怪

妖怪id:

妖怪名字:

妖怪年龄:

电子邮件:

(5)success.jsp

    添加成功

恭喜你,添加成功

(6)测试

后台成功拿到了数据,并将 String 类型的字符串转化为相应的数据类型,赋给 Monster 对象属性。说明 SpringMVC 底层可以自动进行基本数据类型转换。

3.特殊数据类型和字符串间的转换

  1. 特殊数据类型和字符串之间的转换可以使用注解来完成(比如日期,规定格式的小数比如货币形式)
  2. 对于日期和货币可以使用 @DataTimeFormat 和 @NumberFormat 注解。

应用实例

(1)修改Monster.java,增加 birthday 和 salary 字段。修改相应的构造器,getter 和 setter 等。

(2)data_valid.jsp 不变

(3)MonsterHandler.java 不变

(4)修改 monster_addUI.jsp:

    添加妖怪

添加妖怪

妖怪id:

妖怪名字:

妖怪年龄:

妖怪生日:

妖怪工资:

电子邮件:

(5)success.jsp 不变

(6)redeployTomcat,进行测试

提交的数据:

后台输出:

monster---Monster{id=22, email='king@sohu.com', age=99, name='king', birthday=Tue Jan 01 00:00:00 CST 1924, salary=124567.22}

如果转换失败,将会提示:

Field error in object 'monster' on field 'birthday': rejected value [192401-01]; codes [typeMismatch.monster.birthday,typeMismatch.birthday,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [monster.birthday,birthday]; arguments []; default message [birthday]]; default message [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 '192401-01'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [192401-01]]]