• SpringMVC 请求参数绑定


    什么是请求参数绑定

    请求参数格式

      默认是key/value格式,比如:http:xxxx?id=1&type=2

    请求参数值的数据类型

      都是字符串类型的各种值

    请求参数值要绑定的目标类型

      Controller类中的方法参数,比如简单类型、POJO类型、集合类型等。

    SpringMVC内置的参数解析组件

      默认内置了24种参数解析组件(ArgumentResolver)

    什么是参数绑定?

      就是将请求参数串中的value值获取到之后,进行类型转换,然后将转换后的值赋值给Controller类中方法的形参,这个过程就是参数绑定

     默认支持的参数类型(Servlet API支持)

    Controller方法形参中可以随时添加如下类型的参数,处理适配器会自动识别并进行赋值。

    • HttpServletRequest
      • 通过request对象获取请求信息
    • HttpServletResponse
      • 通过response处理响应信息
    • HttpSession
      • 通过session对象获取session中存放的对象
    • InputStream、OutputStream
    • Reader、Writer
    • Model/ModelMap
      • ModelMap继承自LinkedHashMap,Model是一个接口,它们的底层实现都是同一个类(BindingAwareModelMap),作用就是向页面传递数据,相当于Request的作用,如下

    绑定简单数据类型

    简单类型参数绑定方式

      简单类型指的就是8种基本类型数据以及它们的包装类,还有String类型。

      在SpringMVC中,对于java简单类型的参数,推荐的参数绑定方式有两种:

    1. 直接绑定
    2. 注解绑定

    直接绑定

    要求

      http请求参数的key和controller方法的形参名称一致

    请求URL

      http://localhose:8080/xxx/findItem?id=1

      请求参数的key为id

    Controller方法

      Controller的形参为Interger id,它和请求参数的key一致,所以直接绑定成功

    @RequestMapping(value = "/findItem")
        public String findItem(Integer id) {
             System.out.println("接收到的请求参数是:"+ id);
            return "success";
        }

    HttpServletRequest

        @RequestMapping("findUserById2")
        public String findUserById2(Integer id, String name,Model model,HttpServletRequest request) {
            System.out.println(MessageFormat.format("id:{0},name:{1}", request.getParameter("id"),request.getParameter("name")));
            model.addAttribute("msg",MessageFormat.format("id:{0},name:{1}", request.getParameter("id"),request.getParameter("name")));
            return "success";
        }

    除了HttpServletRequest,还支持HttpServletResponse、HttpSession、Model等。

    注解绑定

    要求

      请求参数key和controller方法的形参名称不一致时,需要使用@RequestParam注解才能将请求参数绑定成功。

    请求URL

      http://localhost:8080/xxx/findItem?itemId=1

      请求参数的key为itemId

    Controller方法

      Controller的形参为Integer id,它和请求的参数不一致,需要使用@RequestParam注解才能绑定成功

         @RequestMapping(value = "/findItem")
        // 通过@RequestParam注解绑定简单类型
        public String findItem(@RequestParam("itemId") Integer id) {
              System.out.println("接收到的请求参数是:"+ id);
              return "success";
        }

    RequestParam注解介绍

      value:参数名字,即入参的请求参数名字,如value="itemId"表示请求的参数中的名字为itemId的参数的值将传入

      required:是否必须,默认是true,表示请求中一定要有响应的参数,否则将报;

        http Status 400 - Required Integer parameter 'xxx' is not present

      defaultValue:默认值,表示如果请求中没有同名参数时的默认值

    @RequestMapping(value = "/findItem")
        // 通过@RequestParam注解绑定简单类型
        // 学习@RequestParam注解中的value、required、defaultValue属性
        public String findItem (
                @RequestParam(value = "itemId", required = true, defaultValue = "2") Integer id) {
    
             System.out.println("接收到的请求参数是:"+ id);
              return "success";
        }

    绑定POJO类型

    要求

      控制器方法的参数类型是POJO类型。

      要求表单中参数名称和POJO类的属性名称保持一致。

    请求URL

      http://localhost:8080/xxx/updateItem?id=!&name=iphone&price=1000

    Controller方法

    POJO定义:

    Controller方法

    @RequestMapping("/updateItem")
        public String updateItem(Integer id,Items item) {
            
             System.out.println("接收到的请求参数是:"+ id);
             System.out.println("接收到的请求参数是:"+ item);
            return "success";
        }

    绑定包装POJO

       包装POJO类,依然是一个POJO,只是说为了方便沟通,将POJO中包含另一个POJO的这种类,称之为包装POJO。

    包装对象

    public class ItemQueryVO {
        //商品信息
        private Items item;
    }

    页面定义(item-list.jsp)

    查询条件:
            <table width="100%" border=1>
                <tr>
                    <td>商品名称:<input type="text" name="items.name" /></td>
                    <td><input type="submit" value="查询" /></td>
                </tr>
            </table>

    Controller方法

     测试方法:断点跟踪,查看vo中的item对象是否有值

    使用简单类型数组接收参数

    要求

      通过HTTP请求批量传递简单类型数据的情况,Controller方法中可以用String[]或者POJO的String[]属性接收(二选一),但是不能使用集合接收

    请求URL

      http://localhost:8080/xxx/deleteItem?id=1&id=2&id=3

    Controller方法

        @RequestMapping("/deleteItem")
        public String deleteitem(Integer[] itemId){
            
            return "success";
        }

    使用POJO类型集合或数组接收参数

    要求

      批量传递的请求参数,最终要使用List<POJO>来接收,那么这个List<POJO>必须放在另一个POJO类中。

    接收商品列表的POJO

    public class ItemQueryVO {
    
        // 商品信息
        private Item item;
        // 其他信息
    
        // 商品信息集合
        private List<Items> itemsList;
    }
    public class ItemQueryVO {
            //商品信息
        private Item item;
           //商品信息集合,方式一
        private List<Item> itemList;
        //商品信息集合,方式二
        //private Item[] itemList;
        
        public Item getItem() {
            return item;
        }
    
        public void setItem(Item item) {
            this.item = item;
        }
    
        public List<Item> getItemList() {
            return itemList;
        }
    
        public void setItemList(List<Item> itemList) {
            this.itemList = itemList;
        }
    }

    请求URL

      http://localhost:8080/xxx/batchUpdateItem?itemsList[0].id=1&itemsList[0].name=iphone&itemsList[0].price=1000&itemsList[1].id=2&itemsList[1].name=华为&items[1].price=5000

    Controller

        @RequestMapping("/batchUpdateItem")
        public String batchUpdateItem(ItemQueryVO vo) {
            return "success";
        }

    自定义参数绑定

    请求URL

      http://localhost:8080/xxx/saveItem?date=2019-12-4

    Controller方法

        @RequestMapping("/saveItem")
        public String saveItem(String date){
            System.out.println("接收到的请求参数是:"+ date);
            return "success";
        }

    但是如何将date参数的类型有String改为Date,则报错

    自定义Converter

    public class DateConverter implements Converter<String, Date> {
    
        @Override
        public Date convert(String source) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            try {
                return simpleDateFormat.parse(source);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    配置Converter

    在springmvc.xml中,进行以下配置

        <!-- 加载注解驱动 -->
        <mvc:annotation-driven conversion-service="conversionService"/>
        <!-- 转换器配置 -->
        <bean id="conversionService"
            class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="com.cyb.ssm.controller.converter.DateConverter"/>
                </set>
            </property>
        </bean>
  • 相关阅读:
    关于编程
    Python的内建sort方法

    Elgg设置SMTP验证发送邮件教程
    ThinkPHP 和 UCenter接口的冲突
    mac下终端iTerm2配置
    自动化 Amazon EBS 快照生命周期
    AWS Certified Solutions Architect Associate 学习笔记1
    实例存储生命周期 Instance store
    可触发 Lambda 函数的 CloudFront 事件
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/11980465.html
Copyright © 2020-2023  润新知