Spring MVC-自定义数据类型转换解决方案

来源:互联网 发布:手机魔术拍照软件 编辑:程序博客网 时间:2024/06/11 03:05

通过一个示例来说明,实现自定义String----->PhoneNumberModel的转换器

1.定义数据转换器类,StringToPhoneNumberConverter实现接口Converter

public class StringToPhoneNumberConverter implements Converter<String, PhoneNumberModel> {Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$");public PhoneNumberModel convert(String source) {if(!StringUtils.hasLength(source)) {//①如果source为空返回nullreturn null;}Matcher matcher = pattern.matcher(source);if(matcher.matches()) {//②如果匹配进行转换PhoneNumberModel phoneNumber = new PhoneNumberModel();phoneNumber.setAreaCode(matcher.group(1));phoneNumber.setPhoneNumber(matcher.group(2));return phoneNumber;} else {//③如果不匹配转换失败throw new IllegalArgumentException(String.format("类型转换失败,需要格式[010-12345678],但格式是[%s]", source));}} }

2.测试用的PhoneNumberModel

package com.cubead.demo.model;public class PhoneNumberModel {private String areaCode;// 区号private String phoneNumber;// 电话号码public String getAreaCode() {return areaCode;}public void setAreaCode(String areaCode) {this.areaCode = areaCode;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}}

3.集成到SpringMVC中

注册ConversionService实现和自定义的类型转换器

<bean id="conversionService"class="org.springframework.format.support.FormattingConversionServiceFactoryBean"><property name="converters"><list><bean class="cn.javass.springmvc.convert.StringToPhoneNumberConverter"/></list></property></bean>

使用的<mvc:annotation-drive>的方式,直接在<mvc:annotation-drive>里面配置conversion-service属性即可:
<mvc:annotation-drivenconversion-service="conversionService">

4.测试代码

URL: http://localhost:8080/spring-mvc/convert?phonenum=010-12345678

package com.cubead.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.servlet.ModelAndView;import com.cubead.demo.model.PhoneNumberModel;@Controllerpublic class ConvertController {@RequestMapping(value = "/convert")public ModelAndView convertStr2PhNum(@RequestParam(value = "phonenum") PhoneNumberModel phonenum) {ModelAndView mv = new ModelAndView();// 添加模型数据可以是任意的POJO对象mv.addObject("message", "地区:" + phonenum.getAreaCode());mv.addObject("msg", "号码:" + phonenum.getPhoneNumber());// 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面mv.setViewName("convert");return mv;}}

5.返回页面显示

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>hello world</title></head><body>${message}<br>${msg}</body></html>


0 0
原创粉丝点击