springMVC笔记系列

来源:互联网 发布:淘宝装修软件破解版 编辑:程序博客网 时间:2024/06/06 01:52

什么是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过滤器

  1. <!DOCTYPE web-app PUBLIC
  2. “ - // Sun Microsystems,Inc.//DTD Web应用程序2.3 // EN”
  3. “http://java.sun.com/dtd/web-app_2_3.dtd”>
  4. <web-app>
  5. <display-name>原型创建的Web应用程序</ display-name>
  6. <! - 配置org.springframework.web.filter.HiddenHttpMethodFilter,可以吧POST请求转换为PUT或DELETE请求 - >
  7. <过滤器>
  8. <filter-name> HiddenHttpMethodFilter </ filter-name>
  9. <filter-class> org.springframework.web.filter.HiddenHttpMethodFilter </ filter-class>
  10. </ filter>
  11. <filter-mapping>
  12. <filter-name> HiddenHttpMethodFilter </ filter-name>
  13. <url-pattern> / * </ url-pattern>
  14. </ filter-mapping>
  15. <! - 配置DispatcherServlet - >
  16. <! - 下面的代码为STS自动生成,如果是一般的eclipse需要安装springIDE插件 - >
  17. <! - 此Spring Web应用程序的前端控制器,负责处理所有应用程序请求 - >
  18. <servlet>
  19. <servlet-name> springDispatcherServlet </ servlet-name>
  20. <servlet-class> org.springframework.web.servlet.DispatcherServlet </ servlet-class>
  21. <! - 配置DispatcherServlet的一个初始化参数:配置springmvc配置位置和名称 - >
  22. <init-param>
  23. <param-name> contextConfigLocation </ param-name>
  24. <param-value> classpath:springmvc.xml </ param-value> <! - classpath下的springmvc.xml - >
  25. </ init-param>
  26. <! - load-on-startup是指这个servlet是在当前web应用被加载的时候就被创建,而不是第一次被请求的时候被创建 - >
  27. <load-on-startup> 1 </ load-on-startup>
  28. </ servlet>
  29. <! - 将所有请求映射到DispatcherServlet进行处理
  30. /代表可以应答所有请求,由springDispatcherServlet处理 - >
  31. <servlet-mapping>
  32. <servlet-name> springDispatcherServlet </ servlet-name>
  33. <url-pattern> / </ url-pattern>
  34. </ servlet-mapping>
  35. </ web-app>
复制代码

springMVC.xml与之前的文章中的例子相比,没有变化,这里为了读者方便也一起给出,关于springMVC的项目结构和配置请参照我之前的文章。

  1. <?xml version =“1.0”encoding =“UTF-8”?>
  2. <beans xmlns =“http://www.springframework.org/schema/beans”
  3. xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”
  4. xmlns:context =“http://www.springframework.org/schema/context”
  5. xmlns:mvc =“http://www.springframework.org/schema/mvc”
  6. xsi:schemaLocation =“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
  8. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd“>
  9. <! - 配置自动扫描的包 - >
  10. <context:component-scan base-package =“com.happyBKs.springmvc.handlers”> </ context:component-scan>
  11. <! - 配置视图解析器:如何把处理方法的返回值解析为实际的物理视图 - >
  12. <bean class =“org.springframework.web.servlet.view.InternalResourceViewResolver”>
  13. <property name =“prefix”value =“/ views /”> </ property>
  14. <property name =“suffix”value =“。jsp”> </ property>
  15. </ bean>
  16. </ beans>
复制代码

接下来写控制器类及其方法,来负责接收和处理请求:RestTestHandler类

  1. package com.happyBKs.springmvc.handlers;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.PathVariable;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. @RequestMapping(“/ rest”)
  7. @Controller
  8. 公共课RestTestHandler {
  9. / *
  10. *休息风格的Url原先利用请求参数的风格
  11. *以CRUD为例
  12. *新增:/ order POST
  13. *修改:/ order / 1放更新?id = 1
  14. *获取:/ order / 1 GET get?id = 1
  15. *删除:/ order / 1 DELETE delete?id = 1
  16. *
  17. *如何发送PUT请求和DELETE请求?
  18. * 1.需要配置HiddenHttpMethodFilter
  19. * 2.需要发送POST请求
  20. * 3.需要在发送POST请求时携带一个名称=“_方法”的隐藏域,值为DELETE或PUT
  21. *
  22. *在SpringMVC的目标方法中如何得到id呢?
  23. *使用@PathVariable注解
  24. * /
  25. @RequestMapping(value =“/ methodstest / {id}”,method = RequestMethod.GET)
  26. public String restGet(@PathVariable int id)//当@PathVariable没有标明{id},
  27. {
  28. System.out.println(“get”+ id);
  29. System.out.println(“querry operations ...”);
  30. 返回“querry”;
  31. }
  32. @RequestMapping(value =“/ methodstest”,method = RequestMethod.POST)
  33. public String restPost()
  34. {
  35. System.out.println(“post”);
  36. System.out.println(“post operations ...”);
  37. 返回“帖子”;
  38. }
  39. @RequestMapping(value =“/ methodstest / {id}”,method = RequestMethod.PUT)
  40. public String restPut(@PathVariable int id)
  41. {
  42. System.out.println(“put”+ id);
  43. System.out.println(“put operations ...”);
  44. 返回“put”;
  45. }
  46. @RequestMapping(value =“/ methodstest / {id}”,method = RequestMethod.DELETE)
  47. public String restDelete(@PathVariable int id)
  48. {
  49. System.out.println(“delete”+ id);
  50. System.out.println(“delete operations ...”);
  51. 返回“删除”;
  52. }
  53. }
复制代码

请求页面编写如下:

  1. <%@ page language =“java”contentType =“text / html; charset = ISO-8859-1”
  2. pageEncoding =“ISO-8859-1”%>
  3. <!DOCTYPE html PUBLIC“ - // W3C // DTD HTML 4.01 Transitional // EN”“http://www.w3.org/TR/html4/loose.dtd”>
  4. <html>
  5. <head>
  6. <meta http-equiv =“Content-Type”content =“text / html; charset = ISO-8859-1”>
  7. <title>在这里插入标题</ title>
  8. </ head>
  9. <body>
  10. <a href="rest/methodstest/1"> GET请求</a>
  11. <form action =“rest / methodstest”method =“post”>
  12. <input type =“submit”value =“POST Request”/>
  13. </ form>
  14. <form action =“rest / methodstest / 1”method =“post”>
  15. <input type =“hidden”name =“_ method”value =“PUT”>
  16. <input type =“submit”value =“PUT Request”/>
  17. </ form>
  18. <form action =“rest / methodstest / 1”method =“post”>
  19. <input type =“hidden”name =“_ method”value =“DELETE”>
  20. <input type =“submit”value =“DELETE Request”/>
  21. </ form>
  22. </ body>
  23. </ html>
复制代码

注意到了吗?HiddenHttpMethodFilter帮助我们实现对请求和删除请求的模拟。它会带走隐藏域_method的POST请求转换为put请求和删除请求提交给服务器。

过程:

点击四个链接和表单按钮:

控制台输入为:

  1. 得到1
  2. 轮流操作...
  3. 帖子
  4. 后操作...
  5. 放1
  6. 把操作...
  7. 删除1
  8. 删除操作...
复制代码

总结:

休息风格的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,依然不能解决问题。

  1. <servlet>
  2. <servlet-name> default </ servlet-name>
  3. <servlet-class> org.apache.catalina.servlets.DefaultServlet </ servlet-class>
  4. <init-param>
  5. <param-name> debug </ param-name>
  6. <param-value> 0 </ param-value>
  7. </ init-param>
  8. <init-param>
  9. <param-name>只读</ param-name>
  10. <param-value> false </ param-value>
  11. </ init-param>
  12. <init-param>
  13. <param-name>列表</ param-name>
  14. <param-value> false </ param-value>
  15. </ init-param>
  16. <load-on-startup> 1 </ load-on-startup>
  17. </ servlet>
复制代码

点击帖子请求和删除请求的结果是:


0 0
原创粉丝点击