REST 或 RESTful的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求。简单来说就是将服务器中的资源通过URI的方式来定位。
REST风格的URL将HTTP协议中的四种请求方式GET、POST、PUT、DELETE分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
操作 | REST风格URL及请求方式 | 传统方式URL及请求方式 |
获取 | /getBookById/1 GET请求 | /getBookById?id=1 GET请求 |
添加 | /addBook POST请求 | /addBook POST请求 |
更新 | /updateBook PUT请求 | /updateBook POST请求 |
删除 | /deleteBookById/1 DELETE请求 | /deleteBookById/?id=1 GET请求 |
那么如何发送PUT和DELETE请求的?
浏览器 form 表单只支持 GET 与 POST 请求,而PUT、DELETE 等请求方式并不支持,Spring3.0 添加了一个过滤器HiddenHttpMethodFilter,可以将POST请求转换为PUT或DELETE请求。
转换PUT和DELETE请求的步骤
需要在
1、web.xml中配置过滤器HiddenHttpMethodFilter
<!--配置HiddenHttpMethodFilte过滤器,目的是为了将POST请求转换为PUT或DELETE请求-->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、在Post请求的form表单中添加一个_method的请求函数
- _method的值为put(忽略大小写)则转换为PUT请求
- _method的值为delete(忽略大小写)则转换为DELETE请求
<form action="${pageContext.request.contextPath}/testPut" method="post">
<input type="hidden" name="_method" value="put">
<input type="submit" value="转换PUT请求">
</form>
<form action="${pageContext.request.contextPath}/testDelete" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="转换DELETE请求">
</form>
SpringMVC处理请求数据
Spring MVC 通过分析处理方法的签名(方法名+ 参数列表),可以将HTTP请求信息绑定到处理方法的相应入参中,并根据方法的返回值类型做出相应的后续处理。
必要时可以对方法入参标注相应的注解( @PathVariable 、@RequestParam、@RequestHeader、@CookieValue 等)。
@RequestParam注解
- 在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法。如果请求参数的参数名与处理方法的形参名一致,可以不加该注解。
- @RequestParam中的属性:
- value属性:用来设置请求参数的参数名。
- required属性:用来设置该请求参数是否是必须的,默认是true。
- defaultValue属性:用来设置一个默认值,如果没有传入该请求参数将使用此值。
@RequestHeader注解
- 每次发送请求时请求头包含了若干个属性,服务器可通过@RequestHeader注解获取客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中。
- @RequestHeader中的属性
- value属性:用来设置请求头中的属性名。
- name属性:与value功能一样,是value的一个别名。
- required属性:用来设置该请求参数是否是必须的,默认是true。
- defaultValue属性:用来设置一个默认值,如果没有传入该请求参数将使用此值。
@CookieValue注解
- 通过 @CookieValue 即可将请求头中的Cookie对象的值绑定到处理方法的入参中。
- @CookieValue中的属性
- value属性:用来设置请求头Cookie对象的名字。
- name属性:与value功能一样,是value的一个别名。
- required属性:用来设置该请求参数是否是必须的,默认是true。
- defaultValue属性:用来设置一个默认值,如果没有传入该请求参数将使用此值。
使用POJO作为入参
- Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。而且支持级联属性赋值。
- 必须要保证请求参数名与POJO的属性名保持一致。
- 操作流程:
- 创建POJO类
使用原生Servlet-API作为入参
- 不使用@RequestParam注解和入参为POJO同样可以获取请求参数,可以使用原生的Servlet API作为入参进行操作。
- SpringMVC处理器方法中接受的原生Servlet API有以下9个:
- HttpServletRequest
- HttpServletResponse
- HttpSession
- java.security.Principal
- Locale
- InputStream
- OutputStream
- Reader
- Writer