一、Ant路径风格
*
* URL地址可以写模糊的通配符:
* ?:能替代任意一个字符
* *:能替代任意多个字符,和一层路径
* **:能替代多层路径
*
*/
@Controller
public class RequestMappingTest {
@RequestMapping("/antTest01")
public String antTest01(){
System.out.println("antTest01...");
return "success";
}
/**
* ?匹配一个字符,0个多个都不行;
* 模糊和精确多个匹配情况下,精确优先
*
* @return
*/
@RequestMapping("/antTest0?")
public String antTest02(){
System.out.println("antTest02...");
return "success";
}
/**
* *匹配任意多个字符
* @return
*/
@RequestMapping("/antTest0*")
public String antTest03(){
System.out.println("antTest03...");
return "success";
}
/**
* *:匹配一层路径
* @return
*/
@RequestMapping("/a/*/antTest01")
public String antTest04(){
System.out.println("antTest04...");
return "success";
}
/**
* 匹配多层路径
* @return
*/
@RequestMapping("/a/**/antTest01")
public String antTest05(){
System.out.println("antTest05...");
return "success";
}
//路径上可以有占位符: 占位符 语法就是可以在任意路径的地方写一个{变量名}
// /user/admin /user/leifengyang
// 路径上的占位符只能占一层路径
@RequestMapping("/user/{id}")
public String pathVariableTest(@PathVariable("id")String id){
System.out.println("路径上的占位符的值"+id);
return "success";
}
}
二、Restful风格
什么是REST
① REST:即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用
- 资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。
可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。
获取这个资源,访问它的URI就可以,因此 URI 即为每一个资源的独一无二的识别符。 - 表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层(Representation)。比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进制格式。
- 状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。
而这种转化是建立在表现层之上的,所以就是 “表现层状态转化”。 - 具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
② URL风格
示例:
/order/1 HTTP GET :得到 id = 1 的 order
/order/1 HTTP DELETE:删除 id = 1的 order
/order/1 HTTP PUT:更新id = 1的 order
/order HTTP POST:新增 order
③ HiddenHttpMethodFilter
浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,
Spring3.0 添加了一个过滤器,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。
代码实现:
① 配置HiddenHttpMethodFilter过滤器
<!-- 支持REST风格的过滤器:可以将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>
②编写Controller层
@Controller
public class BookController {
/**
* 图书查询
* @param id
* @return
*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.GET)
public String getBook(@PathVariable("bid")Integer id){
System.out.println("查询到了"+id+"号图书");
return "success";
}
/**
* 图书删除
* @param id
* @return
*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.DELETE)
public String deleteBook(@PathVariable("bid")Integer id){
System.out.println("删除到了"+id+"号图书");
return "success";
}
/**
* 图书添加
* @param id
* @return
*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.POST)
public String addBook(@PathVariable("bid")Integer id){
System.out.println("添加了"+id+"号图书");
return "success";
}
/**
* 图书修改
* @return
*/
@RequestMapping(value = "/book/{bid}",method = RequestMethod.PUT)
public String updateBook(@PathVariable("bid")Integer id){
System.out.println("更新了"+id+"号图书");
return "success";
}
}
③ 编写jsp页面:
<!-- 发起图书的增删改查请求;使用Rest风格的URL地址;
请求url 请求方式 表示含义
/book/1 GET: 查询1号图书
/book/1 DELETE: 删除1号图书
/book/1 PUT: 更新1号图书
/book POST: 添加1号图书
从页面发起PUT、DELETE形式的请求?Spring提供了对Rest风格的支持
1)、SpringMVC中有一个Filter;他可以把普通的请求转化为规定形式的请求;配置这个filter;
<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)、如何发其他形式请求?
按照以下要求;
1、创建一个post类型的表单
2、表单项中携带一个_method的参数,
3、这个_method的值就是DELETE、PUT
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="book/1">查询图书</a><br/>
<form action="book/1" method="post">
<input type="submit" value="添加1号图书"/>
</form><br/>
<form action="book/1" method="post">
<input name="_method" value="delete">
<input type="submit" value="删除1号图书"/>
</form><br/>
<form action="book/1" method="post">
<input name="_method" value="put">
<input type="submit" value="更新1号图书"/>
</form><br/>
</body>
</html>
三、HiddenHttpMethodFilter过滤器源码分析
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//获取表单上_method带来的值(delete\put)
String paramValue = request.getParameter(this.methodParam);
//判断如过表单是一个post而且_method有值
if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {
//转为PUT、DELETE
String method = paramValue.toUpperCase(Locale.ENGLISH);
//重写了request.getMethod();前端控制器会根据getMethod方法获取method,告知@RequestMapping该方法是GET,POST,DELETE ,还是PUT
//实现了HttpServletRequest,并且HttpServletRequest该类重写了getMethod方法
HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method);
//wrapper.getMethod()===PUT;
filterChain.doFilter(wrapper, response);//重新进行请求的转发!
}
else {
//直接放行
filterChain.doFilter(request, response);
}
}
本文介绍了RESTful风格的概念,包括资源、表现层和状态转化的定义,以及GET、POST、PUT、DELETE等HTTP方法在RESTful中的作用。接着,通过URL风格示例展示了RESTful如何操作资源。最后,讨论了SpringMVC中HiddenHttpMethodFilter过滤器的作用,它是如何使Spring支持DELETE、PUT等HTTP方法的,并概述了其配置和使用。
595

被折叠的 条评论
为什么被折叠?



