Servlet原生API支持:
绑定简单的参数类型:
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整型:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0。
绑定简单数据类型参数,只需要直接形参声明
注意:形参的参数名和传递的参数名保持一致
建议使用包装类型
参数绑定两步骤:
- 从request中getParameter;
- 根据形参定义的参数类型进行类型转换和赋值
@RequestParam使用
/**
* @RequestParam:从请求中把某一个参数取出赋值给当前形参
* value属性:指定从请求中获取哪个参数赋值给当前形参
* defaultValue:默认值,如果获取的参数值为空,则取该默认值(场景:分页的第一页)
* @param modelAndView
* @param id
* @return
*/
@RequestMapping(value = "sendSimpleParams2")
public ModelAndView sendSimpleParams2(ModelAndView modelAndView,@RequestParam(value = "ids",defaultValue = "3") Integer id) {
Date date = new Date();
modelAndView.addObject("nowDate", date + " id==>>" + id);
modelAndView.setViewName("result");
return modelAndView;
}
绑定pojo类型参数:
直接形参声明pojo即可接收
要求:传递的参数名必须和pojo属性名对应
/**
* 绑定pojo类型参数,只需要直接在形参中声明pojo即可
* 要求:请求参数名和pojo属性名保持一致
* @param modelAndView
* @param user
* @return
*/
@RequestMapping("sendPojo")
public ModelAndView sendPojo(ModelAndView modelAndView,User user) {
Date date = new Date();
modelAndView.addObject("nowDate", date + " user==>>" + user);
modelAndView.setViewName("result");
return modelAndView;
}
重点在于传参参数的命名
pojo包装对象首先就是一个普通的pojo,就应该按照上面绑定pojo的要求来,然后进一步处理。
传参时参数名,首先应该定位到包装对象的属性名,如果不能确定数据,通过属性.的方式进一步锁定即可。
<fieldset>
<p>传递(绑定)pojo包装类型参数</p>
<a href="${pageContext.request.contextPath}/user/sendPojoPackage.action?user.id=1&user.username=lisi">测试</a>
</fieldset>
/**
* 绑定pojo包装类型参数,只需要直接在形参中声明pojo包装对象即可
* 注意:绑定pojo包装类型参数,重点在于前台参数参数名的取法,首先定位到pojo的属性,然后通过.的方式进一步确定
* @param modelAndView
* @return
*/
@RequestMapping("sendPojoPackage")
public ModelAndView sendPojoPackage(ModelAndView modelAndView, QueryVo queryVo) {
Date date = new Date();
modelAndView.addObject("nowDate", date + " queryVo==>>" + queryVo);
modelAndView.setViewName("result");
return modelAndView;
}
绑定pojo包含集合类型参数:
传递绑定集合类型(List/Map),作为POJO的一个属性来传递。
<fieldset>
<p>测试用例USE_CASE10:SpringMVC接收集合(List)类型参数</p>
<form method="post" action="${pageContext.request.contextPath}/user/sendList.action">
<table>
<tr>
<td>主键</td>
<td>用户名</td>
<td>性别</td>
</tr>
<tr>
<td><input type="text" name="userList[0].id"/></td>
<td><input type="text" name="userList[0].username"/></td>
<td><input type="text" name="userList[0].sex"/></td>
</tr>
<tr>
<td><input type="text" name="userList[1.id"/></td>
<td><input type="text" name="userList[1].username"/></td>
<td><input type="text" name="userList[1].sex"/></td>
</tr>
<tr>
<td><input type="text" name="userList[2].id"/></td>
<td><input type="text" name="userList[2].username"/></td>
<td><input type="text" name="userList[2].sex"/></td>
</tr>
</table>
<input type="submit" value="批量修改提交">
</form>
</fieldset>
<fieldset>
<p>测试用例USE_CASE11:SpringMVC接收集合(Map)类型参数</p>
<form method="post" action="${pageContext.request.contextPath}/user/sendMap.action">
<table>
<tr>
<td>主键</td>
<td>用户名</td>
<td>性别</td>
</tr>
<tr>
<td><input type="text" name="userMap['key1'].id"/></td>
<td><input type="text" name="userMap['key1'].username"/></td>
<td><input type="text" name="userMap['key1'].sex"/></td>
</tr>
<tr>
<td><input type="text" name="userMap['key2'].id"/></td>
<td><input type="text" name="userMap['key2'].username"/></td>
<td><input type="text" name="userMap['key2'].sex"/></td>
</tr>
<tr>
<td><input type="text" name="userMap['key3'].id"/></td>
<td><input type="text" name="userMap['key3'].username"/></td>
<td><input type="text" name="userMap['key3'].sex"/></td>
</tr>
</table>
<input type="submit" value="批量修改提交">
</form>
</fieldset>
后端handler写法:
/**
* 用例:springmvc绑定list集合
* 重点在于前端参数的取值方式
* @param modelAndView
* @return
*/
@RequestMapping("sendList")
public ModelAndView sendList(QueryVo queryVo, ModelAndView modelAndView) {
Date date = new Date();
modelAndView.addObject("nowDate",date + "--->>>queryVo:" + queryVo);
modelAndView.setViewName("result");
return modelAndView;
}
/**
* 用例:springmvc绑定map集合
* 重点在于前端参数的取值方式
* @param modelAndView
* @return
*/
@RequestMapping("sendMap")
public ModelAndView sendMap(QueryVo queryVo, ModelAndView modelAndView) {
Date date = new Date();
modelAndView.addObject("nowDate",date + "--->>>queryVo:" + queryVo);
modelAndView.setViewName("result");
return modelAndView;
}
自定义转换器:
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 自定义类型转换器实现改接口,Converter<S,T>
* S:source,转换前的数据类型
* T:target,转换后的数据类型
*/
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;
}
}
注册自定义类型转换器
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.util.StringToDate"/>
</set>
</property>
</bean>
消息头相关的两个注解:(不常用非重点)
@RequestHeader:
@CookieValue:
乱码问题处理:
Post请求乱码,web.xml中加入过滤器。
<!-- 解决post乱码问题 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<!-- 设置编码参是UTF8 -->
<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>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Get请求乱码:
Get请求乱码需要修改tomcat下server.xml的配置。
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>