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

Spring mvc Controller和RestFul原理解析

 更新時(shí)間:2020年03月19日 10:45:17   作者:黃大姐の老公  
這篇文章主要介紹了Spring mvc Controller和RestFul原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

控制器Controller

  • 控制器復(fù)雜提供訪問(wèn)應(yīng)用程序的行為,通常通過(guò)接口定義或注解定義兩種方法實(shí)現(xiàn)。
  • 控制器負(fù)責(zé)解析用戶(hù)的請(qǐng)求并將其轉(zhuǎn)換為一個(gè)模型。
  • 在Spring MVC中一個(gè)控制器類(lèi)可以包含多個(gè)方法
  • 在Spring MVC中,對(duì)于Controller的配置方式有很多種

實(shí)現(xiàn)Controller接口

Controller是一個(gè)接口,在org.springframework.web.servlet.mvc包下,接口中只有一個(gè)方法;

//實(shí)現(xiàn)該接口的類(lèi)獲得控制器功能
public interface Controller {
  //處理請(qǐng)求且返回一個(gè)模型與視圖對(duì)象
  ModelAndView handleRequest(HttpServletRequest var1, HttpServletResponse var2) throws Exception;
}

測(cè)試

編寫(xiě)一個(gè)Controller類(lèi),ControllerTest1

// 定義控制器
// 注意點(diǎn):不要導(dǎo)錯(cuò)包,實(shí)現(xiàn)Controller接口,重寫(xiě)方法;
public class ControllerTest1 implements Controller {

  public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
    //返回一個(gè)模型視圖對(duì)象
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg","Test1Controller");
    mv.setViewName("test");
    return mv;
  }
}

編寫(xiě)完畢后,去Spring配置文件中注冊(cè)請(qǐng)求的bean;name對(duì)應(yīng)請(qǐng)求路徑,class對(duì)應(yīng)處理請(qǐng)求的類(lèi)

<bean name="/t1" class="com.xiaohua.controller.ControllerTest1"/>

編寫(xiě)前端test.jsp,注意在WEB-INF/jsp目錄下編寫(xiě),對(duì)應(yīng)我們的視圖解析器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>Kuangshen</title>
</head>
<body>
  ${msg}
</body>
</html>

配置Tomcat運(yùn)行測(cè)試,我這里沒(méi)有項(xiàng)目發(fā)布名配置的就是一個(gè) / ,所以請(qǐng)求不用加項(xiàng)目名,OK!

說(shuō)明:

實(shí)現(xiàn)接口Controller定義控制器是較老的辦法

缺點(diǎn)是:一個(gè)控制器中只有一個(gè)方法,如果要多個(gè)方法則需要定義多個(gè)Controller;定義的方式比較麻煩;

使用注解@Controller

@Controller注解類(lèi)型用于聲明Spring類(lèi)的實(shí)例是一個(gè)控制器(在講IOC時(shí)還提到了另外3個(gè)注解);

Spring可以使用掃描機(jī)制來(lái)找到應(yīng)用程序中所有基于注解的控制器類(lèi),為了保證Spring能找到你的控制器,需要在配置文件中聲明組件掃描。

<!-- 自動(dòng)掃描指定的包,下面所有注解類(lèi)交給IOC容器管理 -->
<context:component-scan base-package="com.xiaohua.controller"/>

增加一個(gè)ControllerTest2類(lèi),使用注解實(shí)現(xiàn);

// @Controller注解的類(lèi)會(huì)自動(dòng)添加到Spring上下文中
@Controller
public class ControllerTest2{

  //映射訪問(wèn)路徑
  @RequestMapping("/t2")
  public String index(Model model){
    //Spring MVC會(huì)自動(dòng)實(shí)例化一個(gè)Model對(duì)象用于向視圖中傳值
    model.addAttribute("msg", "ControllerTest2");
    //返回視圖位置
    return "test";
  }

}

運(yùn)行tomcat測(cè)試

可以發(fā)現(xiàn),我們的兩個(gè)請(qǐng)求都可以指向一個(gè)視圖,但是頁(yè)面結(jié)果的結(jié)果是不一樣的,從這里可以看出視圖是被復(fù)用的,而控制器與視圖之間是弱偶合關(guān)系。

RequestMapping
@RequestMapping注解用于映射url到控制器類(lèi)或一個(gè)特定的處理程序方法??捎糜陬?lèi)或方法上。用于類(lèi)上,表示類(lèi)中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑。

為了測(cè)試結(jié)論更加準(zhǔn)確,我們可以加上一個(gè)項(xiàng)目名測(cè)試 myweb

只注解在方法上面

@Controller
public class TestController {
  @RequestMapping("/h1")
  public String test(){
    return "test";
  }
}

訪問(wèn)路徑:http://localhost:8080 / 項(xiàng)目名 / h1

同時(shí)注解類(lèi)與方法

@Controller
@RequestMapping("/admin")
public class TestController {
  @RequestMapping("/h1")
  public String test(){
    return "test";
  }
}

訪問(wèn)路徑:http://localhost:8080 / 項(xiàng)目名/ admin /h1 , 需要先指定類(lèi)的路徑再指定方法的路徑;

RestFul風(fēng)格
Restful就是一個(gè)資源定位及資源操作的風(fēng)格。不是標(biāo)準(zhǔn)也不是協(xié)議,只是一種風(fēng)格?;谶@個(gè)風(fēng)格設(shè)計(jì)的軟件可以更簡(jiǎn)潔,更有層次,更易于實(shí)現(xiàn)緩存等機(jī)制。

功能

  • 資源:互聯(lián)網(wǎng)所有的事物都可以被抽象為資源
  • 資源操作:使用POST、DELETE、PUT、GET,使用不同方法對(duì)資源進(jìn)行操作。
  • 分別對(duì)應(yīng) 添加、 刪除、修改、查詢(xún)。

傳統(tǒng)方式操作資源 :通過(guò)不同的參數(shù)來(lái)實(shí)現(xiàn)不同的效果!方法單一,post 和 get

  • http://127.0.0.1/item/queryItem.action?id=1 查詢(xún),GET
  • http://127.0.0.1/item/saveItem.action 新增,POST
  • http://127.0.0.1/item/updateItem.action 更新,POST
  • http://127.0.0.1/item/deleteItem.action?id=1 刪除,GET或POST

使用RESTful操作資源 : 可以通過(guò)不同的請(qǐng)求方式來(lái)實(shí)現(xiàn)不同的效果!如下:請(qǐng)求地址一樣,但是功能可以不同!

  • http://127.0.0.1/item/1 查詢(xún),GET
  • http://127.0.0.1/item 新增,POST
  • http://127.0.0.1/item 更新,PUT
  • http://127.0.0.1/item/1 刪除,DELETE

學(xué)習(xí)測(cè)試

在新建一個(gè)類(lèi) RestFulController

@Controller
public class RestFulController {
}

在Spring MVC中可以使用 @PathVariable 注解,讓方法參數(shù)的值對(duì)應(yīng)綁定到一個(gè)URI模板變量上。

@Controller
public class RestFulController {

  //映射訪問(wèn)路徑
  @RequestMapping("/commit/{p1}/{p2}")
  public String index(@PathVariable int p1, @PathVariable int p2, Model model){

    int result = p1+p2;
    //Spring MVC會(huì)自動(dòng)實(shí)例化一個(gè)Model對(duì)象用于向視圖中傳值
    model.addAttribute("msg", "結(jié)果:"+result);
    //返回視圖位置
    return "test";

  }

}

我們來(lái)測(cè)試請(qǐng)求查看下

使用路徑變量的好處?

  • 使路徑變得更加簡(jiǎn)潔;
  • 獲得參數(shù)更加方便,框架會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。
  • 通過(guò)路徑變量的類(lèi)型可以約束訪問(wèn)參數(shù),如果類(lèi)型不一樣,則訪問(wèn)不到對(duì)應(yīng)的請(qǐng)求方法,如這里訪問(wèn)是的路徑是/commit/1/a,則路徑與方法不匹配,而不會(huì)是參數(shù)轉(zhuǎn)換失敗。

我們來(lái)修改下對(duì)應(yīng)的參數(shù)類(lèi)型,再次測(cè)試

//映射訪問(wèn)路徑
@RequestMapping("/commit/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable String p2, Model model){

  String result = p1+p2;
  //Spring MVC會(huì)自動(dòng)實(shí)例化一個(gè)Model對(duì)象用于向視圖中傳值
  model.addAttribute("msg", "結(jié)果:"+result);
  //返回視圖位置
  return "test";

}

使用method屬性指定請(qǐng)求類(lèi)型

用于約束請(qǐng)求的類(lèi)型,可以收窄請(qǐng)求范圍。指定請(qǐng)求謂詞的類(lèi)型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等

我們來(lái)測(cè)試一下:

增加一個(gè)方法

//映射訪問(wèn)路徑,必須是POST請(qǐng)求
@RequestMapping(value = "/hello",method = {RequestMethod.POST})
public String index2(Model model){
  model.addAttribute("msg", "hello!");
  return "test";
}

我們使用瀏覽器地址欄進(jìn)行訪問(wèn)默認(rèn)是Get請(qǐng)求,會(huì)報(bào)錯(cuò)405:

如果將POST修改為GET則正常了;

//映射訪問(wèn)路徑,必須是Get請(qǐng)求
@RequestMapping(value = "/hello",method = {RequestMethod.GET})
public String index2(Model model){
  model.addAttribute("msg", "hello!");
  return "test";
}

小結(jié):

Spring MVC 的 @RequestMapping 注解能夠處理 HTTP 請(qǐng)求的方法, 比如 GET, PUT, POST, DELETE 以及 PATCH。

所有的地址欄請(qǐng)求默認(rèn)都會(huì)是 HTTP GET 類(lèi)型的。

方法級(jí)別的注解變體有如下幾個(gè): 組合注解

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
  • @GetMapping 是一個(gè)組合注解

它所扮演的是 @RequestMapping(method =RequestMethod.GET) 的一個(gè)快捷方式。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java服務(wù)限流算法的6種實(shí)現(xiàn)

    Java服務(wù)限流算法的6種實(shí)現(xiàn)

    服務(wù)限流是指通過(guò)控制請(qǐng)求的速率或次數(shù)來(lái)達(dá)到保護(hù)服務(wù)的目的,本文主要介紹了Java服務(wù)限流算法的6種實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Spring Boot配置讀取實(shí)現(xiàn)方法解析

    Spring Boot配置讀取實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Spring Boot配置讀取實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java實(shí)現(xiàn)翻轉(zhuǎn)單詞順序列

    java實(shí)現(xiàn)翻轉(zhuǎn)單詞順序列

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)翻轉(zhuǎn)單詞順序列,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • SpringBoot中web模板渲染的實(shí)現(xiàn)

    SpringBoot中web模板渲染的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中web模板渲染的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間

    Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間

    這篇文章主要為大家詳細(xì)介紹了Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • 深入剖析Java編程中的序列化

    深入剖析Java編程中的序列化

    這篇文章主要介紹了深入剖析Java編程中的序列化,文中談到了序列化時(shí)對(duì)象的繼承等各種問(wèn)題,案例詳盡,強(qiáng)烈推薦!需要的朋友可以參考下
    2015-07-07
  • 淺談SpringBoot項(xiàng)目打成war和jar的區(qū)別

    淺談SpringBoot項(xiàng)目打成war和jar的區(qū)別

    這篇文章主要介紹了淺談SpringBoot項(xiàng)目打成war和jar的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java socket大數(shù)據(jù)傳輸丟失問(wèn)題及解決

    java socket大數(shù)據(jù)傳輸丟失問(wèn)題及解決

    這篇文章主要介紹了java socket大數(shù)據(jù)傳輸丟失問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • MyBatis圖文并茂講解注解開(kāi)發(fā)多對(duì)多查詢(xún)

    MyBatis圖文并茂講解注解開(kāi)發(fā)多對(duì)多查詢(xún)

    這篇文章主要介紹了SpringBoot中Mybatis注解多對(duì)多查詢(xún)的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java利用數(shù)組隨機(jī)抽取幸運(yùn)觀眾如何實(shí)現(xiàn)

    Java利用數(shù)組隨機(jī)抽取幸運(yùn)觀眾如何實(shí)現(xiàn)

    這篇文章主要介紹了Java利用數(shù)組隨機(jī)抽取幸運(yùn)觀眾如何實(shí)現(xiàn),需要的朋友可以參考下
    2014-02-02

最新評(píng)論

大洼县| 郁南县| 腾冲县| 广汉市| 民权县| 玉山县| 嘉鱼县| 谢通门县| 诸暨市| 长子县| 陈巴尔虎旗| 鸡西市| 宝清县| 化州市| 田阳县| 鄂州市| 无棣县| 民县| 平山县| 阜新| 安仁县| 怀柔区| 甘孜县| 盐池县| 东至县| 东乌珠穆沁旗| 连南| 吴旗县| 清徐县| 安仁县| 宜章县| 武鸣县| 青田县| 高邮市| 东乌珠穆沁旗| 太湖县| 梅河口市| 黎平县| 马公市| 怀安县| 抚州市|