spring mvc对象属性绑定

  1. 基本类型绑定

    public class UserBean {

    private int in;

    private long lo;

    private byte by;

    private char ca;

    private double do;

    private boolean bo;

    private String str;

    // get,set...

    }

    // 定义Action

    @ResponseBody

    @RequestMapping("/addUser")

    public Object addUser(UserBean bean) {

    System.err.println(JSON.toJSON(bean));

    return bean;

    }

    // 测试请求

    @Test

    public void testAddUser() throws Exception{

         MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/addUser").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));

         mb.param("in", "100");

         mb.param("lo", "100");

         mb.param("by", "100");

         mb.param("ca", "a");

         mb.param("do", "100");

         mb.param("bo", "1");

         mb.param("str", "luck");

         ResultActions ra = sendRequest(mb);

         MockHttpServletResponse response = ra.andReturn().getResponse();

         System.out.println(response.getContentAsString());

         ra.andDo(MockMvcResultHandlers.log());

     

    }

    // 打印结果

     {"str":"luck","bo":true,"do":100,"by":100,"in":100,"lo":100,"ca":"a"}

    /**

     * 当一个基本类型的传入参数有多个是会报错

     * 只有String类型的多个类型是会自动拼接 str1,str2,str3,...

     */

  2. 数组集合绑定

    // 定义bean

    public class CollectionBean {

    private String[] array;

    private List<String> list;

    private Set<String> set;

    private Map<String, String> map;

    // get,set...

    }

    // 定义action

        @ResponseBody

    @RequestMapping("/testCollections")

    public Object testCollections(CollectionBean bean) {

    System.err.println(JSON.toJSON(bean));

    return bean;

    }

    // 测试方法

    @Test

    public void testCollections() throws Exception{

         MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/testCollections").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));

         mb.param("array", "100");

         mb.param("array", "101");

         mb.param("array", "102");

         mb.param("list", "LIST100001");

         mb.param("list", "LIST100002");

         mb.param("list", "LIST100003");

         mb.param("list", "LIST100004");

         mb.param("set", "aaa");

         mb.param("set", "aaa");

         mb.param("set", "aaa");

         mb.param("map[x]", "xxxx");

         mb.param("map[y]", "yyyy");

         mb.param("map[z]", "zzzz");

         ResultActions ra = sendRequest(mb);

         MockHttpServletResponse response = ra.andReturn().getResponse();

         System.out.println(response.getContentAsString());

         ra.andDo(MockMvcResultHandlers.log());

    }

    // 打印结果

    {"set":["aaa"],"list":["LIST100001","LIST100002","LIST100003","LIST100004"],"array":["100","101","102"],"map":{"x":"xxxx","y":"yyyy","z":"zzzz"}}

     

    /**

     * 集合接口的默认实现

     * List -> ArrayList

     * Set  -> LinkedHashSet  (有序)

     * Map  -> LinkedHashMap  (有序)

     * 若不想用默认实现,需在无参构造器中初始化

     * 如想使用HashMap,如下即可

     * public CollectionBean() {

     *   map = new HashMap<String, String>();

     * }

    **/

  3. 对象,对象数组,对象集合

    // bean

    public class OneBean {

    private int age;

    private String name;

    // get,set...

    }

    public class TwoBean {

    private String text;

    private OneBean[] ones;

    private List<OneBean> oneList;

    private Map<String, OneBean> beanMap;

    // get,set...

    }

    // action

    @ResponseBody

    @RequestMapping("/testObjectO")

    public Object testObjectO(TwoBean bean) {

    System.err.println(JSON.toJSON(bean));

    return bean;

    }

    // test

    @Test

    public void testObjectO() throws Exception{

    MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/testObjectO").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));

    mb.param("text", "I am twoBean");

    mb.param("ones[0].age", "100");

    mb.param("ones[0].name", "zhangsan");

    mb.param("ones[1].age", "100");

    mb.param("ones[1].name", "lisi");

    mb.param("oneList[0].age", "100");

    mb.param("oneList[0].name", "wangwu");

    mb.param("oneList[1].age", "100");

    mb.param("oneList[1].name", "wugui");

    mb.param("beanMap[x].age", "100");

    mb.param("beanMap[x].name", "wugui");

    mb.param("beanMap[y].age", "100");

    mb.param("beanMap[y].name", "wugui");

    ResultActions ra = sendRequest(mb);

    MockHttpServletResponse response = ra.andReturn().getResponse();

    System.out.println(response.getContentAsString());

    ra.andDo(MockMvcResultHandlers.log());

    }

    // 打印结果

    {"oneList":[{"name":"wangwu","age":100},{"name":"wugui","age":100}],"ones":[{"name":"zhangsan","age":100},{"name":"lisi","age":100}],"beanMap":{"x":{"name":"wugui","age":100},"y":{"name":"wugui","age":100}},"text":"I am twoBean"}

  4. 枚举等自定义参数PropertyEditor

    1. // 自定义参数需要自己定义参数编辑器

      // bean

      public enum TypeEnum {

      ADD("1", "新增"),

      UPDATE("2", "修改"),

      DELETE("3", "删除"),

      SELECT("4", "查询");

      private String value;

      private String desc;

      TypeEnum(String value, String desc){

      this.value = value;

      this.desc = desc;

      }

      }

      public class EnumBean {

      private TypeEnum typeEnum;

      private TypeEnum[] types;

      }

      // editHandler

      public class EnumBeanEditor extends PropertyEditorSupport {

      @Override

      public void setAsText(String text) throws IllegalArgumentException {

      if(!StringUtils.isEmpty(text)) {

      setValue(TypeEnum.map.get(text.trim()));

      }else {

      super.setAsText(text);

      }

      }

      }

      // action

      @InitBinder

      public void bind(WebDataBinder binder) {

          binder.registerCustomEditor(TypeEnum.class, new EnumBeanEditor());

      }

          @ResponseBody

      @RequestMapping("/testEnum")

      public Object testEnum(EnumBean bean) {

      System.err.println(bean.getTypeEnum());

      for(TypeEnum e : bean.getTypes()) {

      System.err.println(e);

      }

      return bean;

      }

      // test

      @Test

      public void testEnum() throws Exception{

      MockHttpServletRequestBuilder mb = MockMvcRequestBuilders.post("/param/testEnum").accept(MediaType.parseMediaType("application/json;charset=UTF-8"));

      mb.param("typeEnum", "1");

      mb.param("types", "1");

      mb.param("types", "1");

      mb.param("types", "3");

      ResultActions ra = sendRequest(mb);

      MockHttpServletResponse response = ra.andReturn().getResponse();

      System.out.println(response.getContentAsString());

      ra.andDo(MockMvcResultHandlers.log());

      }

      // 打印结果

      value:1  desc:新增

      value:1  desc:新增

      value:1  desc:新增

      value:3  desc:删除

      /**

       * 枚举转JSON

       * 返回前台结果为{"typeEnum":"ADD","types":["ADD","ADD","DELETE"]}

       * 若要枚举的value值,需在getValue的方法的增加注解

       * @com.fasterxml.jackson.annotation.JsonValue

       * public String getValue()

       * 结果就为{"typeEnum":"1","types":["1","1","3"]}

      看了这么多,大概知道如何自定义数据转换了吧下面介绍两种不常用的

  5. 使用Converter接口扩展   Spring 提供了三个转换接口,用法类似,此处仅展示最常用的 org.springframework.core.convert.converter.Converter 示例

    public class EnumConvert implements Converter<String, TypeEnum> {

    @Override

    public TypeEnum convert(String source) {

    System.out.println(source);

    return TypeEnum.map.get(source);

    }

    }

    配置文件修改

    <!-- mvn注解驱动指定转换服务 -->

        <mvc:annotation-driven conversion-service="conversionService" />  

        ...

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

            <!-- 转换器 -->

            <property name="converters">

                <list>

                    <bean class="com.xquant.common.mock.editer.EnumConvert"/>

                </list>

            </property>

        </bean>

  6. 组件扩展转换器

    因大多数转换都是从String转换为Object,略微抽象了一下,使用时直接继承抽象接口即可。然后扩展了FormattingConversionServiceFactoryBean类,组件内部转换器直接代码中引用,外部转换器可在转换服务的属性注入即可

    --转换器

    public class TradeTypeConverter extends AbstractConverter<TradeTypeEnum> {

     

        @Override

        public TradeTypeEnum convert(String source) {

            if(StringUtils.isNotBlank(source)){

                return TradeTypeEnum.getTradeTypeEnum(source.trim());

            }

            return null;

        }

    }

     

    public class CustomConversionService {

        ...

        <!-- 组件内部转换器 -->

        private void addSupportCustomConverter(Set<Object> set){

            set.add(new TradeTypeConverter());

        }

    xml配置

    <mvc:annotation-driven conversion-service="customConversionService" />

        <!-- Spring-servlet.xml 配置 -->

        <bean id="customConversionService" class="com.xquant.platform.component.javascript.mvc.convert.conversion.CustomConversionService" >

            <!-- 项目点转换器 -->

            <property name="converters">

                    <list>

                        <bean class="com.xquant.common.mock.editer.EnumConvert"/>

                    </list>

            </property>

        </bean>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值