什么是REST?首先来段介绍吧。 REST:即表征状态转移(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰,符合标准,易于理解,扩展方便,所得正得到越来越多网站的采用。 资源(资源):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本,一张图片,一首歌曲,一种服务,总之就是一个具体的存在可以用一个URI (统一资源定位符)指向它,每种资源对应一个特定的URI。要电子杂志这个资源,访问它的URI就可以,因此URI每即为一个资源的独一无二的识别符。 表现层(代表):把资源具体呈现出来的形式,叫做它的表现层。(代表)比如,文本可以用TXT格式表现,也可以用HTML格式,XML格式,JSON格式表现,甚至可以采用二进制格式。 状态转化(状态传输):每发出一个请求,就代表了客户端和服务器的一,次交互过程HTTP协议,是一个无状态协议,即所有的状态都保存在服务器,端因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“ 状态转化“(State Transfer),而这种转化是建立在表现层之上的,所以就是” 表现层状态转化“。具体说,就是HTTP协议里面,四个表示操作方式的动词:GET,POST, PUT,DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。(本文出自:http://my.oschina.net/ happyBKs / blog / 416994) 示例: - / order / 1 HTTP GET:得到id = 1的顺序 - / order / 1 HTTP DELETE:删除id = 1的顺序 - / order / 1 HTTP PUT:更新id = 1的顺序 - /订购HTTP POST:新增订单 但是要求spring实现四个方法需要一个过滤器: HiddenHttpMethodFilter:浏览器格式表单只支持GET与POST请求,而DELETE,PUT等方法并不支持,Spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET,POST,PUT与DELETE请求。 带占位符的URL是Spring3.0新增的功能,该功能在SpringMVC向REST目标挺进发展过程中具有里程碑的意义。 通过@PathVariable可以将URL占位中符参数绑定到控制器处理方法的入参中:URL中的{} XXX占位符可以通过@PathVariable( “XXX”)绑定到操作方法的入参中。 好吧,话不多说,我们实际操练一下,在webapp目录下的原web.xml中添加HiddenHttpMethodFilter过滤器
- <!DOCTYPE web-app PUBLIC
- “ - // Sun Microsystems,Inc.//DTD Web应用程序2.3 // EN”
- “http://java.sun.com/dtd/web-app_2_3.dtd”>
- <web-app>
- <display-name>原型创建的Web应用程序</ display-name>
- <! - 配置org.springframework.web.filter.HiddenHttpMethodFilter,可以吧POST请求转换为PUT或DELETE请求 - >
- <过滤器>
- <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>
- <! - 配置DispatcherServlet - >
- <! - 下面的代码为STS自动生成,如果是一般的eclipse需要安装springIDE插件 - >
- <! - 此Spring Web应用程序的前端控制器,负责处理所有应用程序请求 - >
- <servlet>
- <servlet-name> springDispatcherServlet </ servlet-name>
- <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-class>
- <! - 配置DispatcherServlet的一个初始化参数:配置springmvc配置位置和名称 - >
- <init-param>
- <param-name> contextConfigLocation </ param-name>
- <param-value> classpath:springmvc.xml </ param-value> <! - classpath下的springmvc.xml - >
- </ init-param>
- <! - load-on-startup是指这个servlet是在当前web应用被加载的时候就被创建,而不是第一次被请求的时候被创建 - >
- <load-on-startup> 1 </ load-on-startup>
- </ servlet>
- <! - 将所有请求映射到DispatcherServlet进行处理
- /代表可以应答所有请求,由springDispatcherServlet处理 - >
- <servlet-mapping>
- <servlet-name> springDispatcherServlet </ servlet-name>
- <url-pattern> / </ url-pattern>
- </ servlet-mapping>
- </ web-app>
复制代码 springMVC.xml与之前的文章中的例子相比,没有变化,这里为了读者方便也一起给出,关于springMVC的项目结构和配置请参照我之前的文章。
- <?xml version =“1.0”encoding =“UTF-8”?>
- <beans xmlns =“http://www.springframework.org/schema/beans”
- xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”
- xmlns:context =“http://www.springframework.org/schema/context”
- xmlns:mvc =“http://www.springframework.org/schema/mvc”
- xsi:schemaLocation =“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
- http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd“>
-
- <! - 配置自动扫描的包 - >
- <context:component-scan base-package =“com.happyBKs.springmvc.handlers”> </ context:component-scan>
-
- <! - 配置视图解析器:如何把处理方法的返回值解析为实际的物理视图 - >
- <bean class =“org.springframework.web.servlet.view.InternalResourceViewResolver”>
- <property name =“prefix”value =“/ views /”> </ property>
- <property name =“suffix”value =“。jsp”> </ property>
- </ bean>
- </ beans>
复制代码 接下来写控制器类及其方法,来负责接收和处理请求:RestTestHandler类
- package com.happyBKs.springmvc.handlers;
-
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
-
- @RequestMapping(“/ rest”)
- @Controller
- 公共课RestTestHandler {
-
- / *
- *休息风格的Url原先利用请求参数的风格
- *以CRUD为例
- *新增:/ order POST
- *修改:/ order / 1放更新?id = 1
- *获取:/ order / 1 GET get?id = 1
- *删除:/ order / 1 DELETE delete?id = 1
- *
- *如何发送PUT请求和DELETE请求?
- * 1.需要配置HiddenHttpMethodFilter
- * 2.需要发送POST请求
- * 3.需要在发送POST请求时携带一个名称=“_方法”的隐藏域,值为DELETE或PUT
- *
- *在SpringMVC的目标方法中如何得到id呢?
- *使用@PathVariable注解
- * /
-
-
- @RequestMapping(value =“/ methodstest / {id}”,method = RequestMethod.GET)
- public String restGet(@PathVariable int id)//当@PathVariable没有标明{id},
- {
- System.out.println(“get”+ id);
- System.out.println(“querry operations ...”);
- 返回“querry”;
- }
-
- @RequestMapping(value =“/ methodstest”,method = RequestMethod.POST)
- public String restPost()
- {
- System.out.println(“post”);
- System.out.println(“post operations ...”);
- 返回“帖子”;
- }
-
- @RequestMapping(value =“/ methodstest / {id}”,method = RequestMethod.PUT)
- public String restPut(@PathVariable int id)
- {
- System.out.println(“put”+ id);
- System.out.println(“put operations ...”);
- 返回“put”;
- }
-
- @RequestMapping(value =“/ methodstest / {id}”,method = RequestMethod.DELETE)
- public String restDelete(@PathVariable int id)
- {
- System.out.println(“delete”+ id);
- System.out.println(“delete operations ...”);
- 返回“删除”;
- }
- }
复制代码 请求页面编写如下:
- <%@ page language =“java”contentType =“text / html; charset = ISO-8859-1”
- pageEncoding =“ISO-8859-1”%>
- <!DOCTYPE html PUBLIC“ - // W3C // DTD HTML 4.01 Transitional // EN”“http://www.w3.org/TR/html4/loose.dtd”>
- <html>
- <head>
- <meta http-equiv =“Content-Type”content =“text / html; charset = ISO-8859-1”>
- <title>在这里插入标题</ title>
- </ head>
- <body>
- <a href="rest/methodstest/1"> GET请求</a>
-
- <form action =“rest / methodstest”method =“post”>
- <input type =“submit”value =“POST Request”/>
- </ form>
-
- <form action =“rest / methodstest / 1”method =“post”>
- <input type =“hidden”name =“_ method”value =“PUT”>
- <input type =“submit”value =“PUT Request”/>
- </ form>
-
- <form action =“rest / methodstest / 1”method =“post”>
- <input type =“hidden”name =“_ method”value =“DELETE”>
- <input type =“submit”value =“DELETE Request”/>
- </ form>
- </ body>
- </ html>
注意到了吗?HiddenHttpMethodFilter帮助我们实现对请求和删除请求的模拟。它会带走隐藏域_method的POST请求转换为put请求和删除请求提交给服务器。 过程: ![](http://img.it-home.org/data/attachment/forum/2015pic/205640_IKdQ_1156339.png) 点击四个链接和表单按钮: ![](http://img.it-home.org/data/attachment/forum/2015pic/205825_vAzQ_1156339.png) 控制台输入为:
- 得到1
- 轮流操作...
- 帖子
- 后操作...
- 放1
- 把操作...
- 删除1
- 删除操作...
复制代码 总结: 休息风格的Url原先利用请求参数的风格 *以CRUD为例 *新增:/ order POST *修改:/ order / 1放 update?id = 1 *获取:/ order / 1 GET get?id = 1 *删除:/ order / 1 DELETE删除?id = 1 *如何发送PUT请求和DELETE请求? 需要配置HiddenHttpMethodFilter 需要发送POST请求 3.需要在发送POST请求时携带一个名称=“_方法”的隐藏域,值为DELETE或PUT *在SpringMVC的目标方法中如何得到id呢? 使用@PathVariable注解 ------------------------------ 注意:我用的是Tomcat7服务器.tomcat8似乎不支持PUT和DELETE请求,即使我已经在Tomcat的conf文件夹下的web.xml加入了readonly参数并设置为false,依然不能解决问题。
- <servlet>
- <servlet-name> default </ servlet-name>
- <servlet-class> org.apache.catalina.servlets.DefaultServlet </ servlet-class>
- <init-param>
- <param-name> debug </ param-name>
- <param-value> 0 </ param-value>
- </ init-param>
- <init-param>
- <param-name>只读</ param-name>
- <param-value> false </ param-value>
- </ init-param>
-
- <init-param>
- <param-name>列表</ param-name>
- <param-value> false </ param-value>
- </ init-param>
- <load-on-startup> 1 </ load-on-startup>
- </ servlet>
点击帖子请求和删除请求的结果是: ![](http://img.it-home.org/data/attachment/forum/2015pic/205309_jUrj_1156339.png) |