最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC實(shí)現(xiàn)RESTful風(fēng)格:@PathVariable注解的使用方式

 更新時(shí)間:2021年11月30日 11:56:45   作者:pan_junbiao  
這篇文章主要介紹了SpringMVC實(shí)現(xiàn)RESTful風(fēng)格:@PathVariable注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、RESTful簡(jiǎn)介

RESTful為Representational State Transfer的縮寫(xiě),中文釋義為“表現(xiàn)層狀態(tài)轉(zhuǎn)換”。RESTful不是一種標(biāo)準(zhǔn),而是一種設(shè)計(jì)風(fēng)格。

RESTful本質(zhì)上是一種分布式系統(tǒng)的應(yīng)用層解決方案,它的主要作用是充分并正確利用HTTP協(xié)議的特性,規(guī)范資源獲取的URL路徑。

通俗地講,RESTful風(fēng)格的設(shè)計(jì)允許將參數(shù)通過(guò)URL拼接傳到服務(wù)端,目的是讓URL看起來(lái)更簡(jiǎn)潔實(shí)用。并且對(duì)于不同操作,要指定不同的HTTP方法(POST/GET/PUT/DETELE)。

可以這么說(shuō),只要是具有上述相關(guān)約束條件和原則的應(yīng)用程序或設(shè)計(jì)就可以被稱(chēng)為RESTful風(fēng)格的應(yīng)用。

2、SpringMVC實(shí)現(xiàn)RESTful風(fēng)格

SpringMVC支持實(shí)現(xiàn)RESTful風(fēng)格的請(qǐng)求。SpringMVC可以使用@RequestMapping注解的路徑設(shè)置,結(jié)合@PathVariable注解的參數(shù)指定,來(lái)實(shí)現(xiàn)RESTful風(fēng)格的請(qǐng)求。

【示例】實(shí)現(xiàn)一個(gè)在服務(wù)端出來(lái)RESTful風(fēng)格請(qǐng)求的Controller方法。

/**
 * 獲取用戶(hù)
 *
 * @author pan_junbiao
 */
@RequestMapping(value = "/getUser/{id}", method = RequestMethod.GET)
@ResponseBody
public UserInfo getUserById(@PathVariable("id") int userId)
{
    UserInfo userInfo = new UserInfo();
    //獲取用戶(hù)信息
    if (userId == 1)
    {
        userInfo.setUserId(1);
        userInfo.setUserName("pan_junbiao的博客");
        userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");
        userInfo.setRemark("您好,歡迎訪問(wèn) pan_junbiao的博客");
    }
    //返回結(jié)果
    return userInfo;
}

2.1 @PathVariable注解

在上述方法中,在@RequestMapping注解的請(qǐng)求路徑中添加了一個(gè)動(dòng)態(tài)數(shù)據(jù)“{id}”,它的作用是解析前臺(tái)的請(qǐng)求路徑,將動(dòng)態(tài)數(shù)據(jù)所在的位置解析為名為 id 的請(qǐng)求參數(shù)。

而在Controller的參數(shù)中,使用@PathVariable注解,在其中指定請(qǐng)求參數(shù)的key名稱(chēng),并映射在后面定義的形參上,這里定義userId形參來(lái)接收名為id的請(qǐng)求參數(shù)。

方法體中其余的操作就是正常的業(yè)務(wù)邏輯,最后使用@ResponseBody注解加上之前配置的類(lèi)型轉(zhuǎn)換器,返回客戶(hù)端JSON類(lèi)型的用戶(hù)信息。

總的來(lái)說(shuō),利用SpringMVC實(shí)現(xiàn)RESTful風(fēng)格主要就是在于請(qǐng)求路徑和請(qǐng)求參數(shù)的映射,以及RequestMethod的指定。

2.2 修改SpringMVC的前端控制器配置

之前在項(xiàng)目工程的web.xml配置文件中,配置了SpringMVC的前端控制器,用于集中處理請(qǐng)求,配置如下:

<!-- SpringMVC前端控制器 -->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-mvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

可以看到,前端控制器過(guò)濾的是后綴為“*.action”的請(qǐng)求路徑,所以編寫(xiě)的RESTful風(fēng)格的請(qǐng)求是不能被前端控制器過(guò)濾并解析的,所以要修改該配置,使得RESTful風(fēng)格的請(qǐng)求可以被SpringMVC的前端控制器處理:

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

造成問(wèn)題:這里修改成了過(guò)濾所有請(qǐng)求類(lèi)型的請(qǐng)求至前端控制器。這可能會(huì)帶來(lái)靜態(tài)資源訪問(wèn)的問(wèn)題,將在下面處理該問(wèn)題。

執(zhí)行結(jié)果:

從執(zhí)行結(jié)果中可以看到,成功查詢(xún)了id為1的用戶(hù)信息,這說(shuō)明RESTful風(fēng)格的請(qǐng)求服務(wù)編寫(xiě)成功。

3、靜態(tài)資源訪問(wèn)問(wèn)題

前面在web.xml中配置了符合RESTful風(fēng)格的DispatcherServlet前端控制器過(guò)濾器,實(shí)現(xiàn)了正確處理RESTful風(fēng)格請(qǐng)求的機(jī)制。但是這種過(guò)濾方式會(huì)造成靜態(tài)資源無(wú)法訪問(wèn)的問(wèn)題,例如在JavaWeb項(xiàng)目中創(chuàng)建名為img的目錄,并且在該目錄中放置一張名為myImage.jpg的圖片。

由于圖片放置在WEB-INF文件夾外(由于JavaWeb的保護(hù)機(jī)制,WEB-INF文件夾下的文件不可以直接訪問(wèn)),所以原則上是可以通過(guò)直接訪問(wèn)靜態(tài)資源的方式獲取到該圖片的,但是發(fā)現(xiàn)并沒(méi)有成獲取到圖片資源,如下圖:

這是為什么呢?原因在于在web.xml中配置的前端控制器的請(qǐng)求過(guò)濾機(jī)制,為了接收RESTful風(fēng)格的請(qǐng)求,將過(guò)濾的后綴去除了,變成過(guò)濾所有后綴的請(qǐng)求路徑,此時(shí)靜態(tài)資源會(huì)被當(dāng)作一個(gè)業(yè)務(wù)請(qǐng)求被DispatcherServlet前端控制器處理,前端控制器沒(méi)有發(fā)現(xiàn)能夠處理該請(qǐng)求的Controller控制器方法,所以對(duì)外拋出404(請(qǐng)求資源不可用)錯(cuò)誤。

如果想正常處理靜態(tài)資源,但又要保證RESTful請(qǐng)求的正常響應(yīng),可以通過(guò)下面兩種方法來(lái)解決。

3.1 解決方法一

方法一,在SpringMVC的核心配置文件中使用<mvc:resource>標(biāo)簽配置靜態(tài)資源的解析路徑,將需要加載的靜態(tài)資源的URI路徑配置在標(biāo)簽中,然后配置該URI映射的真實(shí)資源路徑。配置如下:

<!-- 靜態(tài)資源的解析,包括:js/css/img... -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/img/" mapping="/img/**"/>

當(dāng)在SpringMVC的核心配置文件中配置了靜態(tài)資源文件的解析路徑后,前端控制器就會(huì)根據(jù)請(qǐng)求URL中的具體子路徑來(lái)映射出靜態(tài)資源的真實(shí)路徑,然后為前端反饋真實(shí)的靜態(tài)資源信息。

3.2 解決方法二

方法二,在SpringMVC的核心配置文件中使用<mvc:default-servlet-handler/>配置默認(rèn)的Servlet處理器,該配置將在SpringMVC上下文中定義一個(gè)DefaultServletHttpRequestHandler,它會(huì)對(duì)進(jìn)入DispatcherServlet前端控制器的請(qǐng)求進(jìn)行篩查,如果發(fā)現(xiàn)是沒(méi)有經(jīng)過(guò)映射的請(qǐng)求,就將該請(qǐng)求交由Web應(yīng)用服務(wù)器默認(rèn)的Servlet處理,如果不是靜態(tài)資源的請(qǐng)求,才由DispatcherServlet前端控制器繼續(xù)處理。

此時(shí)就可以將請(qǐng)求中的靜態(tài)資源與其他業(yè)務(wù)請(qǐng)求分開(kāi)處理,從而正常地返回靜態(tài)資源信息。

<!-- 2.靜態(tài)資源默認(rèn)servlet配置
        (1)加入對(duì)靜態(tài)資源的處理:js/css/img...
        (2)允許使用"/"做整體映射
     -->
<mvc:default-servlet-handler/>

執(zhí)行結(jié)果:

這說(shuō)明靜態(tài)資源請(qǐng)求被單獨(dú)進(jìn)行了處理,從而保證了RESTful請(qǐng)求能夠被Controller控制器正常處理并響應(yīng),也保證了靜態(tài)資源的正常獲取。

4、綜合實(shí)例

上面的代碼為查詢(xún)類(lèi)型的請(qǐng)求代碼,而新增、修改以及刪除的請(qǐng)求與此類(lèi)似,區(qū)別就是需要指定不同的RequestMethod屬性(POST/PUT/DELETE)。實(shí)例代碼如下:

(1)創(chuàng)建用戶(hù)信息實(shí)體類(lèi)(UserInfo.java)

package com.pjb.ssm.entity; 
/**
 * 用戶(hù)信息實(shí)體類(lèi)
 *
 * @author pan_junbiao
 **/
public class UserInfo
{
    private int userId; //用戶(hù)ID
    private String userName; //用戶(hù)姓名
    private String blogUrl; //博客地址
    private String remark; //備注
 
    //省略getter與setter方法...
}

(2)創(chuàng)建用戶(hù)信息控制器(UserController.java),實(shí)現(xiàn)RESTful風(fēng)格的請(qǐng)求

package com.pjb.ssm.controller; 
import com.pjb.ssm.entity.UserInfo;
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;
import org.springframework.web.bind.annotation.ResponseBody;
 
/**
 * 用戶(hù)信息控制器
 *
 * @author pan_junbiao
 **/
@Controller
@RequestMapping("user")
public class UserController
{
    /**
     * 獲取用戶(hù)
     *
     * @author pan_junbiao
     */
    @RequestMapping(value = "/getUser/{id}", method = RequestMethod.GET)
    @ResponseBody
    public UserInfo getUserById(@PathVariable("id") int userId)
    {
        UserInfo userInfo = new UserInfo();
        //獲取用戶(hù)信息
        if (userId == 1)
        {
            userInfo.setUserId(1);
            userInfo.setUserName("pan_junbiao的博客");
            userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");
            userInfo.setRemark("您好,歡迎訪問(wèn) pan_junbiao的博客");
        }
        //返回結(jié)果
        return userInfo;
    }
 
    /**
     * 新增用戶(hù)
     */
    @RequestMapping(value = "/addUser", method = RequestMethod.POST, produces = {"text/html;charset=UTF-8;", "application/json;"})
    @ResponseBody
    public String addUser(UserInfo userInfo)
    {
        return "執(zhí)行新增用戶(hù),用戶(hù)名稱(chēng):" + userInfo.getUserName();
    }
 
    /**
     * 刪除用戶(hù)
     */
    @RequestMapping(value = "/deleteUser/{id}", method = RequestMethod.DELETE, produces = {"text/html;charset=UTF-8;", "application/json;"})
    @ResponseBody
    public String deleteUser(@PathVariable("id") int userId)
    {
        return "執(zhí)行刪除用戶(hù),用戶(hù)ID:" + userId;
    }
 
    /**
     * 修改用戶(hù)
     */
    @RequestMapping(value = "/updateUser", method = RequestMethod.POST, produces = {"text/html;charset=UTF-8;", "application/json;"})
    @ResponseBody
    public String updateUser(UserInfo userInfo)
    {
        return "執(zhí)行修改用戶(hù),用戶(hù)名稱(chēng):" + userInfo.getUserName();
    }
}

(3)創(chuàng)建執(zhí)行頁(yè)面(index.jsp),在該頁(yè)面中使用了JQuery框架

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首頁(yè)</title>
    <meta name="author" content="pan_junbiao的博客">
</head>
<body>
<h1>首頁(yè)</h1>
<input type="button" id="btnGetUser" value="獲取用戶(hù)"/>
<input type="button" id="btnAddUser" value="新增用戶(hù)"/>
<input type="button" id="btnDeleteUser" value="刪除用戶(hù)"/>
<input type="button" id="btnUpdateUser" value="修改用戶(hù)"/><br>
<p id="msg" style="color: red; font-size: 18px"></p>
</body>
<script src="${pageContext.request.contextPath}/JS/jquery-3.4.1.min.js"></script>
<script>
    //獲取用戶(hù)按鈕事件
    $("#btnGetUser").click(function () {
        var url = "${pageContext.request.contextPath}/user/getUser/1";
        window.location.href = url;
    });
 
    //新增用戶(hù)按鈕事件
    $("#btnAddUser").click(function () {
        //執(zhí)行Ajax請(qǐng)求
        $.ajax({
            type: "POST",
            url: "${pageContext.request.contextPath}/user/addUser",
            data: {
                userId: 1,
                userName: "pan_junbiao的博客"
            },
            success: function (result) {
                $("#msg").append(result + "<br>");
            }
        });
    });
 
    //刪除用戶(hù)按鈕事件
    $("#btnDeleteUser").click(function () {
        //執(zhí)行Ajax請(qǐng)求
        $.ajax({
            type: "DELETE",
            url: "${pageContext.request.contextPath}/user/deleteUser/1",
            success: function (result) {
                $("#msg").append(result + "<br>");
            }
        });
    });
 
    //修改用戶(hù)按鈕事件
    $("#btnUpdateUser").click(function () {
        //執(zhí)行Ajax請(qǐng)求
        $.ajax({
            type: "POST",
            url: "${pageContext.request.contextPath}/user/updateUser",
            data: {
                userId: 1,
                userName: "pan_junbiao的博客"
            },
            success: function (result) {
                $("#msg").append(result + "<br>");
            }
        });
    });
</script>
</html>

執(zhí)行結(jié)果:

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計(jì)模式之觀察者模式

    Java設(shè)計(jì)模式之觀察者模式

    這篇文章主要為大家介紹了Java觀察者模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Java?EasyExcel導(dǎo)入帶圖片的完整過(guò)程記錄

    Java?EasyExcel導(dǎo)入帶圖片的完整過(guò)程記錄

    這篇文章主要介紹了關(guān)于結(jié)合EasyExcel和ApachePOI來(lái)實(shí)現(xiàn)Excel數(shù)據(jù)批量導(dǎo)入并讀取圖片的過(guò)程,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • java實(shí)現(xiàn)題目以及選項(xiàng)亂序的方法實(shí)例

    java實(shí)現(xiàn)題目以及選項(xiàng)亂序的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)題目以及選項(xiàng)亂序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java實(shí)戰(zhàn)之網(wǎng)上書(shū)店管理系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之網(wǎng)上書(shū)店管理系統(tǒng)的實(shí)現(xiàn)

    本文將利用Java語(yǔ)言實(shí)現(xiàn)網(wǎng)上書(shū)店管理系統(tǒng)。其功能一般包括:圖書(shū)信息管理、用戶(hù)信息管理、圖書(shū)購(gòu)買(mǎi)、圖書(shū)訂單查看、圖書(shū)添加、圖書(shū)維護(hù)等等,感興趣的可以了解一下
    2022-06-06
  • springboot依賴(lài)沖突問(wèn)題及解決過(guò)程

    springboot依賴(lài)沖突問(wèn)題及解決過(guò)程

    新搭了一個(gè)springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的過(guò)程中,啟動(dòng)報(bào)錯(cuò),怎么解決這個(gè)問(wèn)題呢,下面小編給大家?guī)?lái)了springboot依賴(lài)沖突問(wèn)題及解決過(guò)程,一起看看吧
    2021-09-09
  • 關(guān)于jackson序列化和feign返回值的問(wèn)題

    關(guān)于jackson序列化和feign返回值的問(wèn)題

    這篇文章主要介紹了關(guān)于jackson序列化和feign返回值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java中四種引用詳解

    Java中四種引用詳解

    這篇文章主要為大家介紹了Java中的四種引用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Mybatis中的延遲加載,以及原理分析

    Mybatis中的延遲加載,以及原理分析

    這篇文章主要介紹了Mybatis中的延遲加載以及原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • JavaWeb中的簡(jiǎn)單分頁(yè)完整代碼(推薦)

    JavaWeb中的簡(jiǎn)單分頁(yè)完整代碼(推薦)

    這次主要是講解一下通過(guò)登錄后對(duì)得到的數(shù)據(jù)進(jìn)行分頁(yè),首先我們新建一個(gè)登錄頁(yè)面login.jsp,因?yàn)槲覀冎饕獙W(xué)習(xí)的分頁(yè),所以登錄驗(yàn)證的部分沒(méi)有提到。關(guān)于javaweb中的分頁(yè)代碼大家通過(guò)本文學(xué)習(xí)吧
    2016-11-11
  • 解決@RequestBody接收json對(duì)象報(bào)錯(cuò)415的問(wèn)題

    解決@RequestBody接收json對(duì)象報(bào)錯(cuò)415的問(wèn)題

    這篇文章主要介紹了解決@RequestBody接收json對(duì)象報(bào)錯(cuò)415的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評(píng)論

平江县| 宁城县| 灌云县| 孟津县| 五台县| 张家界市| 滦南县| 江达县| 定安县| 上犹县| 新平| 东方市| 海原县| 磐安县| 呼伦贝尔市| 丰原市| 诸城市| 平果县| 嵩明县| 无锡市| 宝清县| 错那县| 蓝田县| 顺平县| 瑞金市| 花垣县| 邹城市| 洪江市| 金堂县| 和平区| 旬邑县| 县级市| 双流县| 延津县| 弋阳县| 贵溪市| 大名县| 阳江市| 瓦房店市| 寻乌县| 库尔勒市|