Springmvc 参数类型转换

在这里,以 将前台传过来的String类型转Date类型为例子。

主要介绍两种方法,@InitBinder注解和实现Converter接口

1.@InitBinder 用在@Controller注解的类里面,只适用于当前@Controller. 用@ControllerAdvice注解可实现全部@Controller适用

  1.在Controller内

  

package controller;

import converter.timepropertyeditorsupport;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author :JXH
 * @time :2019-02-17-下午4:38
 */
@Controller
public class jsoncontroller {

    @InitBinder
    public  void initBinder(WebDataBinder binder){     //将yyyy-mm-dd类型转换为date类型
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-mm-dd");
        dateFormat.setLenient(false);//日期自动计算关掉!
                                                 //自定义转换方法!
        binder.registerCustomEditor(Date.class,new timepropertyeditorsupport());
    }

   
    @RequestMapping("initBindertest")
    @ResponseBody
    public String e(@RequestParam("time") Date time){
        System.out.println(time);
        return time.toString();
    }
}

2.继承PropertyEditorSupport实现自定义方法,就是上面那个用的!

package converter;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author :JXH
 * @time :2019-02-17-下午6:43
 */
public class timepropertyeditorsupport extends PropertyEditorSupport {

    @Override
    public String getAsText() {
        return super.getAsText();
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-mm-dd");
        try {
            Date s=simpleDateFormat.parse(text);
            System.out.println("---------转换后的时间:"+s);
            setValue(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }


    }
}

-----------经过上面的应该可以将前台传来的yyyy-mm-dd格式转为Date类型了-----------

第二种方法,实现Converter接口!

1.实现接口

package converter;


import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * @author :JXH
 * @time :2019-02-17-下午4:54
 * 转换时间格式为 YYYY-MM-DD HH:MM
 */
public class timeconverter implements Converter<String, Date> {
    private String pattern;//时间转换格式,在xml中配置!

    public timeconverter(String pattern) {
        this.pattern = pattern;
        System.out.println("-------转换器初始化----------");
    }

    @Override
    public Date convert(String s) {
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat(pattern);
        Date date=null;
        try {
            date= simpleDateFormat.parse(s);
            System.out.println("转换后的时间:"+date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

2.在spring-servlet.xml中配置

<!--转换器-->
       <!--1.converter-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list> 
          <!--刚刚自定义的方法-->
                <bean class="converter.timeconverter">                       <!--只适用你现在在这规定的格式,-->
                    <constructor-arg index="0" type="java.lang.String" value="yyyy-mm-dd" ></constructor-arg>
                </bean>
            </list>
        </property>
    </bean>

------------------------------------------------------第二种应该也可用了--------------------------------------------------

上面的方法不仅能将前台传来的String转为Date类型,还能转为对象,json等。只要你在自定义的方法里实现。

我觉得,我们写的时候都应该统一这样定义转换器,这样的好处是更有层次感,倘若再需修改为其他格式的时间或什么只要在转换器里修改一下就行了,而Controller只需要负责处理,视图映射的事情,层次分的很轻!

不仅是在 前台到Controller 还有 数据库到service层, 等 其他层互相传递数据时,都应该用上转换器。

 

前台

|           ==>转换层: Converter或[ @InitBinder+@ControllerAdvice]:处理Date类型转换,字符串转对象,乱码处理                            

 -----------------------拦截器层:处理,参数验证判空,格式不对等,登录权限验证,

Controller ====》Controller层,专注负责,视图映射。

|

service  ====》处理,业务

| ========>mybatis的转换器,转对象转时间

Dao(Mybatis)

---------------------等,上面只是我的个人想法

 

Springmvc中处理@ResponseBody中文乱码

<mvc:annotation-driven>
          <mvc:message-converters>
              <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                  <constructor-arg value="UTF-8"/>
                  <!--@ResponseBody中文乱码-->
              </bean>
          </mvc:message-converters>
</mvc:annotation-driven>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值