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

springboot中的controller注意事項(xiàng)說(shuō)明

 更新時(shí)間:2022年03月18日 14:32:46   作者:in_motion  
這篇文章主要介紹了springboot中的controller注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

關(guān)于controller注意事項(xiàng)

spring boot的controller水深無(wú)比,經(jīng)過(guò)學(xué)習(xí),我總結(jié)一些tips,以便以后參照,減少錯(cuò)誤:

1.controller主要有兩個(gè)標(biāo)簽

@Controller和@RestController,兩個(gè)標(biāo)簽無(wú)法同時(shí)發(fā)揮作用,前者標(biāo)注的類(lèi)只能返回靜態(tài)文件,后者標(biāo)注的類(lèi)用于返回?cái)?shù)據(jù)類(lèi)型如json字符串

2.使用@Controller標(biāo)簽時(shí)

templates下的文件并不能被識(shí)別(自己試驗(yàn)過(guò),發(fā)現(xiàn)和網(wǎng)上很多說(shuō)法都不一樣),只有static文件夾下文件能直接被讀取,具體代碼如下:

@RequestMapping(value="/", method= RequestMethod.GET)
public String home() {
? ? return "views/index.html";
}

這里static作為根目錄被訪(fǎng)問(wèn)。

各種controller的寫(xiě)法

最近玩SpingBoot,以下是一些Controller的各種寫(xiě)法

我們將分為四部分

  • 1、Controller的類(lèi)型(傳統(tǒng)的 和 REST)
  • 2、路由(Routes)
  • 3、如何接收數(shù)據(jù)
  • 4、Controller示例

Controller 類(lèi)型

你也許每天都在使用Spring ,但你知道controller有幾種類(lèi)型嗎?其實(shí)controller是有兩種的,一種就是傳統(tǒng)的web的那種controller,而另外一種就是REST類(lèi)型的controller。

@Controller 通常是被使用服務(wù)于web 頁(yè)面的。默認(rèn),你的controller方法返回的是一個(gè)string 串,是表示要展示哪個(gè)模板頁(yè)面或者是要跳轉(zhuǎn)到哪里去。

@RestController 就是專(zhuān)門(mén)用在編寫(xiě)API的時(shí)候,特別那種返回一個(gè)JSON,或者是XML等等。然后方法返回的是可以是一個(gè)對(duì)象,是一個(gè)可以被序列化的對(duì)象。

當(dāng)然了你也可以通過(guò)controller來(lái)實(shí)現(xiàn)返回JSON、XML這些。只是這里為了"REST",得另立門(mén)戶(hù),這樣會(huì)更加的清晰明了。

路由(Routes)

這里的路由就是指http method。(GET,POST,PUT,PATCH,DELETE)。

HTTP Methods

在Spring boot中,http method可以被用類(lèi)似“*Mapping”的格式來(lái)表示:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @PatchMapping
  • @DeleteMapping

然后這些注解中可以添加path,像下面這樣:

例子: @GetMapping("/users")

一個(gè)比較典型的REST controller 一般是像下面這樣來(lái)映射路由的:

@RestController
public class UsersController { ??
?
? ?@GetMapping("/users") ? ?
? ? public List<User> index() {...} ?
??
? ? @GetMapping("/users/{id}") ? ?
? ? public User show(...) {...}
? ??
? ? @PostMapping("/users") ? ?
? ? public User create(...) {...} ?
??
? ? @PutMapping("/users/{id}") ??
? ? public User update(...) {...} ? ?
?
? ? @DeleteMapping("/users/{id}") ? ?
? ? public void delete(...) {...}
}

還有一種比較常見(jiàn)的做法是通過(guò)在controller類(lèi)上添加一個(gè)@RequestMapping注解。這樣相當(dāng)于可以把上面的所有的mapping前綴添加到這里。

像下面這樣(基于上面的例子修改):

@RestController
@RequestMapping("/users")
public class UsersController {
? ??
? ? @GetMapping
? ? public List<User> index() {...}
? ??
? ? @GetMapping("{id}") ? ?
? ? public User show(...) {...} ??
?
? ? @PostMapping
? ? public User create(...) {...}?
? ?
? ? @PutMapping("{id}") ??
? ? public User update(...) {...} ??
?
? ? @DeleteMapping("{id}") ? ?
? ? public void delete(...) {...}
}

返回狀態(tài)

Controller的方法可以去指定一個(gè)返回狀態(tài)碼。默認(rèn)的是返回一個(gè)200 OK,如果是沒(méi)有返回值(void)則返回 204 No Content。

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User create(...) {...}

路徑變量

你可以通過(guò)添加@PathVariable注解來(lái)把路徑上的值捕獲下來(lái):

// DELETE /users/123
@DeleteMapping("/users/{id}")
public void delete(@PathVariable long id) {...}

默認(rèn)情況下,參數(shù)名必須要和路徑上的變量名一樣。但你也可以通過(guò)下面的方式來(lái)修改,就是你通過(guò)給@PathVariable賦值為路徑變量名,然后參數(shù)名就可以是不一樣的了:

// GET /users/me@example.com/edit
@GetMapping("/users/{email}/edit"
public String edit(@PathVariable("email") String userEmail) {...}

接收數(shù)據(jù)

查詢(xún)字符參數(shù)

如果是通過(guò)?xxx=xxx&yyy=yyy來(lái)傳遞過(guò)來(lái)的參數(shù),那么我們可以通過(guò)@RequestParam來(lái)獲?。?/p>

// GET /users?count=10
@GetMapping("/users")
public List<User> index(@RequestParam int count) {...}

默認(rèn)的話(huà),變量名必須要和查詢(xún)字符參數(shù)是一樣的。你也可以通過(guò)下面的方式來(lái)修改:

// GET /users?num_per_page=50
@GetMapping("/users")
public List<User> index(@RequestParam("num_per_page") int numPerPage) {...}

提交HTML表單數(shù)據(jù)

如果我們想要?jiǎng)?chuàng)建一個(gè)用戶(hù)。這時(shí)候,我么可能在前端,寫(xiě)下面這樣一個(gè)form:

<form action="/users" method="POST">
? <input name="name"/>
? <input name="email"/>
? <button type="submit">Create User</button>
</form>

現(xiàn)在我們創(chuàng)建一個(gè)請(qǐng)求模型,用來(lái)匹配我們的前端form結(jié)構(gòu):

class UserCreateRequest { ? ?
? ?private String name; ? ?
? ?private String email; ? ?
? ?/* Getters & Setters omitted */
}

然后我們就可以在controller對(duì)應(yīng)的方法上來(lái)捕獲form里的值,我們通過(guò)對(duì)參數(shù)添加一個(gè)@ModelAttribute注解就可以實(shí)現(xiàn)了:

@PostMapping("/users")
public User create(@ModelAttribute UserCreateRequest request) {...}

提交JSON

就像上面例子那樣,我們創(chuàng)建一個(gè)用戶(hù),然后是一個(gè)JSON格式:

{ "name": "Som Eone", "email": "someone@example.com"}

然后請(qǐng)求模型還是沿用之前的:

class UserCreateRequest {undefined
private String name;
private String email;?
}

然后我們使用@RequestBody來(lái)捕獲前端發(fā)送過(guò)來(lái)的JSON串,然后反序列化到我們的請(qǐng)求模型UserCreateRequest:

@PostMapping
public User create(@RequestBody UserCreateRequest request) {...}

Controller 舉例

以下是使用上述所有注解創(chuàng)建Controller的示例。 沒(méi)有具體邏輯,只是簡(jiǎn)單的展示上面說(shuō)到的各個(gè)注解。

傳統(tǒng)的controller

這類(lèi)型的controller返回值表示要展示的頁(yè)面或要跳轉(zhuǎn)到哪個(gè)請(qǐng)求。

@Controller
@RequestMapping("/users")
public class UsersController { ? ?
? ?@GetMapping
? ? public String index() { ? ? ? ?
? ? ? ? return "users/index";
? ? } ? ?
?
? ? @GetMapping("{id}") ? ?
? ? public String show(@PathVariable long id) { ? ? ? ?
? ? ? ? ?return "users/show";
? ? }  ?
?
? ? @PostMapping
? ? @ResponseStatus(HttpStatus.CREATED) ? ?
? ? public String create(@ModelAttribute UserCreateRequest request) {
? ? ? return "redirect:/users";
? ? } ? ?
?
? ? @PutMapping("{id}") ? ?
? ? public String update(@PathVariable long id, @RequestBody UserUpdateRequest request) { ? ? ? ?
? ? ? ?return "redirect:/users/" + id;
? ? } ??
?
? ? @DeleteMapping("{id}") ? ?
? ? public String delete(@PathVariable long id) { ? ? ? ?
? ? ? ? return "redirect:/users";
? ? }
}

REST controller

這類(lèi)型的controller返回值是一些對(duì)象,這些對(duì)象要被序列化成JSON、XML等其他格式,并不是表示要跳轉(zhuǎn)到哪個(gè)HTML模板。

@RestController
@RequestMapping("/users")
public class UsersController { ? ?
? ?@GetMapping
? ? public List<User> index() { ? ? ? ?return new ArrayList<User>();
? ? } ??
?
? ? @GetMapping("{id}") ? ?
? ? public User show(@PathVariable long id) { ? ? ? ?return new User();
? ? } ?
?
? ? @PostMapping
? ? @ResponseStatus(HttpStatus.CREATED) ? ?
? ? public User create(@RequestBody UserCreateRequest request) {
? ? ? ?return new User();
? ? } ? ?
?
? ? @PutMapping("{id}") ? ?
? ? public User update(@PathVariable long id, @RequestBody UserUpdateRequest request) { ? ? ? ?
? ? ? ?return new User();
? ? } ? ?
?
? ? @DeleteMapping("{id}") ? ?
? ? public void delete(@PathVariable long id) {}
}

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

相關(guān)文章

  • java判定數(shù)組或集合是否存在某個(gè)元素的實(shí)例

    java判定數(shù)組或集合是否存在某個(gè)元素的實(shí)例

    下面小編就為大家?guī)?lái)一篇java判定數(shù)組或集合是否存在某個(gè)元素的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式

    Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式

    這篇文章主要介紹了Mybatis-Plus條件構(gòu)造器select方法返回指定字段方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 基于Java編寫(xiě)第一個(gè)區(qū)塊鏈項(xiàng)目

    基于Java編寫(xiě)第一個(gè)區(qū)塊鏈項(xiàng)目

    區(qū)塊鏈?zhǔn)欠植际綌?shù)據(jù)存儲(chǔ)、點(diǎn)對(duì)點(diǎn)傳輸、共識(shí)機(jī)制、加密算法等計(jì)算機(jī)技術(shù)的新型應(yīng)用模式,下面這篇文章主要給大家介紹了基于Java實(shí)現(xiàn)區(qū)塊鏈的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐

    Fluent Mybatis學(xué)習(xí)之Update語(yǔ)法實(shí)踐

    Fluent MyBatis是一個(gè)MyBatis的增強(qiáng)工具,沒(méi)有對(duì)mybatis做任何修改。本篇文章將詳細(xì)介紹對(duì)Fluent Mybatis中的update語(yǔ)法進(jìn)行驗(yàn)證。代碼具有一定價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-11-11
  • 簡(jiǎn)單了解Java日志脫敏框架sensitive

    簡(jiǎn)單了解Java日志脫敏框架sensitive

    這篇文章主要介紹了簡(jiǎn)單了解Java日志脫敏框架sensitive,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot+MinIO+KKFileView實(shí)現(xiàn)文件預(yù)覽功能

    SpringBoot+MinIO+KKFileView實(shí)現(xiàn)文件預(yù)覽功能

    本文主要介紹了使用SpringBoot、MinIO和KKFileView實(shí)現(xiàn)文件上傳和在線(xiàn)預(yù)覽功能,通過(guò)配置MinIO存儲(chǔ)文件,并使用KKFileView生成預(yù)覽鏈接,感興趣的可以了解一下
    2024-11-11
  • Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程

    Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程

    Geotools作為一款功能強(qiáng)大且開(kāi)源的地理工具庫(kù),為地理數(shù)據(jù)的處理和分析提供了豐富的類(lèi)庫(kù)和便捷的接口,能夠很好地滿(mǎn)足從DEM數(shù)據(jù)中讀取高程信息這一實(shí)戰(zhàn)需求,本文將深入講解如何利用Geotools從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過(guò)程,需要的朋友可以參考下
    2025-03-03
  • java底層AQS實(shí)現(xiàn)類(lèi)ReentrantLock鎖的構(gòu)成及源碼解析

    java底層AQS實(shí)現(xiàn)類(lèi)ReentrantLock鎖的構(gòu)成及源碼解析

    本章我們就要來(lái)學(xué)習(xí)一下第一個(gè)?AQS?的實(shí)現(xiàn)類(lèi):ReentrantLock,看看其底層是如何組合?AQS?,實(shí)現(xiàn)了自己的那些功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Nacos通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的方式分享

    Nacos通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新的方式分享

    這篇文章主要給大家介紹了Nacos如何通過(guò)RefreshScope實(shí)現(xiàn)配置自動(dòng)更新,文中給了兩種實(shí)現(xiàn)方式供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • Java多線(xiàn)程之JUC(java.util.concurrent)的常見(jiàn)類(lèi)(多線(xiàn)程編程常用類(lèi))

    Java多線(xiàn)程之JUC(java.util.concurrent)的常見(jiàn)類(lèi)(多線(xiàn)程編程常用類(lèi))

    這篇文章主要給大家介紹了關(guān)于Java多線(xiàn)程之JUC(java.util.concurrent)的常見(jiàn)類(lèi)(多線(xiàn)程編程常用類(lèi))的相關(guān)資料,Java中的JUC(java.util.concurrent)包提供了一些并發(fā)編程中常用的類(lèi),這些類(lèi)可以幫助我們更方便地實(shí)現(xiàn)多線(xiàn)程編程,需要的朋友可以參考下
    2024-02-02

最新評(píng)論

绥阳县| 周宁县| 永修县| 武乡县| 卢湾区| 永嘉县| 澎湖县| 和田县| 揭东县| 沿河| 镇沅| 武鸣县| 朔州市| 浏阳市| 南乐县| 察雅县| 芮城县| 酒泉市| 武陟县| 错那县| 鸡泽县| 师宗县| 靖远县| 辰溪县| 岱山县| 西吉县| 社会| 陆河县| 鸡东县| 枞阳县| 福州市| 民权县| 板桥市| 京山县| 全椒县| 鹤壁市| 工布江达县| 昌吉市| 达日县| 英德市| 辉县市|