zoukankan      html  css  js  c++  java
  • RequestMapping_HiddenHttpMethodFilter 过滤器

    【REST】

    1.REST:即Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以得到越来越多网站的采用。

    2.资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本,一张图片,一首歌曲,一种服务,总之就是一个具体的存在。可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI 即为每一个资源的独一无二的标识符

    3.表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层。比如:文本可以用TXT格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式。

    4.状态转化(State Transfer):每发出一个请求,就代表了客户端和服务器的一次交互过程。HTTP协议,是一个无状态的协议,即所有的状态都保存在服务器 端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。具体说,就是HTTP协议里面,四个表示操作方式的动词:GET,POST,PUT,DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源

    示例:

    -- /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

    5.HiddenHttpMethodFilter:浏览器form表单只支持GET和POST请求,而DELETE、PUT等method并不支持。Spring3.0添加了一个过滤器,可以将这些请求转换为标准的HTTP方法,使得支持GET、POST、PUT与DELETE的请求。

    查看源码org.springframework.web.filter.HiddenHttpMethodFilter:

    1     /** Default method parameter: {@code _method} */
    2     public static final String DEFAULT_METHOD_PARAM = "_method";
    3 
    4     private String methodParam = DEFAULT_METHOD_PARAM;
     1     @Override
     2     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
     3             throws ServletException, IOException {
     4 
     5         String paramValue = request.getParameter(this.methodParam);
     6         if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {
     7             String method = paramValue.toUpperCase(Locale.ENGLISH);
     8             HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method);
     9             filterChain.doFilter(wrapper, response);
    10         }
    11         else {
    12             filterChain.doFilter(request, response);
    13         }
    14     }

    实践:

    web.xml:

     1    <!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter:可以把POST请求转为 DELETE 或 POST请求 -->
     2    <filter>
     3        <filter-name>HiddenHttpMethodFilter</filter-name>
     4        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
     5    </filter>
     6    
     7    <filter-mapping>
     8        <filter-name>HiddenHttpMethodFilter</filter-name>
     9        <url-pattern>/*</url-pattern>
    10    </filter-mapping>

    SpringMVCTest.java:

     1 @RequestMapping("/springmvc")
     2 @Controller
     3 public class SpringMVCTest {
     4     private static final String SUCCESS = "success";
     5 
     6     @RequestMapping(value="/testRest/{id}",method=RequestMethod.PUT)
     7     public String testRestPut(@PathVariable Integer id){
     8         System.out.println("testRest PUT :" +  id);
     9         return SUCCESS;
    10     }
    11     
    12     @RequestMapping(value="/testRest/{id}",method=RequestMethod.DELETE)
    13     public String testRestDelete(@PathVariable Integer id){
    14         System.out.println("testRest DELETE :" +  id);
    15         return SUCCESS;
    16     }
    17     
    18     @RequestMapping(value="/testRest",method=RequestMethod.POST)
    19     public String testRest(){
    20         System.out.println("testRest POST");
    21         return SUCCESS;
    22     }
    23     
    24     @RequestMapping(value="/testRest/{id}",method=RequestMethod.GET)
    25     public String testRest(@PathVariable Integer id){
    26         System.out.println("testRest GET :" +  id);
    27         return SUCCESS;
    28     }
    29     

    index.jsp:

     1 <body>
     2 
     3     <form action="springmvc/testRest/1" method="post">
     4       <input type="hidden" name="_method" value="PUT">
     5       <input type="submit" value="TestRest PUT ">
     6     </form>
     7 
     8     <br/><br/> 
     9 
    10     <form action="springmvc/testRest/1" method="post">
    11       <input type="hidden" name="_method" value="DELETE">
    12       <input type="submit" value="TestRest DELETE ">
    13     </form>
    14 
    15     <br/><br/> 
    16 
    17     <form action="springmvc/testRest" method="post">
    18       <input type="submit" value="TestRest Post ">
    19     </form>
    20 
    21    <br/><br/>   
    22    <a href="springmvc/testRest/1">Test Rest Get</a>
    23    
    24 </body>

    运行结果:

    小结:

    REST风格的URL:

    以CRUD为例:

    新增:/order POST

    修改:/order/1 PUT      update?id=1

    获取:/order/1 GET      get?id=1

    删除:/order/1 DELETE delete?id=1

    如何发送PUT请求和DELETE 请求呢?

    1.需要配置HiddenHttpMethodFilter

    2.需要发送POST请求

    3.需要在发送POST请求时携带一个name="_method" 的隐藏域,值为 DELETE 或 PUT。

    在Spring MVC 的目标方法中如何得到 id 呢?

    使用@PathVariable 注解

    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    flex + bison multiple parsers
    Educational Codeforces Round 95 (Rated for Div. 2)
    python学习笔记 day20 序列化模块(二)
    python学习笔记 day20 常用模块(六)
    python 学习笔记 常用模块(五)
    python学习笔记 day19 常用模块(四)
    python学习笔记 day19 常用模块(三)
    python学习笔记 day19 常用模块(二)
    python学习笔记 day19 作业讲解-使用正则表达式实现计算器
    python学习笔记 day19 常用模块
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9695597.html
Copyright © 2011-2022 走看看