zoukankan      html  css  js  c++  java
  • SpringMVC参数绑定

    一、参数绑定原理

    1、什么是参数绑定?

    前台页面通常会有数据提交给后台进行处理(如提交表单),参数绑定的作用就是将这些数据正确地交给Controller进行处理。

    2、参数绑定的实现

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

    二、参数绑定支持

    1、默认支持的类型

    SpringMVC 有支持的默认参数类型,我们直接在形参上给出这些默认类型的声明,就能直接使用了。如下:

    HttpServletRequest 类型

    HttpServletResponse 类型

    HttpSession 类型

    Model/ModelMap 类型 

    Controller:

        @RequestMapping("/default")
        public String index(HttpServletRequest request, 
                HttpServletResponse response, 
                HttpSession session, 
                Model model, 
                ModelMap modelMap) {
            request.setAttribute("request", "request类型");
            session.setAttribute("session", "session类型");
            model.addAttribute("model", "model类型");
            modelMap.addAttribute("modelMap", "modelMap类型");
            
            return "success";
        }

    success.jsp

    <body>
    ${request}
    ${session}
    ${model}
    ${modelMap}
    </body>

    结果:

    2、基本数据类型(对应的包装类型)绑定

    int(Integer)、short(Short)、long(Long)、float(Float)、

    double(Double)、byte(Byte)、char(Character)、boolean(Boolean)、String

    controller:

        // springmvc可以直接接收基本数据类型和String,可以自动进行类型转换
        // Controller方法接收的参数的变量名称必须等于页面中input标签中name属性值
        @RequestMapping("/updateitem1")
        public String update1(Integer id, String name, Float price, String detail) throws Exception {
            Items items = new Items();
            items.setId(id);
            items.setName(name);
            items.setPrice(price);
            items.setDetail(detail);
            itemsService.updateItems(items);
            return "success";
        }

    editForm.jsp

    <form id="itemForm"    action="${pageContext.request.contextPath }/updateitem1.action" method="post">
            <input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
            <table width="100%" border=1>
                <tr>
                    <td>商品名称</td>
                    <td><input type="text" name="name" value="${item.name }" /></td>
                </tr>
                <tr>
                    <td>商品价格</td>
                    <td><input type="text" name="price" value="${item.price }" /></td>
                </tr>
                <tr>
                    <td>商品简介</td>
                    <td><textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="提交" />
                    </td>
                </tr>
            </table>
    
        </form>

    注意:表单中input的name值和Controller方法里的参数变量名保持一致,就能完成数据绑定。当然也可以不一致,不一致就必须使用@RequestParam 注解来完成。例如:

        @RequestMapping("/updateitem1")
        public String update1(Integer id, @RequestParam("name")String username, Float price, String detail) throws Exception {
            // code 
        }

    使用注解 @RequestParam ,我们可以使用任意形参,但是注解里面的 value 属性值要和表单的name属性值一样。

    3、实体类(POJO)类型绑定

    SpringMVC提供了一个更加智能、更少代码的绑定方式,就是实体类绑定。相比上面的一种方式,可以不需在Controller中使用set方法设置实体类属性。要求:前台页面中如input中name属性值必须等于实体类对应的属性

    实体类User.java

    package cn.itheima.pojo;
    
    import java.util.Date;
    
    public class User {
        private Integer id;
    
        private String username;
    
        private Date birthday;
    
        private String sex;
    
        private String address;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username == null ? null : username.trim();
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex == null ? null : sex.trim();
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address == null ? null : address.trim();
        }
    }

    页面editItem.jsp

    <form id="itemForm"    action="${pageContext.request.contextPath }/updateitem2.action" method="post">
            <input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
            <table width="100%" border=1>
                <tr>
                    <td>商品名称</td>
                    <td><input type="text" name="name" value="${item.name }" /></td>
                </tr>
                <tr>
                    <td>商品价格</td>
                    <td><input type="text" name="price" value="${item.price }" /></td>
                </tr>
                <tr>
                    <td>商品简介</td>
                    <td><textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="提交" />
                    </td>
                </tr>
            </table>
    
        </form>

    Controller:

        // springmvc可以直接接收pojo类型,这样比上面接收基本类型更快捷,要求input标签中name属性值必须等于pojo中属性名称
        @RequestMapping("/updateitem2")
        public String update2(Items items) throws Exception {
            itemsService.updateItems(items);
            return "success";
        }

    注:实体类User中有个属性为birthday,类型为Date,页面中input框传入的birthday是String类型,传递给Controller必须转换为Date。这时候必须使用“自定义转换器”。

    如editItem.jsp中表单里增加一个商品生产日期:

    <form id="itemForm"    action="${pageContext.request.contextPath }/updateitem2.action" method="post">
            <input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
            <table width="100%" border=1>
                <tr>
                    <td>商品名称</td>
                    <td><input type="text" name="name" value="${item.name }" /></td>
                </tr>
                <tr>
                    <td>商品价格</td>
                    <td><input type="text" name="price" value="${item.price }" /></td>
                </tr>
                
                <tr>
                    <td>商品生产日期</td>
                    <td><input type="text" name="createtime"
                        value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>" /></td>
                </tr>
                <tr>
                    <td>商品简介</td>
                    <td><textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
                    </td>
                </tr>
                <tr>
                    <td colspan="2" align="center"><input type="submit" value="提交" />
                    </td>
                </tr>
            </table>
    
        </form>

    自定义转换器:

    package cn.itheima.controller.converter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.springframework.core.convert.converter.Converter;
    
    /**
     * S - source:源
     * T - target:目标
     * @author Administrator
     *
     */
    public class CustomGlobalStrToDateConverter implements Converter<String, Date> {
    
        @Override
        public Date convert(String source) {
            try {
                Date date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source);
                return date;
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    在SpringMvc.xml中配置自定义转换器

         <!-- 注解驱动:自动配置最新版的处理器映射器和处理器适配器 -->
         <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
        
         <!-- 注:一定要将自定义的转换器配置到注解驱动上 -->
         <!-- 转换器配置 -->
         <bean id="conversionService"
            class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <property name="converters">
                <set>
                    <bean class="cn.itheima.controller.converter.CustomGlobalStrToDateConverter"/>
                </set>
            </property>
         </bean>

    4、数组类型参数绑定

    使用场景:有时候对于一些数据需要批量处理,如批量删除,这时候需要用到数组类型的绑定。

    QueryVO.java

    package cn.itheima.vo;
    
    import java.util.List;
    
    import cn.itheima.pojo.Items;
    
    public class QueryVO {// 批量删除使用
        private Integer[] ids;public Integer[] getIds() {
            return ids;
        }
        public void setIds(Integer[] ids) {
            this.ids = ids;
        }
    }

    itemList.jap

    <form action="${pageContext.request.contextPath }/delAll.action" method="post">
    查询条件:
    <table width="100%" border=1>
    <tr>
    <td>商品名称:<input type="text" name="items.name"></td>
    <td>商品价格:<input type="text" name="items.price"></td>
    <td><input type="submit" value="批量删除"/></td>
    </tr>
    </table>
    商品列表:
    <table width="100%" border=1>
    <tr>
        <td></td>
        <td>商品名称</td>
        <td>商品价格</td>
        <td>生产日期</td>
        <td>商品描述</td>
        <td>操作</td>
    </tr>
    <c:forEach items="${itemList}" var="item">
    <tr>
        <!-- name属性值要和QueryVO中接收的属性名称一致 -->
        <td>
            <input type="checkbox" name="ids" value="${item.id}"/>
        </td>
        <td>${item.name}</td>
        <td>${item.price}</td>
        <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
        <td>${item.detail}</td>
        
        <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
    
    </tr>
    </c:forEach>
    
    </table>
    </form>

    Controller

        @RequestMapping("/delAll")
        public String delAll(QueryVO vo) throws Exception {
            // 如果批量删除,一堆input框,那么可以提交数组
            System.out.println(vo);
            return "";
        }

    5、List类型参数绑定

    使用场景:批量修改Items信息

    QueryVO.java

    package cn.itheima.vo;
    
    import java.util.List;
    
    import cn.itheima.pojo.Items;
    
    public class QueryVO {// 批量修改操作
        private List<Items> itemsList;
        
        public List<Items> getItemsList() {
            return itemsList;
        }
        public void setItemsList(List<Items> itemsList) {
            this.itemsList = itemsList;
        }
    }

    Controller

        @RequestMapping("/updateAll")
        public String updateAll(QueryVO vo) throws Exception {
            System.out.println(vo);
            return "";
        }

     itemList.jsp

    <c:forEach items="${itemList}" var="item" varStatus="status">
    <tr>
        <!-- name属性值要和QueryVO中接收的属性名称一致 -->
        <td>
            <input type="checkbox" name="ids" value="${item.id}"/>
            <input type="hidden" name="itemsList[${status.index}].id" value="${item.id}"/>
        </td>
        <td><input type="text" name="itemsList[${status.index}].name" value="${item.name}"/></td>
        <td><input type="text" name="itemsList[${status.index}].price" value="${item.price}"/></td>
        <td><input type="text" name="itemsList[${status.index}].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
        <td><input type="text" name="itemsList[${status.index}].detail" value="${item.detail}"/></td>
        
        <td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
    
    </tr>
    </c:forEach>
  • 相关阅读:
    理解盒子模型
    Jackson 框架,轻易转换JSON
    JAVA仿百度分页
    最干净,最便捷的卸载Mysql
    Mysql 6.0安装过程(截图放不上去)
    开发JSP自定义标签
    JAVA实现文件上传
    开发过程中常用工具类
    JQUERY 简单易用的提示框插件
    什么是Bash Shell的内建(build in)命令
  • 原文地址:https://www.cnblogs.com/binaway/p/9221321.html
Copyright © 2011-2022 走看看