美文网首页dibo
5、SpringMVC-参数绑定

5、SpringMVC-参数绑定

作者: 唯老 | 来源:发表于2019-08-24 20:18 被阅读17次

    一、概要

    在springmvc中,接收前端提交的数据是通过方法形参来接收的。
    从客户端请求的key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上,然后就可以在controller中的方法上使用该参数了。

    二、支持参数的类型

    1. 简单类型参数
    2. 内置类型参数
    3. 数组类型参数
    4. pojo类型参数
    5. 复杂pojo类型参数
    6. 集合参数
    7. 日期类型
    8. 特殊类型参数绑定
      用FormattingConversionServiceFactoryBean类管理自定义参数

    三、基本类型

    1、说明

    八种基本类型数据(包装类型)及String类型数据。
    注意: 请求中的参数名必须和方法形参名称一致,

    2、栗子

    /**
     * 基本类型参数绑定
     * /base?username='admin'&age=1&flag=true
     */
    @RestController
    @Slf4j
    public class BaseParamsController {
        @RequestMapping("/base")
        public String base(String username, int age, boolean flag) {
            log.debug("基本类型参数{}", username);
            log.debug("基本类型参数{}", age);
            log.debug("基本类型参数{}", flag);
            return "基本类型参数绑定";
        }
    }
    

    四、数组集合类型

    1、说明

    在请求的url的参数中使用同一个键传递多个值,springmvc中可以定义数组接受参数
    如何使用List的参数必须结合@RequestParam()注解
    注意: 请求中的参数名必须和方法形参名称一致,

    2、栗子

    控制层

    @RestController
    @Slf4j
    @RequestMapping("/params")
    public class ArrayParamsController {
        @RequestMapping("/base")
        public String baseArray(String[] arr) {
            for (String name : arr) {
                log.debug("数组参数{}", name);
            }
            return "数组类型参数绑定";
        }
        /**
         * 注意不支持这种写法,会报错 必须结合@RequestParam()
         * 注意不支持这种写法,会报错 必须结合@RequestParam()
         * 注意不支持这种写法,会报错 必须结合@RequestParam()
         */
        @RequestMapping("/list")
        public String baseList(@RequestParam("arr") List<String> arr) {
            for (String name : arr) {
                log.debug("数组参数{}", name);
            }
            return "集合类型参数绑定";
        }
    }
    

    测试

    image
    ajax
    let arr={params:['admin','test']};
    $.ajax({url:请求地址,
                data:arr,
                  // 注意添加traditional:true,表示不深度序列化参数对象
                    traditional:true, //默认false
                type:"POST",
                success:function(){
                }
            });
    

    五、pojo类型

    1、说明

    在请求的方法的形参上使用pojo引用类型和pojo类型参数的名称无关,使用该pojo对像中set方法进行参数绑定。
    注意:
    Http请求中参数的key要和该pojo的setter方法的后缀一致,即可以完成参数绑定。

    2、栗子

    控制层

    @RestController
    @Slf4j
    public class PojoParamsController {
        @RequestMapping("/pojo")
        public String pojoParams(User user) {
            log.debug(user.getUid()+"");
            log.debug(user.getName());
            return "简单对象参数";
        }
    }
    

    测试

    image
    image

    六、pojo嵌套类型

    1、说明

    请求的参数中对象里嵌套对象

    2、栗子

    pojo

    public class User {
        private Integer uid;
        private String name;
        private Address address;
    }
    public class Address {
        private Integer addressId;
        private String city;
    }
    

    控制层

    @RestController
    @Slf4j
    @RequestMapping("/nest")
    public class NestPojoController {
        @RequestMapping("/pojo")
        public String nestPojoParams(User user) {
            log.debug(user.getName());
            log.debug(user.getAddress().getCity());
            return "对象嵌套对象";
        }
    }
    

    测试

    image

    七、pojo嵌套集合

    1、说明

    springmvc不支持集合类型参数直接绑定形参上。解决方案有两种前面已经演示过了使用@RequestParam注解
    还可以可以把集合类型参数封装到pojo中,则可以完成参数绑定
    个人建议复杂的嵌套客服端使用json格式上传比较合理

    2、栗子

    pojo

    /**
     * @author zhangwei
     */
    @Data
    public class User implements Serializable {
        private Integer uid;
        private String name;
        private Address address;
        private List<Address> addressList;
        private Map<String,Address> map;
    }
    

    控制层

    @RestController
    @RequestMapping("/pojo")
    @Slf4j
    public class PojoListController {
        @RequestMapping("/list")
        public String nestListParams(User user) {
            log.debug(user.getName());
            log.debug(user.getAddressList().toString());
            return "pojo对象嵌套list";
        }
        @RequestMapping("/map")
        public String nestMapParams(User user) {
            log.debug(user.getMap().get("1").toString());
            return "pojo对象嵌套Map";
        }
    }
    

    测试代码

    image
    <form action="pojo/list" method="post">
      <input type="text" name="username">
       <input name="addressList[0].city">
       <input name="addressList[1].city">
       <input type="submit" value="提交">
    </form>
    
    image
    <form action="" method="post">
      <input type="text" name="name">
      <input type="text" name="map['address1'].city">
      <input type="text" name="map['address2'].city">
      <input type="submit" value="注册">
    </form>
    

    八、内置类型(SpringMVC)

    1、说明

    在控制器方法的形参上使用该类型的变量,则Spring会自动创建相应类型的对像绑定到该形参之上(和形参名无关)

    2、栗子

    @RestController
    @Slf4j
    public class SpringTypeController {
        @RequestMapping("/type")
        private String testSpringType(HttpServletRequest request,
                                      HttpServletResponse response,
                                      HttpSession session,
                                      Model model,
                                      ModelMap modelMap,
                                      Map map) {
            log.debug(request.toString(),
                    response.toString(),
                    session.toString(),
                    model.toString(),
                    modelMap.toString(),
                    map.toString()
            );
            return "内置类型";
        }
    }
    

    九、日期类型处理

    1、说明

    日期的处理一般分两种普通的请求日期参数转化,另外还有json数据的日期格式,这里说的是普通的日期参数的转化,
    推荐使用注解方式 @DateTimeFormat

    2、栗子

    自定义的converter

    import org.springframework.core.convert.converter.Converter;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    public class DateConverter implements Converter<String, Date> {
        @Override
        public Date convert(String date) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            // 是否开启严格模式解析
            dateFormat.setLenient(false);
            try {
                return dateFormat.parse(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    配置文件注册FormattingConversionServiceFactoryBean

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="converters">
                <list>
                    <bean class="com.xxx.xxx.DateConverter" />
                </list>
            </property>
        </bean>
    

    配置文件中的annotation-driven标签中注册

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

    控制层

    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import java.util.Date;
    /**
     * @author zhangwei
     */
    @RestController
    @RequestMapping("/converter")
    @Slf4j
    public class DateConverterController {
        @RequestMapping("/date")
        public String testDateConverter(Date joinDate) {
            log.debug(joinDate.getClass().getTypeName());
            return "自定义转化器";
        }
    }
    

    测试

    image

    spring-mvc专题

    相关文章

      网友评论

        本文标题:5、SpringMVC-参数绑定

        本文链接:https://www.haomeiwen.com/subject/mwaqectx.html