restful风格
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
RESTful(即Representational State Transfer的缩写)其实是一个开发理念,是对http的很好的诠释。Representational State Transfer的含义就是“表现层的状态转化”。
使用RESTful这种架构理念就需要对http请求进行一系列的规范:
1、对url规范,写成RESTful的格式的url
非REST的url:http://..../queryGoods?id=001&itemType=服装
REST风格的url:http://..../queryitem/001/服装
特点:url简洁,将参数通过url传到服务端
2、http的方法规范
不管是删除、添加、更新、使用url是一致的,如果进行删除,需要设置http的方法为delete,同理添加
后台controller方法:判断http方法,如果是delete执行删除,如果是post执行添加。
默认的只能使用get或post方法,
3、对http的contentType规范
请求时指定contentType,要json数据,设置成json格式的type。
-
在web.xml中配置过滤器,用来支持get,post以外的请求
<filter> <filter-name>methodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> <init-param> <param-name>methodParam</param-name> <param-value>mym</param-value> <!-- 不配置就默认为 _method --> </init-param> </filter> <filter-mapping> <filter-name>methodFilter</filter-name> <url-pattern>/*</url-pattern> <!-- <servlet-name>mcpMvc</servlet-name> --> </filter-mapping>
-
index.jsp页面
<h3> <a href="${pageContext.request.contextPath}/beautyOpreation/39.html">RestFul-GET</a> </h3> <form method="post" action="${pageContext.request.contextPath}/beautyOpreation"> <input type="text" name="bname" value="李思思"/><br/> <input type="text" name="bage" value="30"/><br/> <input type="text" name="cat.cname" value="tomcat"/><br/> <input type="text" name="cat.cage" value="3"/><br/> <input type="submit" value="RestFul-POST"/> </form> <form method="post" action="${pageContext.request.contextPath}/beautyOpreation/988/yellow"> <input type="text" name="bname" value="李思思put"/><br/> <input type="text" name="bage" value="30"/><br/> <input type="text" name="cat.cname" value="tomcatput"/><br/> <input type="text" name="cat.cage" value="3"/><br/> <input type="hidden" name="mym" value="PUT"/> <input type="submit" value="RestFul-PUT"/> </form> <form method="post" action="${pageContext.request.contextPath}/beautyOpreation"> <input type="text" name="bname" value="李思思DELETE"/><br/> <input type="text" name="bage" value="30"/><br/> <input type="text" name="cat.cname" value="tomcatDELETE"/><br/> <input type="text" name="cat.cage" value="3"/><br/> <input type="hidden" name="mym" value="DELETE"/> <input type="submit" value="RestFul-DELETE"/> </form> <hr style="border: 1px dashed gold;"/>
注: input type="hidden" name="_method" value="put" 会被配置的过滤器处理为PUT请求
-
Handler方法
/** * Resful风格里: * 1: 无论是 增删改查 都可能访问同一个url , 通过 提交方式来区分 * get: 查 post: 增 put:改 delete:删 * * put 和 delete 请求 需要 使用 HiddenHttpMethodFilter 来进行 底层过滤修改 * 在post模式下 给表单添加一个 隐藏域 添加一个 名为 _method 的 请求参数 值写为put / delete _method 可以在 过滤器配置时修改. * * 2: 把 请求路径里的部分 获取为请求参数 */ @RestController public class RestFulController { @GetMapping("/beautyOpreation/{bid}.html") public String queryBeauty(@PathVariable(name="bid") Integer bid){ return "server - get -"+bid; } @PostMapping("/beautyOpreation") public String addBeauty(){ return "server - post"; } @PutMapping("/beautyOpreation/{bid}/{skincolor}") public Beauty updateBeauty(@PathVariable(name="bid") Integer bid, @PathVariable(name="skincolor") String skin, Beauty beauty){ System.out.println(bid); System.out.println(skin); return beauty; } @DeleteMapping("/beautyOpreation") public String deteleBeauty(){ return "server - delelte"; } }
路径变量: @pathvariable 将restful风格请求路径里的参数绑定到 handler方法入参中 . /beauty/{id} 路径变量可以直接使用.
矩阵变量: @MatrixVariable 可以将restful风格请求路径里的矩阵参数 绑定到 handler方法入参中. 矩阵变量需要开启配置
介绍:
根据 URI 规范 RFC 3986 中 URL 的定义,路径片段中可以可以包含键值对。规范中没对对应的术语。一般 “URL 路径参数” 可以被应用,尽管更加独特的 “矩阵 URI” 也经常被使用并且相当有名。在 Spring MVC 它被成为矩阵变量
矩阵变量可以出现在任何路径片段中,每一个矩阵变量都用分号(;)隔开。比如 “/get;name=zhihao;age=18”。多个值可以用逗号隔开,比如 “age=18,20,25”,或者分开写 “age=18;age=20;age=25”。
如果你希望一个 URL 包含矩阵变量,那么请求映射模式必须用 URI 模板来表示这些矩阵变量。这样的话,不管矩阵变量顺序如何,都能够保证请求可以正确的匹配。
-
SpringMVC默认未开始 对 矩阵变量 解析和封装为handler方法入参, 需要在配置文件中开启 矩阵变量的使用 .
<mvc:annotation-driven enable-matrix-variables="true"/>
-
页面中设计表单
<form action="${pageContext.request.contextPath}/user/97;name=zhangsasn;age=1,2,3" method="post"> <input type="text" name="myparam" value="修改"/> <input type="hidden" name="mym" value="PUT"> <input type="submit" value="提交"> </form>
这里过滤器的要处理的参数名已经改为了sm 不改默认的method 也可以.
-
控制层
@PutMapping("/user/{uid}") @ResponseBody public List<Integer> testUpdate(@PathVariable Integer uid, @MatrixVariable String name, @MatrixVariable List<Integer> age){ System.out.println(uid); System.out.println(name); System.out.println(age); return age; }
解决 字符编码过滤器 和 hiddenMethod过滤器 restful乱码:
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value> text/plain;charset=utf-8 </value> <value> text/html;charset=utf-8 </value> <value> application/json;charset=utf-8 </value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>