目录
3.5.4 自定义类型转换器(StringToDateConverter.java)
3.5.5 springmvc.xml 配置注册自定义类型转换器
三、请求参数的绑定
3.1 请求参数的绑定机制
(1)绑定机制
【1】表单提交的数据都是k=v格式的 username=haha&password=123
【2】SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
【3】要求:提交表单的name和参数的名称是相同的
(2)支持的数据类型
【1】基本数据类型和字符串类型
【2】实体类型(JavaBean)
【3】集合数据类型(List、map集合等)
3.2 基本数据类型和字符串类型
注意:
(1)提交表单的name和参数的名称是相同的
(2)区分大小写
3.2.1 index.jsp
<h3>传递参数</h3>
<a href="param/testParam?username=张三&age=18">传递参数(字符串和基本数据类型)</a>
3.2.2 ParamController.java
@Controller
@RequestMapping(value = "/param")
public class paramController {
@RequestMapping(value = "/testParam")
public String testParam(String username,Integer age){
System.out.println("执行了 paramController 中的 testParam 方法!! username:"+username+" age:"+age);
return "success";
}
3.3 实体类型(JavaBean)
(1)提交表单的name和JavaBean中的属性名称需要一致
(2)如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
3.3.1 封装 Account 类
package com.cpz.domain;
import java.util.List;
import java.util.Map;
public class Account {
private String name;
private String password;
private Double money;
private User user;
}
3.3.2 index.jsp
<form action="param/saveAccount" method="post">
账号:<input type="text" name="name"/><br>
密码:<input type="text" name="password"/><br>
金额:<input type="text" name="money"/><br>
用户姓名:<input type="text" name="user.username"/><br>
用户年龄:<input type="text" name="user.age"/><br>
<input type="submit" value="提交"/>
</form>
3.3.3 Controller
@RequestMapping(value = "/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了 paramController 中的 testParam 方法!! account:"+account);
return "success";
}
3.3.4 Post 请求参数中文乱码问题的解决
在 web.xml 中配置 Spring 提供的过滤器类:
<!-- 配置过滤器,解决中文乱码的问题 -->
<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>
3.4 给集合属性数据封装
3.4.1 index.jsp
<form action="param/saveAccount" method="post">
用户姓名(list):<input type="text" name="list[0].username"/><br>
用户年龄(list):<input type="text" name="list[0].age"/><br>
用户姓名(list):<input type="text" name="list[1].username"/><br>
用户年龄(list):<input type="text" name="list[1].age"/><br>
用户姓名(map):<input type="text" name="map['one'].username"/><br>
用户年龄(map):<input type="text" name="map['one'].age"/><br>
用户姓名(map):<input type="text" name="map['two'].username"/><br>
用户年龄(map):<input type="text" name="map['two'].age"/><br>
<input type="submit" value="提交"/>
</form>
3.4.2 Account.java
public class Account {
private String name;
private String password;
private Double money;
private User user;
private List<User> list;
private Map<String,User> map;
}
3.4.3 Controller
@RequestMapping(value = "/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了 paramController 中的 testParam 方法!! account:"+account);
return "success";
}
3.5 自定义类型转换器
3.5.1 User.java
public class User {
private String username;
private Integer age;
private Date birthday;
}
3.5.2 index.jsp
<form action="param/saveUser" method="post">
姓名:<input type="text" name="username"/><br>
年龄:<input type="text" name="age"/><br>
生日:<input type="text" name="birthday"/><br>
<input type="submit" value="提交"/>
</form>
3.5.3 Controller
@RequestMapping(value = "/saveUser")
public String saveUser(User user){
System.out.println("执行了 paramController 中的 saveUser 方法!! user:"+user);
return "success";
}
结论:默认支持的日期格式是:yyyy/MM/dd,如果输入yyyy-MM-dd呢?则会报错,怎么办呢?
3.5.4 自定义类型转换器(StringToDateConverter.java)
package com.cpz.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//把字符串转换成日期的转换器
public class StringToDateConverter implements Converter<String,Date> {
//进行类型转换的方法
public Date convert(String source) {
// 判断,或者return null;
if (source == null){
throw new RuntimeException("参数不能为空");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = df.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
3.5.5 springmvc.xml 配置注册自定义类型转换器
<!-- 注册自定义类型转换器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.cpz.utils.StringToDateConverter"></bean>
</set>
</property>
<!-- 3:配置spring开启注解mvc的支持,自动开启处理器映射器和处理器适配器 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
3.6 在控制器中使用原生的 ServletAPI 对象
3.6.1 index.jsp
<a href="param/testServlet">测试ServletAPI</a>
3.6.2 Controller
@RequestMapping(value = "/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println("执行了 paramController 中的 testServlet 方法!! request:"+request);
System.out.println("session:"+request.getSession());
System.out.println("application:"+request.getSession().getServletContext());
System.out.println("response:"+response);
return "success";
}