4.16、数据类型转换和数据验证
4.16.1、数据类型转换
java代码:
- package cn.javass.chapter4.model;
- //省略import
- public class DataBinderTestModel {
- private String username;
- private boolean bool;//Boolean值测试
- private SchoolInfoModel schooInfo;
- private List hobbyList;//集合测试,此处可以改为数组/Set进行测试
- private Map map;//Map测试
- private PhoneNumberModel phoneNumber;//String->自定义对象的转换测试
- private Date date;//日期类型测试
- private UserState state;//String——>Enum类型转换测试
- //省略getter/setter
- }
- package cn.javass.chapter4.model;
- //如格式010-12345678
- public class PhoneNumberModel {
- private String areaCode;//区号
- private String phoneNumber;//电话号码
- //省略getter/setter
- }
java代码:
- package cn.javass.chapter4.web.controller.support.editor;
- //省略import
- public class PhoneNumberEditor extends PropertyEditorSupport {
- Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$");
- @Override
- public void setAsText(String text) throws IllegalArgumentException {
- if(text == null || !StringUtils.hasLength(text)) {
- setValue(null); //如果没值,设值为null
- }
- Matcher matcher = pattern.matcher(text);
- if(matcher.matches()) {
- PhoneNumberModel phoneNumber = new PhoneNumberModel();
- phoneNumber.setAreaCode(matcher.group(1));
- phoneNumber.setPhoneNumber(matcher.group(2));
- setValue(phoneNumber);
- } else {
- throw new IllegalArgumentException(String.format("类型转换失败,需要格式[010-12345678],但格式是[%s]", text));
- }
- }
- @Override
- public String getAsText() {
- PhoneNumberModel phoneNumber = ((PhoneNumberModel)getValue());
- return phoneNumber == null ? "" : phoneNumber.getAreaCode() + "-" + phoneNumber.getPhoneNumber();
- }
- }
java代码:
- package cn.javass.chapter4.web.controller;
- //省略import
- public class DataBinderTestController extends AbstractCommandController {
- public DataBinderTestController() {
- setCommandClass(DataBinderTestModel.class); //设置命令对象
- setCommandName("dataBinderTest");//设置命令对象的名字
- }
- @Override
- protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception {
- //输出command对象看看是否绑定正确
- System.out.println(command);
- return new ModelAndView("bindAndValidate/success").addObject("dataBinderTest", command);
- }
- @Override
- protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
- super.initBinder(request, binder);
- //注册自定义的属性编辑器
- //1、日期
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- CustomDateEditor dateEditor = new CustomDateEditor(df, true);
- //表示如果命令对象有Date类型的属性,将使用该属性编辑器进行类型转换
- binder.registerCustomEditor(Date.class, dateEditor);
- //自定义的电话号码编辑器
- binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEditor());
- }
- }
java代码:
- <bean name="/dataBind"
- class="cn.javass.chapter4.web.controller.DataBinderTestController"/>
java代码:
- EL phoneNumber:${dataBinderTest.phoneNumber}<br/>
- EL state:${dataBinderTest.state}<br/>
- EL date:${dataBinderTest.date}<br/>
java代码:
- package cn.javass.chapter4.web.controller.support.initializer;
- //省略import
- public class MyWebBindingInitializer implements WebBindingInitializer {
- @Override
- public void initBinder(WebDataBinder binder, WebRequest request) {
- //注册自定义的属性编辑器
- //1、日期
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- CustomDateEditor dateEditor = new CustomDateEditor(df, true);
- //表示如果命令对象有Date类型的属性,将使用该属性编辑器进行类型转换
- binder.registerCustomEditor(Date.class, dateEditor);
- //自定义的电话号码编辑器
- binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEditor());
- }
- }
java代码:
- <!-- 注册WebBindingInitializer实现 -->
- <bean id="myWebBindingInitializer" class="cn.javass.chapter4.web.controller.support.initializer.MyWebBindingInitializer"/>
- <bean name="/dataBind" class="cn.javass.chapter4.web.controller.DataBinderTestController">
- <!-- 注入WebBindingInitializer实现 -->
- <property name="webBindingInitializer" ref="myWebBindingInitializer"/>
- </bean>