1.支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、map集合等)
1.基本数据类型和字符串类型
- 提交表单的name和参数的名称是相同的
- 区分大小写
control层(控制层)
/**
* 请求参数的绑定
* */
@Controller
@RequestMapping("/param")
public class ParamController {
//请求参数绑定入门
@RequestMapping("/testParam")
public String testParam(String username, String password) {
System.out.println("testParam执行了");
System.out.println("你的用户名:" + username);
System.out.println("你的登录密码:" + password);
return "success";
}
param.jsp
<%--请求参数绑定--%>
<a href="param/testParam?username=jh&password=123">请求参数绑定</a>
user类(domain) 省略set和get方法,toString()方法
public class User implements Serializable {
private String uname;
private Integer age;
public String getUname() {
return uname;
}
结果:
testParam执行了
你的用户名:jh
你的登录密码:123
2.实体类型(JavaBean)
- 提交表单的name和JavaBean中的属性名称需要一致
- 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name
control层(控制层)
/请求参数绑定把数据封装到JavaBean的类中(这里封装到Account类中)
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
System.out.println("saveAccount执行了");
System.out.println(account);
return "success";
param.jsp
提交表单的name和JavaBean中(Account类)的属性名称需要一致
<%--把数据封装到Account类中--%>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
User姓名:<input type="text" name="user.uname"/><br/>
User年龄:<input type="text" name="user.age"/><br/>
<input type="submit" value="提交"/>
</form>
Account类省略set和get方法,有引用类型User
public class Account implements Serializable {
private String username;
private String password;
private double money;
private User user;
结果:
1.请求参数绑定实体类型User
saveAccount执行了
Account{username='ghh', password='1234', money=1200.0,
user=User{uname='jh', age=25}}
3. 给集合属性数据封装
- JSP页面编写方式:list[0].属性
control层(控制层)
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
System.out.println("saveAccount执行了");
System.out.println(account);
return "success";
param.jsp
List集合和Map集合
<%--把数据封装到Account类中,类中存在list和map集合--%>
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
<%--List集合--%>
User姓名:<input type="text" name="list[0].uname"/><br/>
User年龄:<input type="text" name="list[0].age"/><br/>
User姓名:<input type="text" name="list[1].uname"/><br/>
User年龄:<input type="text" name="list[1].age"/><br/>
<%--Map集合--%>
User姓名:<input type="text" name="map['one'].uname"/><br/>
User年龄:<input type="text" name="map['one'].age"/><br/>
User姓名:<input type="text" name="map['two'].uname"/><br/>
User年龄:<input type="text" name="map['two'].age"/><br/>
<input type="submit" value="提交"/>
</form>
Account类 只有List和Map属性,其他省去
public class Account implements Serializable {
private List<User> list;
private Map<String,User> map;
结果:(解决中文乱码)
3.参数绑定集合list和map
Account{username='张天', password='12389', money=12000.0, user=null,
list=[User{uname='光头强', age=23}, User{uname='光头黑', age=24}],
map={one=User{uname='熊大', age=12}, two=User{uname='熊二', age=11}}}
4.请求参数中文乱码的解决
- 在web.xml中配置Spring提供的过滤器类
<!-- 配置过滤器,解决中文乱码的问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filterclass>
<!-- 指定字符集 -->
<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>
结果:
2.在web.xml中解决post提交中文乱码问题:
saveAccount执行了
Account{username='张三', password='12334', money=14525.0, user=User{uname='李四', age=34}}
5. 自定义类型转换器
- 表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。
- 如果想自定义数据类型转换,可以实现Converter的接口
- 自定义类型转换器
control层(控制层)
/*封装到User2类中,类型转换器:日期格式:只有这种格式不报错1998/12/11*/
@RequestMapping("/saveDate")
public String saveUser2(User2 user) {
System.out.println("saveAccount执行了");
System.out.println(user);
return "success";
}
param.jsp
<form action="param/saveDate" method="post">
姓名:<input type="text" name="uname"/><br/>
密码:<input type="text" name="age"/><br/>
日期:<input type="text" name="date"/><br/>
<input type="submit" value="提交"/>
</form>
user2类(domain) 省略set和get方法,toString()方法
/**添加了日期属性*/
public class User2 implements Serializable {
private String uname;
private Integer age;
private Date date;
自定义类型转换器(自己写的,不是SpringMVC提供的)
StringToDateConverter类
/**将字符串转换日期:标准日期格式不报错 1998/12/11
* 为了解决日期格式:1998-12-12等格式的异常,需要定义一个类型转换器
* */
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {//source是传进来的字符串
//判断
if (source == null) {
throw new RuntimeException("请您传入数据:");
}
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
//将字符串转换成日期
try {
return df.parse(source);
} catch (ParseException e) {
throw new RuntimeException("数据类型转换出现错误");
}
}
}
结果:
User2{uname='张甜甜', age=1425, date=Fri Dec 11 00:00:00 CST 1998}
1995-12-12格式结果如下:
User2{uname='撒', age=12, date=Tue Dec 12 00:00:00 CST 1995}
2.如果不想自己写类型转换器,在springmvc.xml配置文件中编写配置
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.jh.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/><!--conversionService把自定义类型转换器生效-->
6.获取原生API
control层(控制层)
//获取原生的API
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response) {
System.out.println("testServlet执行了");
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";
}
param.jsp
<a href="param/testServlet">Servlet原生的API</a>
结果:
org.apache.catalina.connector.RequestFacade@5a09c28e
org.apache.catalina.session.StandardSessionFacade@5f6c9ddb
org.apache.catalina.core.ApplicationContextFacade@5120c2c2
org.apache.catalina.connector.ResponseFacade@87f414