SpringMVC-类型转化与格式化

类型转换与格式化(转化错误会报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";
    }

猜你喜欢

转载自blog.csdn.net/wxd_1024/article/details/80086823