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

    • spring参数绑定过程 

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

    • 默认支持的类型

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

      1、HttpServletRequest

      通过request对象获取请求信息。

      2、HttpServletResponse

      通过response处理响应信息

      3、HttpSession

      通过session对象得到session中存放的对象

      4、Model/ModelMap

      model是一个接口,modelMap是一个接口实现。用:将model数据填充到request域。

    • 简单类型

      通过@RequestParam对简单类型的参数进行绑定。如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功,如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,则会报错。

    • POJO绑定

      1、简单的POJO

      将pojo对象中的属性名于传递进来的属性名对应,如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中

      2、复杂的POJO

       与简单的POJO差不过,只是在页面上将页面属性设置为pojo类型的属性,如:

    1 <input type="text" name="items.name" />
    • 自定义参数绑定实现日期类型绑定

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

      自定义日期类型绑定:

     1 public class CustomDateConverter implements Converter<String,Date>{
     2 
     3     @Override
     4     public Date convert(String source) {
     5         //将实际的字符串转为date类型
     6         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     7         try {
     8             //转换成功直接返回
     9             return sdf.parse(source);
    10         } catch (ParseException e) {
    11             // TODO Auto-generated catch block
    12             e.printStackTrace();
    13         }
    14         //转换失败返回null
    15         return null;
    16     }
    17 
    18 }

      配置方式:springmvc.xml

     1 <mvc:annotation-driven conversion-service="conversionService"/>
     2 <!-- 自定义参数绑定 -->
     3     <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
     4         <!-- 转换器 -->
     5         <property name="converters">
     6             <list>
     7                 <!-- 日期类型转换 -->
     8                 <bean class="com.luchao.converter.CustomDateConverter"/>
     9             </list>
    10         </property>
    11     </bean>
    • 集合类型绑定

      1、数组绑定

      如果要批量删除删除,用户在页面选择多个商品,批量删除。

      将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id

      如下代码:

    1 // 批量删除
    2     @RequestMapping(value="/deleteItems")
    3     public void deleteItems(String[] item_ids) throws Exception {
    4         for (String string : item_ids) {
    5             System.out.println(string);
    6         }
    7     }

      2、list绑定

      通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门课成绩,批量提交)。

      页面属性:

    <c:forEach items="${itemsList }" var="item" varStatus="status">
    <tr>    
    
        <td><input name="itemsList[${status.index }].name" value="${item.name }"/></td>
        <td><input name="itemsList[${status.index }].price" value="${item.price }"/></td>
        <td><input name="itemsList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
        <td><input name="itemsList[${status.index }].detail" value="${item.detail }"/></td>
    
    
    </tr>
    </c:forEach>

      controller中将包装list集合的POJO作为参数。

      3、Map绑定

      页面属性:

    <tr>
    <td>学生信息:</td>
    <td>
    姓名:<inputtype="text"name="itemInfo['name']"/>
    年龄:<inputtype="text"name="itemInfo['price']"/>
    </td>
    </tr>

      controller中将包装Map集合的POJO作为参数。

      如果出现乱码问题,需要添加一个拦截器,spring已经帮我们实现,配置如下:web.xml

     1 <filter>
     2         <filter-name>CharacterEncodingFilter</filter-name>
     3         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     4         <init-param>
     5             <param-name>encoding</param-name>
     6             <param-value>utf-8</param-value>
     7         </init-param>
     8     </filter>
     9     <filter-mapping>
    10         <filter-name>CharacterEncodingFilter</filter-name>
    11         <url-pattern>/*</url-pattern>
    12     </filter-mapping>

      另外,也可以将tomcat配置文件添加编码与工程编码一致,如下:

    1 <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

      另外一种方法对参数进行重新编码:

    1 String userName = new 
    2 String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

      ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。最后一种实现比较麻烦。

      现在对SpringMVC已经有了一定的认识,比较其与struts2的一些特点可以加强认识。

      1、springmvc基于方法开发的,struts2基于类开发的。

      springmvcurlcontroller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method方法执行结束,形参数据销毁。springmvccontroller开发类似service开发。

      2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

      3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl

  • 相关阅读:
    实现 ajax 多项选择框
    Ajax 文件上传之PHP心得
    php tree生成树分享
    基于JQuery框架的AJAX
    jQuery Ajax 全解析
    asp 下载函数
    10元奥运纪念钞明发行 与人民币等值流通
    jQuery(Ajax)/PHP/MySQL实现搜索自动提示功能
    隔行扫描和逐行扫描(interlace and progressive )
    VGA 输出调试
  • 原文地址:https://www.cnblogs.com/lcngu/p/5510362.html
Copyright © 2011-2022 走看看