• Spring MVC中如何进行类型Converter呢?


    转自:

    Spring MVC中如何进行类型Converter呢?

    Spring MVC 框架中拥有一个Converter数据类型转换接口,
      其中 S:源类型
              T:目标类型


    下文将讲述Spring MVC框架中,内置的类型转换器和自定义类型转换器的方法分享,如下所示:

     内置的类型转换器 

    1)标量转换器

    名称作用
    StringToBooleanConverterString 到 boolean 类型转换
    ObjectToStringConverterObject 到 String 转换,调用 toString 方法转换
    StringToNumberConverterFactoryString 到数字转换(例如 Integer、Long 等)
    NumberToNumberConverterFactory数字子类型(基本类型)到数字类型(包装类型)转换
    StringToCharacterConverterString 到 Character 转换,取字符串中的第一个字符
    NumberToCharacterConverter数字子类型到 Character 转换
    CharacterToNumberFactoryCharacter 到数字子类型转换
    StringToEnumConverterFactoryString 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型
    EnumToStringConverter枚举类型到 String 转换,返回枚举对象的 name 值
    StringToLocaleConverterString 到 java.util.Locale 转换
    PropertiesToStringConverterjava.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码
    StringToPropertiesConverterString 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码

    2)集合、数组相关转换器

    名称作用
    ArrayToCollectionConverter任意数组到任意集合(List、Set)转换
    CollectionToArrayConverter任意集合到任意数组转换
    ArrayToArrayConverter任意数组到任意数组转换
    CollectionToCollectionConverter集合之间的类型转换
    MapToMapConverterMap之间的类型转换
    ArrayToStringConverter任意数组到 String 转换
    StringToArrayConverter字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim)
    ArrayToObjectConverter任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换
    ObjectToArrayConverterObject 到单元素数组转换
    CollectionToStringConverter任意集合(List、Set)到 String 转换
    StringToCollectionConverterString 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim)
    CollectionToObjectConverter任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换
    ObjectToCollectionConverterObject 到单元素集合的类型转换


    类型转换的应用场景:
         常用于视图和控制器相互传递数据时发生的
          Spring MVC 框架对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换
            如:insert.jsp  post到后台的需求,可由以下方法处理 

    package controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;

    @Controller
    public class infoontroller {
    @RequestMapping("/insert")
    public String add(String name, double price, double qty) {
           double total = price * qty;
           System.out.println(total);
          return "info";
       }
    }

    注意事项: 
           运用内置自动转换器,输入参数值需同接收参数类型相同,否则会产生相应的错误信息 

    自定义类型转换器

     当Spring MVC 框架内置的类型转换器无法满足我们的需求时,我们可自己编写相应的类型转换器
     如:
          当在页面表单中输入信息来创建信息。当输入“test,89.88,112” 此时后台方法中将自动 创建一个 new info,
          并将“test”值自动赋给 name 属性
             将“89.88”值自动赋给 price 属性
             将“112”值自动赋给 qty 属性 
    那么如何编写一个自定义类型转换器呢?下文将一一道来,编写自定义转换器需进行以下5个步骤

    1. 创建实体类
    2. 创建控制器类
    3. 创建自定义类型转换器类
    4. 注册类型转换器
    5. 创建相关视图


    按照上述步骤采用自定义类型转换器完成需求。

    1.创建实体类

    在项目的src 目录下创建 com.java265 包,并在该包中创建名为 infoModel 的实体类,代码如下:

     
    

    package com.java265;

    public class infoModel {
    private String   name;
    private double price;
    private int        qty; 
    }

    2)创建控制器类

    在 项目的src 目录下创建 controller 包,
         并在该包中创建名为 ConverterController 的控制器类,代码如下:

     
    

    package controller;

    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;

    import com.java265.infoModel;

    @Controller
    @RequestMapping("/my")
    public class ConverterController {
    @RequestMapping("/converter")
    /*
    * 使用@RequestParam
    * ("infoTest")接收请求参数,然后调用自定义类型转换器Converter将字符串值转换为infoModel的对象infom
    */
    public String myConverter(@RequestParam("infoTest") infoModel infom, Model model) {
        model.addAttribute("infoTest", infom);
        return "showInfo";
    }
    }

    3)创建自定义类型转换器类

    自定义类型转换器类需要实现 Converter 接口,重写 convert(S) 接口方法。

    convert(S) 方法的功能是将源数据类型 S 转换成目标数据类型 T。在 springMVCDemo03 的 src 目录下创建 converter 包,并在该包中创建名为 GoodsConverter 的自定义类型转换器类,代码如下:

     
    

    package converter;

    import org.springframework.core.convert.converter.Converter;
    import com.java265.infoModel;

    public class infoConverter implements Converter {
    public  infoModel convert(String source) {
    // 创建一个infoTest实例
    infoModel  infoTest= new infoModel  ();
    // 以“,”分隔
    String stringvalues[] = source.split(",");
    if (stringvalues != null && stringvalues.length == 3) {
    // 为infoTest实例赋值
    infoTest.setname(stringvalues[0]);
    infoTest.setprice(Double.parseDouble(stringvalues[1]));
    infoTest.setnumber(Integer.parseInt(stringvalues[2]));
    return infoTest;
    } else {
    throw new IllegalArgumentException(String.format(
    "类型转换失败, 需要格式'testName, 99.11,188',但格式是[% s ] ", source));
    }
    }
    }

    4)注册类型转换器

    在项目 的 WEB-INF 目录下创建配置文件 springmvc-servlet.xml,并在配置文件中注册自定义类型转换器,配置文件代码如下:

     
    


    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">










    class="org.springframework.web.servlet.view.InternalResourceViewResolver">



    5)创建相关视图

    在项目的WebContent 目录下创建信息输入页面 input.jsp,核心代码如下:


        请输入商品信息(格式为test,88.91,88):
       

       

    在项目的 /WEB-INF/jsp 目录下创建信息显示页面 showInfo.jsp,核心代码如下:

      


    您创建的商品信息如下:

    商品名称为:${infoTest.name }
    商品价格为:${infoTest.price }
    商品名称为:${infoTest.qty }


    采用以下URL访问页面

    http://localhost:8080/项目名称/input.jsp 

  • 相关阅读:
    java毕业生设计爱心公益网站设计与制作计算机源码+系统+mysql+调试部署+lw
    Python + adb 实现打电话功能
    CodeJock Active-X / COM v22.1.0 Crack
    苹果TF签名全称TestFlight签名,需要怎么做才可以上架呢?
    中国机器人产业崛起,德国市场面临30%的份额挑战
    ZZNUOJ_用C语言编写程序实现1156:又是排序(指针专题)(附完整源码)
    什么是脉动调查?
    cpu的各个部分的意思
    【Web前端】HTMLCSS一文详解
    桌面应用开发有哪些主流框架?
  • 原文地址:https://blog.csdn.net/qq_25073223/article/details/127859770