SpringMVC学习笔记(二)
一、请求参数的绑定
SpringMVC绑定请求参数的过程是通过把表单提交的请求参数,作为控制器中方法参数进行绑定的。
请求参数类型有三种:1)基本类型数据 2)实体类对象 3)数组和集合类型数据
1.基本类型数据
基本类型数据包括了Java的基本类型以及String类型
示例程序:
<a href="param/testParam?username=hehe&password=123456">请求参数绑定</a>
@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("执行了。。。");
System.out.println("你的用户名:" + username + " 你的密码:" + password);
return "success" ;
}
2.实体类对象
将数据封装成实体类对象,也同样很简单。只需要令接收端Controller类方法以被封装类为参数,发送端jsp中将属性名与被封装类的属性名相同即可。
示例程序:
public class Account implements Serializable {
private String username ;
private String password ;
private Double money ;
private User user ;
/**
*省略getter、setter、toString方法
*/
}
public class User implements Serializable {
private String uname ;
private Integer age ;
/**
*省略getter、setter、toString方法
*/
}
/**
* 把请求参数封装到一个Java类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了。。。");
System.out.println(account);
return "success" ;
}
<form action="param/saveAccount" method="post">
性名:<input type="text" name="username">
密码:<input type="text" name="password">
金额:<input type="text" name="money">
用户性名:<input type="text" name="user.uname">
用户年龄:<input type="text" name="user.age">
<input type="submit" value="提交">
</form>
3.数组或集合类型
数组或集合类型的封装与嵌套对象及其类似,同样十分简单
示例程序:
public class Account implements Serializable {
private String username ;
private String password ;
private Double money ;
private List<User> list ;
private Map<String,User> map ;
/**
*省略getter、setter、toString方法
*/
}
/**
* 把请求参数封装到一个Java类中
* @return
*/
@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("执行了。。。");
System.out.println(account);
return "success" ;
}
<%-- 把数据封装到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/>
用户性名:<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/>
<input type="submit" value="提交">
4.配置解决中文乱码的过滤器
当通过表单使用post方式发送中文数据时,会在控制台出现乱码的问题。
要解决上述问题,只需在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>
5.特殊情况
在实际开发过程中,有可能会面临前台传入的数据,与后台接受类型封装不上的情况。这时候,我们需要编写自定义的数据类型转换方法,并且向类型转换器注册,最后开启注册生效按钮。
示例:在接受Date数据时,默认格式是yyyy/mm/dd,当我们以yyyy-mm-dd的形式传入时,会出现封装不上的情况。所以我们编写一个自定义的转换方法,并向类型转换器注册,最后开启注册生效按钮即可。
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String s) {
//判断
if(s == null){
throw new RuntimeException("请您传入数据");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(s);
} catch (Exception e) {
throw new RuntimeException("数据类型转换出现错误");
}
}
}
<!-- 配置自定义类型转换器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" >
<set>
<bean class="cn.itcast.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
6.获取Servlet原生API
想要获取Servlet原生API,直接将ServletAPi对象作为控制器方法的参数即可。
二、常用注解
1.RequestParam
作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数的名称
required:请求参数中是否必须提供此参数。默认值:true,表示必须提供,如不提供则报错
2.RequestBody
作用:
用于获取请求体内容。如果直接使用请求体,则会得到key=value&key=value…结构的数据
get请求方式不适用
属性:
required:是否必须有请求体。默认值是,true。当取值为true时,get请求方式会报错。取值为false时,get请求方式得到的是null
3.PathVariable
作用:
用于绑定url中的占位符。例如:请求url中/delete/{id},这个id就是url占位符
url支持占位符是Spring3.0之后加入的。是springmvc支持RESTful风格url的一个重要标志
属性:
value:用于请求url中占位符的名称
required:是否必须提供占位符
4.CookieValue
作用:
用于把指定cookie名称的值传入控制器方法参数
属性:
value:指定cookie的值
required:是否必须有此cookie