• springmvc总结(配置传递参数去除前后空格、参数绑定时处理日期)


    1.属性为Integer时,前台表单不填,默认为null;属性为String,前台表单不填,默认为"";
    2.属性为Integer时,前台表单填空格,model封装为null;属性为String,前台表单填空格,model封装为"  ";
    3.属性为Integer,后台model封装时【去除】前后空格;属性为String,后台model封装时【不去除】前后空格;
    4.属性为Integer,表单填非数字,报错http400(Bad Request)

    录:

    一、springmvc配置传递参数去除前后空格
    二、使用filter拦截参数去掉两端的空格(资料+亲测解决)
    三、springmvc+jackson处理date
    四、前端日期字符串转换为java.util.date的三种方法
    五、日期转换的处理(全局和局部)

    一、springmvc配置传递参数去除前后空格    <--返回目录

    来自:https://blog.csdn.net/Archer_M/article/details/79884228

    1. 创建自定义转换器类

    package com.java1234.test;
    import org.springframework.core.convert.converter.Converter;
    /**
     * 自定义转换器 去掉前后空格 <S, T> : S 页面上类型 T : 转换后的类型
     */
    public class CustomConverter implements Converter<String, String> {
        // 去掉前后空格
        @Override
        public String convert(String source) {
            // TODO Auto-generated method stub
            try {
                if (null != source) {
                    source = source.trim();
                    if (!"".equals(source)) {
                        return source;
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception } return null; } }
            }
            return null;
        }
    }


    2. 在springmvc文件中进行配置

    <!-- 处理器 映射器  适配器 -->
    <mvc:annotation-driven conversion-service="conversionService"/>
    
    <!-- Converter转换器工厂  
        注: 需要在 适配器 中进行配置 --> 
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
        <!-- 日期 --> 
        <!-- 去掉前后空格 --> 
        <property name="converters"> 
            <list> 
                <bean class="cn.jay.common.conversion.CustomConverter"></bean>
            </list>
        </property> 
    </bean>

    二、使用filter拦截参数去掉两端的空格(资料+亲测解决)    <--返回目录

    https://blog.csdn.net/xiaoyu19910321/article/details/52838828

    三、springmvc+jackson处理date    <--返回目录

    参考资料:https://www.cnblogs.com/woshimrf/p/5189435.html

    MappingJacksonHttpMessageConverter主要通过ObjectMapper来实现返回json字符串。这里我们继承该类,
    注册一个JsonSerializer<T>。然后在配置文件中注入自定义的ObjectMapper。

    1.编写子类继承ObjectMapper

    package com.demo.common.util.converter;
    import org.codehaus.jackson.JsonGenerator;
    import org.codehaus.jackson.JsonProcessingException;
    import org.codehaus.jackson.map.JsonSerializer;
    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.map.SerializerProvider;
    import org.codehaus.jackson.map.ser.CustomSerializerFactory;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    /**
    * 解决Date类型返回json格式为自定义格式
    */
    public class CustomJsonDateConverter extends ObjectMapper {
        public CustomJsonDateConverter(){
            CustomSerializerFactory factory = new CustomSerializerFactory();
            factory.addGenericMapping(Date.class, new JsonSerializer<Date>(){
                @Override
                public void serialize(Date value,JsonGenerator jsonGenerator,SerializerProvider provider)throws IOException {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    jsonGenerator.writeString(sdf.format(value));
                }
            });
            this.setSerializerFactory(factory);
        }
    }



    2.配置spring文件

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper" ref="customObjectMapper"></property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    
    <bean id="customObjectMapper" class="com.demo.common.util.converter.CustomJsonDateConverter"></bean>



    3.使用内置的日期格式化工具
        同样是全局设置json响应的日期格式,但此方法可以和@JsonFormat共存,也就是说可以全局设置一个格式,
        特定的需求可以使用注解设置。

        * 配置spring文件:配置全局json的日期转换格式

    <mvc:annotation-driven>  
    <!-- 处理responseBody 里面日期类型 -->  
        <mvc:message-converters>  
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
                <property name="objectMapper">  
                    <bean class="com.fasterxml.jackson.databind.ObjectMapper">  
                        <property name="dateFormat">  
                            <bean class="java.text.SimpleDateFormat">  
                                <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />  
                            </bean>  
                        </property>  
                    </bean>  
                </property>  
            </bean>  
        </mvc:message-converters>  
    </mvc:annotation-driven>


        * 配置特定的date

    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    public Date getBirth() {
        return birth;
    }

    四、前端日期字符串转换为java.util.date的三种方法    <--返回目录

    解决SpringMVC Controller中接受日期格式发生400错误
    https://blog.csdn.net/wangxueqing52/article/details/80536028?utm_source=blogxgwz0

        解决方法一:
            我们使用@DateTimeFormat(pattern="yyyy-MM-dd") 首先需要引入一个jar 包,否者是不能的:joda-time-2.1.jar

            然后在spring.xml中进行配置。首先需要在头上面加上:
            xmlns:mvc="http://www.springframework.org/schema/mvc"
            http://www.springframework.org/schema/mvc
                  http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
            (当然版本不同spring-mvc-3.0.xsd 写法也不同)。

            头加上之后,然后需要配置进行声明:<mvc:annotation-driven></mvc:annotation-driven>  

            最后在你所需要的Date数据类型之上加上@DateTimeFormat(pattern="yyyy-MM-dd")即可
            ---------------------
            作者:默默的菜鸟--
            来源:CSDN
            原文:https://blog.csdn.net/qq_34160679/article/details/76401576
            版权声明:本文为博主原创文章,转载请附上博文链接!
            

        方法二:Controller类中
        @InitBinder
        public void initBinder(WebDataBinder binder) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            dateFormat.setLenient(false);
            binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));   //true:允许输入空值,false:不能为空值
        }
        
        方法三:实现一个全局日期类型转换器并进行配置
        spring3.1以前的配置
        https://blog.csdn.net/wangxueqing52/article/details/80536028?utm_source=blogxgwz0、
        spring3.1以后的配置
        https://blog.csdn.net/chenleixing/article/details/45156617
        https://blog.csdn.net/chenleixing/article/details/45190371

    五、日期转换的处理(全局和局部)    <--返回目录

    1.配置全局的json消息处理

    // 自定义消息转换器MappingJacson2HttpMessageConverter
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(fmt);
        return mapper;
    }

       
        测试1:
            @ResponseBody转换json时,效果:
            {"id":1,"name":"张三1","age":11,"date":"2019-01-13 22:20:47"}
            
        测试2:
            前台表单格式:2019-01-13 22:20:47。
            前台传递json数据,@RequestBody绑定数据,成功。
        
        测试3:
            前台表单格式:2019-01-13。
            前台传递json数据,@RequestBody绑定数据,失败。
            
        测试4:
            前台表单提交格式:2019-01-13 22:20:47,失败。
            因为传递的表单数据,所以需要配置StringToDateConverter。
            
    2.自定义及配置全局的日期转换器【StringToDateConverter】

    /**
     * 增加字符串转日期的功能
     * https://blog.csdn.net/fansili/article/details/78366874
     */
    @PostConstruct
    public void initEditableAvlidation() {
    
        ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer();
        
        if(initializer.getConversionService() != null) {
            GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();           
            
            // 注册自定义的StringtoDate的转换器
            genericConversionService.addConverter(new StringToDateConverter());
        }
    }


        测试5:
            前台表单提交格式:2019-01-13 22:20:47,成功。
            前台表单提交格式:2019-01-13,也成功。
            因为:转换器中对传递的字符串进行了判断
            if (source.length() == 10) {
                sdf = new SimpleDateFormat("yyyy-MM-dd");
            } else if (source.length() == 16) {
                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
            } else if (source.length() == 19) {
                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            } else if (source.length() == 23) {
                sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
            }
        
    3.要想自定义json转换时日期的格式,怎么办?
        局部配置:在实体类字段上或getter方法上
        @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
        private Date date;

        测试6:
            前台表单格式:2019-01-13或2019-01-13 aa:bb:cc.abc
            前台传递json数据,@RequestBody绑定数据,成功。

        并且,后台@ResponseBody转换json时,效果:
        {"id":1,"name":"张三1","age":11,"date":"2019-01-13"}


    ---

  • 相关阅读:
    Unity---简单的性能优化理论
    第一次参加Game Jam
    Unity---自制游戏中控制角色的移动摇杆
    不使用插件 修改Unity和C#创建时的默认模板
    Leetcode---剑指Offer题10---斐波那契数列
    Leetcode---剑指Offer题9---用两个栈实现队列
    MySQL百万级数据量分页查询方法及其优化
    Nginx日志切割
    Nginx服务优化及优化深入(配置网页缓存时间、日志切割、防盗链等等)
    MySQL主从复制+读写分离原理及配置实例
  • 原文地址:https://www.cnblogs.com/xy-ouyang/p/14244162.html
Copyright © 2020-2023  润新知