亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring MVC如何實現Restful風格

發布時間:2021-10-21 10:59:43 來源:億速云 閱讀:183 作者:小新 欄目:開發技術

小編給大家分享一下Spring MVC如何實現Restful風格,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    先拋論點:我覺得Restful風格僅僅是一種風格,并不是什么高深的技術架構,而是一種編程的規范。在我們進行應用程序開發的過程中,我們可以發現,80%以上的操作都是增刪查改式的操作,restful就是定義了CRUD的開發規范。下面把restful風格的url和傳統風格的url進行一個對比。

業務操作
傳統風格URL
傳統請求方式
restful風格URL
restful請求方式
新增
/add
GET/POST
/order
POST
修改
/update?id=1
GET/POST/order/1
PUT
查詢
/get?id=1GET/POST/order/1GET
刪除
/delete?id=1GET/POST/order/1DELETE

    自從我們學習jsp、servlet以來,所用的請求方式一般就是post或者get,瀏覽器目前也只是支持post和get請求方式,那要怎么實現put和delete請求呢?不要著急,spring mvc提供了一個filter用來實現put和delete請求。下面我們來看一下這個filter的代碼,簡單說一下對注視的理解,水平有限,不一定準確:瀏覽器目前只支持post和get請求,這個過濾器呢可以實現把post請求轉為put請求或者delete請求,它是怎么實現的呢?利用一個普通的post請求,再加上一個隱藏域,隱藏域的名稱為_method,當它發現是一個post請求的時候,而且還有_method屬性的話,它就會把該請求轉換為響應的http請求。該過濾器定義在web.xml的位置也需要注意,因為這個filter需要檢查post的參數,因此需要定義在文件上傳得filter后面,典型的有:org.springframework.web.multipart.support.MultipartFilter。

package org.springframework.web.filter;

import java.io.IOException;
import java.util.Locale;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.util.WebUtils;

/**
 * {@link javax.servlet.Filter} that converts posted method 
 * parameters into HTTP methods, retrievable via 
 * {@link HttpServletRequest#getMethod()}. Since browsers currently only
 * support GET and POST, a common technique - used by the Prototype
 * library, for instance - is to use a normal POST with an additional 
 * hidden form field ({@code _method}) to pass the "real" HTTP method along.
 * This filter reads that parameter and changes
 * the {@link HttpServletRequestWrapper#getMethod()} return value accordingly.
 *
 * <p>The name of the request parameter defaults to {@code _method}, but can be
 * adapted via the {@link #setMethodParam(String) methodParam} property.
 *
 * <p><b>NOTE: This filter needs to run after multipart processing in case of 
 * a multipart POST request, due to its inherent need for checking a POST 
 * body parameter.</b>
 * So typically, put a Spring 
 * {@link org.springframework.web.multipart.support.MultipartFilter}
 * <i>before</i> this HiddenHttpMethodFilter in your {@code web.xml} filter chain.
 *
 * @author Arjen Poutsma
 * @author Juergen Hoeller
 * @since 3.0
 */
public class HiddenHttpMethodFilter extends OncePerRequestFilter {

    /** Default method parameter: {@code _method} */
    public static final String DEFAULT_METHOD_PARAM = "_method";

    private String methodParam = DEFAULT_METHOD_PARAM;


    /**
     * Set the parameter name to look for HTTP methods.
     * @see #DEFAULT_METHOD_PARAM
     */
    public void setMethodParam(String methodParam) {
        Assert.hasText(methodParam, "'methodParam' must not be empty");
        this.methodParam = methodParam;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, 
        HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        HttpServletRequest requestToUse = request;

        if ("POST".equals(request.getMethod()) && 
            request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
            String paramValue = request.getParameter(this.methodParam);
            if (StringUtils.hasLength(paramValue)) {
                requestToUse = new HttpMethodRequestWrapper(request, paramValue);
            }
        }

        filterChain.doFilter(requestToUse, response);
    }


    /**
     * Simple {@link HttpServletRequest} wrapper that returns the supplied method for
     * {@link HttpServletRequest#getMethod()}.
     */
    private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {

        private final String method;

        public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
            super(request);
            this.method = method.toUpperCase(Locale.ENGLISH);
        }

        @Override
        public String getMethod() {
            return this.method;
        }
    }

}

    有了上面的filter,結合前面的RequestMapping的method屬性,就可以實現put或者delete請求了,下面來看兩個具體的例子

1、以put請求為例

第一步需要在web.xml中配置過濾器

<!-- HiddenHttpMethodFilter可以把post請求轉為delete或者put請求,
需要借助于_method屬性,  -->
<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>

第二步:form表單的定義,它實際上就是一個post,定義了一個隱藏域

<form action="/restful/testPut/1" method="post">
    <!-- POST請求轉為PUT請求的關鍵 -->
    <input type="hidden" name="_method" value="PUT"/>
    <p>put請求</p>
    <input type="submit" value="submit" />
</form>

第三步:后臺方法的定義,定義method為put,使用注解@PathVariable獲取url中的參數

@RequestMapping(value = "/testPut/{id}", method = RequestMethod.PUT)
public String testPut(@PathVariable("id") int id) {
    System.out.println("test put function" + id);
    return "greeting";
}

這就是實現了一個restful風格的put請求。

以上是“Spring MVC如何實現Restful風格”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兴安盟| 武安市| 皮山县| 临泽县| 巩义市| 金塔县| 湄潭县| 双辽市| 慈溪市| 尚志市| 阜平县| 视频| 武邑县| 平安县| 邻水| 长岭县| 麻阳| 莱芜市| 佛学| 五河县| 化州市| 西城区| 武乡县| 鹤岗市| 济宁市| 突泉县| 瓦房店市| 固原市| 锡林浩特市| 阳东县| 长宁区| 南阳市| 南昌市| 行唐县| 武安市| 平昌县| 资溪县| 巴彦淖尔市| 乡宁县| 永兴县| 白银市|