1. 绑定表单参数
/**
* 接收表单参数:用注解@RequestParam
* 作用:把一个表单参数,绑定给方法的一个形参。实现参数绑定
* 属性:
* name/value:表单参数名称
* required:表单参数是否必须有值。
* 如果required设置为true,表示必须传这个表单参数(允许传空值),否则报错400(bad request)
* defaultValue:参数的默认值。如果没有传递这个表单参数,就取默认值
*
* 客户端提交路径:
* 服务端接收参数:
* 1. 在方法上加形参,一个形参对应一个表单参数
* 2. 在方法形参上加注解@RequestParam("表单参数名")
*/
@RequestMapping("/param1")
public String param1(@RequestParam("username") String name,
@RequestParam(value = "age", required = false, defaultValue = "80") Integer age){}
2.绑定简单参数
/**
* 参数的直接绑定:
* 如果表单参数名称,和方法形参名称相同,SpringMVC会自动进行参数绑定。不需要再加@RequestParam
*
* 提交的参数: /req/param2?username=tom&age=20 与形参名一致
*/
@RequestMapping("/param2")
public String param2(String username, Integer age){}
3.自定义类型转换
类型转换器
说明:
如果表单参数是简单类型,SpringMVC能够自动转换类型并绑定到方法形参上
如果表单参数是
yyyy/MM/dd
格式的日期:SpringMVC能够自动转换成为Date
对象,绑定到方法形参上但是如果表单是其它格式的日期,SpringMVC不能自动转换类型
解决:
自定义类型转换器,把参数转换成想要的类型,再绑定到形参上
步骤:
创建类,实现类型转换器接口:
Converter<S, T>
, 重写convert()
方法
S
:源数据的类型
T
:目标数据的类型在
springmvc.xml
中注册类型转换器,语法如下:
<mvc:annotation-driver conversion-service="conversionService"/>
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="自定义类型转换器的全限定类名"/>
</set>
</property>
</bean>
3.自定义的类型转换器,示例:
public class MyDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
if (source == null || "".equals(source)) {
return null;
}
SimpleDateFormat format = new SimpleDateFormat();
//1.尝试按照yyyy/MM/dd格式解析;如果解析成功,就直接返回结果;如果解析失败,往后继续执行
try {
format.applyPattern("yyyy/MM/dd");
return format.parse(source);
} catch (ParseException e) {}
//2.再尝试以yyyy-MM-dd格式解析;如果解析成功,就直接返回结果;如果解析失败,输出错误信息
try {
format.applyPattern("yyyy-MM-dd");
return format.parse(source);
} catch (ParseException e) {
System.err.println("不支持的日期格式:" + source);
}
return null;
}
4.绑定pojo对象
绑定简单POJO
SpringMVC可以帮我们自动把表单参数,封装成POJO对象,但是要求:
客户端提交的表单参数名称,必须等于JavaBean的属性名
绑定复杂POJO
要求
通常把List、Map等放到POJO对象里
客户端提交的表单参数名称,必须和POJO里的属性名称相等
设置List的数据时,表单参数名称:
属性名[索引].属性名
设置Map的数据时,表单参数名称:
属性名['key'].属性名
5. 中文参数乱码的解决
在web.xml中,配置过滤器
CharacterEncodingFilter
<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>
6. 其它常用注解
6.1:@RequestBody
【重点】注解说明
作用:用于接收请求体数据;通常用于接收json,并还原成JavaBean对象
语法:
@RequestBody(requried=是否必须有请求体)
要求:POST方式提交;因为GET方式提交,没有请求体
使用前提条件
pom.xml中添加jackson的依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
springmvc.xml中,配置处理静态资源,并开启mvc的注解驱动
<!-- 开启mvc注解驱动 -->
<mvc:annotation-driven/>
<!--处理静态资源-->
<mvc:default-servlet-handler/>
6.2:@PathVariable
【重点】RESTful编程风格
REST:Representational State Transfer,是一种编程风格,没有明确的标准。Spring提供的
@PathVariable
,是其支持RESTful风格的一个重要标志特点:
资源Resources:每个资源有独一无二的URL
表现Representation:资源呈现的形式。例如:文本可以呈现为html、json、xml等等
状态转换State Transfer:使用HTTP协议的不同请求方式,表示对资源的不同的操作
优点:结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多的网站采用
示例:
URI:
/user/1
, 请求方式:HTTP GET
, 表示获取id为1的用户URI:
/user/1
, 请求方式:HTTP DELETE
, 表示删除id为1的用户URI:
/user
, 请求方式:HTTP PUT
, 表示更新用户URI:
/user
,请求方式:HTTP POST
,表示新增用户注解说明
作用:Spring3.0提供的,用于获取请求路径中的值,需要配合
@RequestMapping
使用语法:
@PathVariable(value="占位符名称", required=是否必须)
作用位置:用在方法参数上,表示获取请求路径中占位符的值,赋值给方法参数
例如:
客户端请求:
http://localhost:8080/mvc01/delete/100
@RequestMapping("/delete/{id}")
:定义了占位符{id}
@PathVariable("id")
:要获取占位符{id}
位置的值100
使用示例:
@RequestMapping(value = "/{xxx}", method = RequestMethod.GET)
public String findUserById(@PathVariable("xxx") Integer id){
System.out.println("根据id查询用户,id值:" + id);
return "success";
}
6.3:
@RequestHeader
注解说明
语法:
@RequestHeader(value="请求头名称", required=是否必须)
作用位置:用在方法参数上,把指定请求头的值,赋值给方法参数
6.4:
@CookieValue
注解说明
语法:
@CookieValue(value="cookie名称", requried=是否必须)
作用位置:用在方法参数上,把指定名称的Cookie值,赋值给方法参数
6.5:@ModelAttribute
注解说明
注解
@ModelAttribute
的功能很强,但是大部分功能已不再适用。被
@ModelAttribute
注解标记的方法,会在当前Controller里每个方法被调用之前,先执行一次。有点类似于Junit里的@Before
7.使用原始Servlet的API
说明:
在Controller的方法中,可以使用Servlet的原始API,只要在方法中直接定义参数即可,SpringMVC框架会提供对应的实参
SpringMVC支持的Servlet原始API有:
HttpServletRequest :代表HTTP请求
HttpServletResponse :代表HTTP响应
HttpSession :代表会话
java.security.Principal :Java的授权认证接口,当前已认证的用户
Locale :当前请求的语言环境
InputStream :请求体的字节流对象
OutputStream :响应体的字节流对象
Reader :请求体的字符流对象
Writer:响应体的字符流对象
示例:
@RequestMapping("/servletApi")
public String servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session){
request.setAttribute();
session.setAttribute();
ServletContext context = request.getServletContext();
String host = request.getHeader("Host");
System.out.println(host);
return "";
}