SpringMVC的类型转换器和数据格式化(九)上

简介: SpringMVC的类型转换器和数据格式化(九)

一. 类型转换器


前端传入的值,从表单中传入的值,都是字符串或者是字符串数组的形式传入的,在后端需要进行手动的转换类型,然后才能正确的使用。 框架一般对常见的数据类型的转换进行了封装提供,如字符串转换成数字等。


SpringMVC 也提供了一些内置的转换器。


有标量的转换器,即字符串到数字,字符串到Boolean等。

(图片引用于: http://c.biancheng.net/view/4415.html


20190902104238833.png


也有集合类型的转换器, 如数组到集合, 拼接型字符器(如,) 到集合等。

(图片引用于: http://c.biancheng.net/view/4415.html


20190902104245448.png


发现,没有常用的字符串到日期 Date 的转换器。 (如,生日属性,入职日期属性等).


SpringMVC 中,如年龄 age, 转到后端时可以自动转换成 数字类型,这就是内置转换器 StringToNumberConverterFactory 的作用。


内置转换器虽然强大,基本的开发使用是够了,但无法对自定义的类型进行转换。 所以,我们可以自定义类型转换器。


类型转换器,可以用 PropertyEditor 接口, (java 提供的) 来进行相应的转换。 但这种转换有缺点: 只能 是字符串转换成其他的java 对象,不能够java 对象类型到java其他对象类型之间 进行转换。


也可以利用 SpringMVC 的 Convert 接口进行类型转换。 推荐使用第二种。


程序中所使用到的 对象类


User.java


package com.yjl.pojo;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 所用的员工类
 * @author 12905
 *
 */
public class User{
  private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String description;
  //定义一个幻想的工资属性
   private double salary;
    //定义一个点类
    private Point point;
    //定义一个日期类
    private Date birthday;
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAge() {
    return age;
  }
  public void setAge(Integer age) {
    this.age = age;
  }
  public String getSex() {
    return sex;
  }
  public void setSex(String sex) {
    this.sex = sex;
  }
  public String getDescription() {
    return description;
  }
  public void setDescription(String description) {
    this.description = description;
  }
  public double getSalary() {
    return salary;
  }
  public void setSalary(double salary) {
    this.salary = salary;
  }
  public Point getPoint() {
    return point;
  }
  public void setPoint(Point point) {
    this.point = point;
  }
  public Date getBirthday() {
    return birthday;
  }
  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }
}


Point.java


package com.yjl.pojo;
//自定义类型转换的 坐标 Point 类
public class Point {
  private double x;
  private double y;
  public double getX() {
    return x;
  }
  public void setX(double x) {
    this.x = x;
  }
  public double getY() {
    return y;
  }
  public void setY(double y) {
    this.y = y;
  }
  @Override
  public String toString() {
    return "Point [x=" + x + ", y=" + y + "]";
  }
}


二. PropertyEditor 类型转换器的使用。


二.一 编写 坐标类 类型转换器


先看一下 PropertyEditor 接口。


20190902104429829.png


抽象方法太多,一般不直接实现这个接口,而去 继承它的实现类 PropertyEditorSupport 类。


20190902104419733.png


PointConvert.java 转换类


package com.yjl.convert;
import java.beans.PropertyEditorSupport;
import com.yjl.pojo.Point;
public class PointConvert extends PropertyEditorSupport{
  @Override
  public void setAsText(String text) throws IllegalArgumentException {
    //不进行异常的处理,只执行正确的程序。
    String arr[]=text.split(",");
    //分解数据
    double x=Double.parseDouble(arr[0]);
    double y=Double.parseDouble(arr[1]);
    //设置对象
    Point point=new Point();
    point.setX(x);
    point.setY(y);
    setValue(point);
  }
}


二.二 前端页面编写 login.jsp


<body>
  <h2>两个蝴蝶飞,类型转换器使用</h2>
  <form:form commandName="user" action="login.action" method="post">
    <form:label path="name">姓名:</form:label>
    <form:input path="name"/><br/>
    <form:label path="point">坐标:</form:label>
    <form:input path="point"/><br/>
    <form:button>提交</form:button>
  </form:form>
</body>


一个普通名称 name, 一个需要转换的属性 point


二.三 后端处理


@Controller
@RequestMapping(value="/user")
public class UserAction {
  //类型转换器注册 初始化绑定
  @InitBinder  
    public void initBinder(WebDataBinder binder) {  
    //Point 类 用 new PointConvert() 
       binder.registerCustomEditor(Point.class,new PointConvert());
    } 
  //转到登录的页面
  @RequestMapping(value="toLogin")
  public String toLogin(Model model){
    model.addAttribute("user",new User());
    return "user/login";
  }
  //绑定到user对象。
  @RequestMapping(value="login") 
  public String login(User user){
    System.out.println("设置名称:"+user.getName());
    System.out.println("坐标点:"+user.getPoint().toString());
    return "user/list";
  }
}


二.四 重启服务器,进行访问测试。


前端输入值,点击提交后,页面可以正确的跳转到 list.jsp 页面。


2019090210450047.png


控制台打印输出


20190902104505997.png



相关文章
|
前端开发 Java Spring
springMVC--数据格式化
springMVC--数据格式化
89 0
|
前端开发 安全 Java
详细解读_SpringMvc类型转换&数据格式化&数据验证
详细解读_SpringMvc类型转换&数据格式化&数据验证
|
Java Spring
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(一)
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(一)
274 0
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(一)
|
Java Spring
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(二)
SpringMVC - 数据格式化(@DateTimeFormat & @NumberFormat)(二)
161 0
|
前端开发
SpringMVC的类型转换器和数据格式化(九)下
SpringMVC的类型转换器和数据格式化(九)
291 0
SpringMVC的类型转换器和数据格式化(九)下
|
前端开发 Java
SpringMVC的类型转换器和数据格式化(九)中
SpringMVC的类型转换器和数据格式化(九)
169 0
SpringMVC的类型转换器和数据格式化(九)中
|
XML JSON 前端开发
springmvc4整合AJAX使用@ResponseBody注解返回JSON数据格式
版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/53433325   ...
1272 0
|
容器 前端开发
SpringMVC 中 数据格式化
FormattingConversionServiceFactoryBean内部已经注册了: - NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用@NumberFormat注解。 - JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类型的属性使用@DataTime
1431 0
|
前端开发 Java Spring
springMVC4(11)使用注解完成数据格式化
<div class="markdown_views"> <h1 id="需求实例引入">需求实例引入</h1> <p>在实际开发中,我们会常常遇到需要对日期格式、数值格式进行转换的需求。在spring中,我们可以轻松通过注解的方式完成对数据的格式化处理,比如现在有个User POJO类: <br> package com.mvc.model;</p> <pre cla
2765 0
|
6月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】