SpringMVC学习--参数绑定

时间:2024-01-11 12:10:44
  • spring参数绑定过程 

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

SpringMVC学习--参数绑定

  • 默认支持的类型

  直接在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类型的属性,如:

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

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

  自定义日期类型绑定:

 public class CustomDateConverter implements Converter<String,Date>{

     @Override
public Date convert(String source) {
//将实际的字符串转为date类型
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
//转换成功直接返回
return sdf.parse(source);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//转换失败返回null
return null;
} }

  配置方式:springmvc.xml

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

  1、数组绑定

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

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

  如下代码:

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

  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

 <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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

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

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

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

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

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

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

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

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

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

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