参数绑定

作者: 常威爆打来福 | 来源:发表于2018-05-02 14:24 被阅读22次

    一 参数绑定过程

    从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上 。
    在springmvc中,接受页面提交的数据是通过方法形参来接收的。而不是在controller类定义成员变量接收。


    参数绑定过程

    默认支持的类型

    直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

    • HttpServletRequest
      通过request 对象获取请求信息
    • HttpServletResponse
      通过response处理响应信息
    • HttpSession
      通过session对象得到session中存放的对象
    • Model/ModelMap
      model是一个接口,modelmap是 一个接口实现
      将model数据填充到request域。

    二 简单类型绑定

    简单类型:整型,字符串,单/双精度,布尔型

    @RequestParam常用于处理简单类型绑定
    value:参数名字,即入参的请求参数名字,如value="id"表示请求的参数区中名字为id的参数的值将被传入
    required:是否必须传入,默认是true,表示请求中一定要有相应参数,否则将报错
    defaultValue:设置默认值,如果没有参数传入,将默认值和形参绑定

        @RequestMapping("/editItems")
        public String editItems(Model model,@RequestParam(value = "id",required = true,defaultValue = "1") Integer items_id) throws Exception {
            ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
            model.addAttribute("itemsCustom", itemsCustom);
            return "editItems";
        }
    
    简单类型绑定

    三 pojo绑定

    页面中input的name和controller的pojo形参中的属性名称一致,将页面数据绑定到pojo

    pojo属性名称
    input name名
        @RequestMapping(value = "/editItemsSubmit")
        public String editItemsSubmit(Integer id,ItemsCustom itemsCustom) throws Exception {
            itemsService.updateItems(id,itemsCustom);
            return "success";
        }
    
    乱码

    1 POST请求乱码解决

    注意 在配置web.xml文件时,一定要注意配置顺序
       <!-- 解决post乱码 -->
        <filter>
            <filter-name>characterEncodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>characterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    2 GET请求乱码解决

    修改Tomcat安装目录下conf子目录下的server.xml文件(解决get方式) 【注:记得先停掉服务器】

    找到文件中类似这样的段落:
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

    在里面加上这样一段:URIEncoding="UTF-8" 即变成下面这段
    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />

    最后重启Tomcat即可。

    3 mybatis 传入多个参数(使用注解)

     void updateItems(@Param("id") Integer id,@Param("itemsCustom") ItemsCustom itemsCustom) throws Exception;
    

    xml

        <update id="updateItems">
          update items set
          name=#{itemsCustom.name},
          price=#{itemsCustom.price},
          detail=#{itemsCustom.detail},
          pic=#{itemsCustom.pic}
          where
          id = #{id};
        </update>
    

    四 自定义参数绑定

    对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。将请求日期数据转成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

    需要向处理器适配器中注入自定义的参数绑定组件

        <!--代替配置映射器和适配器
        向处理器适配器中注入自定义的参数绑定组件
        -->
        <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
        <!--自定义参数绑定-->
        <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="converters">
                <list>
                    <!--转换器路径-->
                    <bean class="com.controller.converter.CustomDateConverter"></bean>
                </list>
            </property>
        </bean>
    

    日期转换器

    package com.controller.converter;
    
    import org.springframework.core.convert.converter.Converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    /**
     * 日期转换器
     * @author:Yang
     * @date:2018/5/24
     */
    public class CustomDateConverter implements Converter<String,Date> {
        @Override
        public Date convert(String s) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
            try {
                return simpleDateFormat.parse(s);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    

    五 包装类型绑定

    在形参中让包装类型的pojo接收查询条件参数
    分析:页面传参的特点:复杂,多样性。条件包括:用户账号,商品编号,订单信息。。。如果将用户账号,商品编号,订单信息等等都放在简单pojo(属性是简单类型)中,pojo类属性多,混乱。
    建议使用包装类型的pojo,pojo中的属性是pojo。

    包装类型的pojo

    package com.entity;
    
    /**
     * 商品包装对象
     * @author: Y
     * @date: 2018/4/23
     */
    public class ItemsQueryVo{
        /**
         * 商品信息
         */
        private Items items;
        /**
         *  为了系统可扩展性,对原始生成的po进行扩展
         */
        private  ItemsCustom itemsCustom;
    
        public Items getItems() {
            return items;
        }
    
        public void setItems(Items items) {
            this.items = items;
        }
    
        public ItemsCustom getItemsCustom() {
            return itemsCustom;
        }
    
        public void setItemsCustom(ItemsCustom itemsCustom) {
            this.itemsCustom = itemsCustom;
        }
    }
    

    页面name属性为包装类型pojo中的属性.具体属性

    <form action="${pageContext.request.contextPath}/items/queryItems.action" method="post">
        查询条件:
        <table width="100%" border=1>
            <tr>
                <td>商品名称:<input type="text" name="itemsCustom.name" /></td>
                <td><input type="submit" value="查询"/></td>
            </tr>
        </table>
    </form>
    
    查询成功

    六 数组类型绑定

    需求 商品批量删除,用户选择多个商品,批量删除。
    关键:将页面选择的多个商品id,传到controller方法的形参中

    页面name

    <td><input type="checkbox" value="${item.id}" name="items_id"/></td>
    

    controller形参

        @RequestMapping(value = "/deleteItems")
        public String deleteItems(Integer[] items_id) throws Exception{
    
            return "success";
        }
    
    传递成功

    七 list类型绑定

    通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中

    页面定义


    页面定义

    controller定义
    1 进入批量商品修改页面
    2 批量商品提交
    使用list接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>属性


    定义list<pojo>
        /**
         * 批量修改商品提交
         * 通过ItemsQueryVo接收批量提交的商品信息,将商品信息储存到itemsQueryVo中itemsList属性中
         * @param itemsQueryVo
         * @return
         * @throws Exception
         */
        @RequestMapping(value = "/editItemsAllSubmit")
        public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo) throws Exception{
    
            return "success";
        }
    

    相关文章

      网友评论

        本文标题:参数绑定

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