Spring MVC对Restful风格请求支持
- 什么是RestfuI
Restful是一种web软件架构风格,它不是标准也不是协议,它倡导的是一个资源定位及资源操作的风格。 - Restful的优点
结构清晰、符合标准、易于理解、扩展方便。 - RestfuI的示例
rest是一个url请求的风格,基于这种风格来请求的url,在没有rest风格的情况,原有的url设计如下:
http://localhost:8080/user/queryUserByld.action?id=3
有了rest风格之后,url设计如下:
http://localhost:8080/user/3 //代表的是id为3的那个用户记录(资源)
在rest中互联网内的所有东西都是资源,既然是资源就会有一个唯一的URI(统一资源定位符) 标识它,代表它。
URI:统一资源定位符,每个资源独一无二的识别符,通过URI地址去定位互联网中的资源(抽象的概念,比如图片、视频、app服务等)。
RestfuI风格URL:互联网所有的事物都是资源,要求URL中只有表示资源的名称,没有动词。
RestfuI风格资源操作:锁定资源之后如何操作它呢?常规操作就是增删改查,根据请求方式不同,代表要做不同的操作。即使用HTTP请求中的method方法PUT(更新)、DELETE(删除)、POST(新建)、GET(查询)来操作资源。
RestfuI风格资源表述:可以根据需求对URL定位的资源返回不同的表述(也就是返回数据类型,比如XML, JSON等数据格式)。
Spring MVC支持RestfuI风格请求,具体就是使用**@PathVariable**注解获取RestfuI风格的请求URL中的路径变量。
示例代码
//前端JSP页面
<div>
<h2>SpringMVC对Restful风格url的支持</h2>
<fieldset>
<p>测试用例:SpringMVC对Restful风格url的支持</p>
<!-- get请求-->
<a href="/demo/handle/15">rest_get测试</a>
<!-- post请求-->
<form method="post" action="/demo/handle">
<input type="text" name="username"/>
<input type="submit" value="提交rest_post请求"/>
</form>
<!-- put请求,使用隐藏域来标识资源的操作符-->
<form method="post" action="/demo/handle/15/lisi">
<input type="hidden" name="_method" value="put"/>
<input type="submit" value="提交rest_put请求"/>
</form>
<!-- delete请求-->
<form method="post" action="/demo/handle/15">
<input type="hidden" name="_method" value="delete"/>
<input type="submit" value="提交rest_delete请求"/>
</form>
</fieldset>
</div>
后端Handler
@Controller
@RequestMapping("/demo")
public class DemoController {
/*
* restful get /demo/handle/15
* 和delete的url完全相同,靠的就是method = {RequestMethod.GET}来区分请求方式
*/
@RequestMapping(value = "/handle/{id}",method = {RequestMethod.GET})
//@PathVariable("id")注解用于从URI中获取参数
public ModelAndView handleGet(@PathVariable("id") Integer id) {
System.out.println(id);
}
/*
* restful post /demo/handle
*/
@RequestMapping(value = "/handle",method = {RequestMethod.POST})
public ModelAndView handlePost(String username) {
System.out.println(username);
}
/*
* restful put /demo/handle/15/lisi
* 要使用PUT必须配置请求过滤器来识别post请求中的_method属性
*/
@RequestMapping(value = "/handle/{id}/{name}",method = {RequestMethod.PUT})
//有几个参数就用几个@PathVariable注解标注即可
public ModelAndView handlePut(@PathVariable("id") Integer id,@PathVariable("name") String username) {
System.out.println("id" + id ",name"+name);
}
/*
* restful delete /demo/handle/15
* 要使用DELETE必须配置请求过滤器来识别post请求中的_method属性
*/
@RequestMapping(value = "/handle/{id}",method = {RequestMethod.DELETE})
public ModelAndView handleDelete(@PathVariable("id") Integer id) {
System.out.println(id);
}
}
web.xml中配置请求方式过滤器(将特定的post请求转换为put和delete请求)
<!--配置springmvc请求方式转换过滤器,会检查请求参数中是否有_method参数,如果有就按照指定的请求方式进行转换-->
<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>