在这里,以 将前台传过来的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>