第三章:请求参数的绑定
请求参数的绑定说明
-
绑定机制
1.表单提交的数据都是k=v格式的 username=haha&password=123 2.SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的 3.要求:提交表单的name和参数的名称是相同的
-
支持的数据类型
1.基本数据类型和字符串类型 2.实体类型(JavaBean) 3.集合数据类型(List、map集合等)
2、基本数据类型和字符串类型
-
提交表单的name和参数的名称是相同的
-
区分大小写
3、实体类型(JavaBean)
-
提交表单的name和JavaBean中属性名称需要一致
-
如果一个JavaBean类中包含其它的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
4、给集合属性数据封装
用户姓名:<input type="text" name="list[0].uname" /><br/>
用户年龄:<input type="text" name="list[0].age" /><br/>
用户姓名:<input type="text" name="map['one'].uname" /><br/>
用户年龄:<input type="text" name="map['one'].age" /><br/>
5、解决中文乱码
6、自定义类型转换器
表单提交的任何数据类型都是字符串类型,但是后台定义Integer类型,数据可以封装,说明Spring框架内部会默认进行数据类型转换。
如果想自定义类型转换可以实现Converter接口。
7、在控制器中使用原生的ServletAPI对象
只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象
一、入门示例:
- webapp下编写params.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--请求参数绑定--%>
<a href="param/testParam?username=hehe&password=123">请求参数绑定</a>
</body>
</html>
- controller下编写ParamController
/**
* 请求参数绑定
*/
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 请求参数绑定入门
* @return
*/
@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("执行了。。。");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
return "success";
}
}
二、把数据封装到JavaBean的类中:
- webapp下编写params.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username" /><br/>
密码:<input type="text" name="password" /><br/>
金额:<input type="text" name="money" /><br/>
用户姓名:<input type="text" name="user.uname" /><br/>
用户年龄:<input type="text" name="user.age" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
- controller下编写ParamController
/**
* 请求参数绑定
*/
@Controller
@RequestMapping("/param")
public class ParamController {
/**
* 请求参数绑定入门
* @return
*/
@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("执行了。。。");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
return "success";
}
/**
* 请求参数绑定把数据封装到JavaBean的类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了。。。");
System.out.println(account);
return "success";
}
}
- domain下Account和User:
public class Account implements Serializable {
private String username;
private String password;
private Double money;
private User user;
//省略get,set,tostring方法。
}
public class User implements Serializable {
private String uname;
private Integer age;
//省略get,set,tostring方法。
}
- 解决中文乱码,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>
- 在Account里添加List和Map集合,给集合封装,在param.jsp上改:
用户姓名:<input type="text" name="list[0].uname" /><br/>
用户年龄:<input type="text" name="list[0].age" /><br/>
用户姓名:<input type="text" name="map['one'].uname" /><br/>
用户年龄:<input type="text" name="map['one'].age" /><br/>
- 三种执行结果:
在http://localhost:8080/springmvc_day01_01_start/params.jsp上填入表单数据。
执行了。。。
Account{username='hehe', password='456', money=300.0, user=User{uname='haha', age=20}}
执行了。。。
Account{username='哈哈', password='111', money=1.0, user=User{uname='呵呵', age=10}}
执行了。。。
Account{username='呵呵', password='123', money=1000.0, list=[User{uname='哈哈', age=20}], map={one=User{uname='嘿嘿', age=30}}}
三、自定义类型转换器
日期输入2000/1/1时,属于正常格式,可以转换;但是2000-1-1就会报错。
-
在User加入Date属性,
-
添加utils层:
package cn.itcast.utils;
import org.springframework.core.convert.converter.Converter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 把字符串转换成日期
*/
public class StringToDateConverter implements Converter<String, Date> {
/**
* @param source 传进来的字符串
* @return
*/
@Override
public Date convert(String source) {
//判断
if(source == null){
throw new RuntimeException("请您传入数据");
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
//转换
try {
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("数据类型转换出错");
}
}
}
- 配置springmvc.xml:
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--开启Spring对MVC注解的支持-->
<mvc:annotation-driven conversion-service="conversionService"/>
- 修改params.jsp:
<%--自定义类型转换器--%>
<form action="param/saveUser" method="post">
用户姓名:<input type="text" name="username" /><br/>
用户密码:<input type="text" name="password" /><br/>
用户生日:<input type="text" name="date" /><br/>
<input type="submit" value="提交" />
</form>
- 结果,表单日期栏输入2000-1-1,转换成功:
执行了。。。
User{uname='null', age=null, date=Sat Jan 01 00:00:00 CST 2000}
四、在控制器中使用原生的ServletAPI对象
- 修改params.jsp:
<a href="param/testServlet">Servlet原生的API</a>
- 修改ParamController:
/**
* 原生API
* @param
* @return
*/
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
System.out.println("执行了。。。");
System.out.println(request);
HttpSession session = request.getSession();
System.out.println(session);
ServletContext servletContext = session.getServletContext();
System.out.println(servletContext);
System.out.println(response);
return "success";
}