(二)SpringMVC-类型转化与格式化

本文介绍如何处理Web表单提交的数据,包括日期格式、数值格式等的自动转换及错误处理,还介绍了如何通过自定义类型转换器来实现更复杂的类型转换。

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

类型转换与格式化(转化错误会报400异常)

对页面上表单传来的数据进行转换 :比如表单上有一个日期 必须输入格式为yyyy-MM-dd才能将数据绑定到controller的参数上

//实体类 book 中的时间字段
private Integer bookId;   //表单输入字符串可以自动完成类型的转化并且给此属性赋值
private String name;  //表单输入字符串可以自动完成类型的转化并且给此属性赋值
private int price; 

//表单输入 2017-10-24 这种格式的才可以完成数据的绑定  否则会报400的异常
@DateTimeFormat(pattern = "yyyy-MM-dd")    
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date createTimeStartQuery;    

@NumberFormat(pattern="#,###,###.#")
private double salary;
//book 和 bindingResult之间不能有别的入参声明
@RequestMapping("aaa")
public String listFeedback(Book book,BindingResult result) {     
     //如果不进行BindingResult bindingResult判断会报400异常
     if (result.hasErrors()) {
           //数据绑定错误,做处理
           return "from";   //可以重新跳回到表单页面在表单页面显示错误信息 或者 抛出自定义的异常
     } 
}

//若是调到表单页面显示错误消息,需要用到spring的form表单指定属性 并且显示的消息为英文的 不是我们想要的消息,还需要通过国际化进行错误消息的定制,一般推荐抛出自定义的异常

利用国际化资源文件定制错误消息

一 :<!-- 获取资源文件的配置(atguigu.properties)配置ResourceBundleMessageSource这个Bean ,id必须是 messageSource -->
         <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
              <property name="basename" value="atguigu" />
         </bean>

二 :国际化资源文件
    atguigu.properties 中内容
         typeMismatch.book.bookId=输入错误,请输入数字

三 :显示错误消息 应你该用spring的form表单
        <form:form action="${pageContext.request.contextPath }/saveBook" method="post" modelAttribute="book">
            ID:<form:input path="bookId"/> <form:errors path="bookId"/>
            书名:<input type="text" name="bookName"/><br/>
            价格:<input type="text" name="price"/><br/>
            出版日期:<input type="text" name="publishDate"/><br/>
            <input type="submit" value="保存"/>
        </form:form>

自定义类型转化器(例子)

/** 源类型:页面提交的String类型的数据:"河北,石家庄,石家庄大街
 * 转化为目标类型:Address
 */
public class Address {
    private String province;
    private String city;
    private String street;
} 
一:自定义类型转化器,需要实现Converter<S,T>这个接口
public class AddressConverter implements Converter<String, Address>{
    public Address convert(String source) {
        Address address = null;
        if(source != null && source.length() > 0) {
            //河北,石家庄,石家庄大街
            String[] split = source.split(",");
            if(split.length == 3 ) {
                String province = split[0];
                String city = split[1];
                String street = split[2];
                address = new Address(province, city, street);
            }
        }
        return address;
    }
}

二:注册自定义转化器
    <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.atguigu.convert.converter.AddressConverter"/>
            </set>
        </property>
    </bean>
    <mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"/>   conversion-service值是上面配置的bean的id

三:使用
    <form action="${pageContext.request.contextPath }/saveAddress" method="post">
        <!-- name属性是根据类型的首字母小写匹配的 -->
        <input type="text" name="address"/>
        <input type="submit" value="保存地址"/>
    </form>

    @RequestMapping("/saveAddress")
    public String saveAddress(Address address) {
        System.out.println(address);
        return "success";
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值