欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應(yīng)代碼示例

 更新時間:2023年12月09日 08:36:15   作者:yfs1024  
這篇文章主要給大家介紹了關(guān)于SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應(yīng)的相關(guān)資料,前端負(fù)責(zé)展示頁面和用戶交互,而后端則負(fù)責(zé)處理業(yè)務(wù)邏輯和數(shù)據(jù)存儲,在這種架構(gòu)下前端需要將用戶輸入的數(shù)據(jù)發(fā)送給后端進(jìn)行處理,需要的朋友可以參考下

請求

SpringBoot接受前臺參數(shù)的六種方式,首先因?yàn)閺那芭_發(fā)送的請求沒有界面的話只能是從地址欄發(fā)送并且只能是Get請求,為了測試其他的請求,所以我們使用一個工具->Postman,Postman是一款功能強(qiáng)大的網(wǎng)頁調(diào)試與發(fā)送網(wǎng)頁HTTP請求的Chrome插件。

對于前臺傳過來的參數(shù)大致分為六種,下面一個一個的做演示學(xué)習(xí):演示之前先復(fù)習(xí)一下,沒用SpringBoot獲取前臺參數(shù)的方式,通過request對象獲取。

@RestController
public class RequestController {
    //原始方式
    @RequestMapping("/simpleParam")
    public String simpleParam(HttpServletRequest request){
        // http://localhost:8080/simpleParam?name=Tom&age=10
        // 請求參數(shù): name=Tom&age=10   (有2個請求參數(shù))
        // 第1個請求參數(shù): name=Tom   參數(shù)名:name,參數(shù)值:Tom
        // 第2個請求參數(shù): age=10     參數(shù)名:age , 參數(shù)值:10

        String name = request.getParameter("name");//name就是請求參數(shù)名
        String ageStr = request.getParameter("age");//age就是請求參數(shù)名

        int age = Integer.parseInt(ageStr);//需要手動進(jìn)行類型轉(zhuǎn)換
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}

在Springboot的環(huán)境中,對原始的API進(jìn)行了封裝,接收參數(shù)的形式更加簡單。 如果是簡單參數(shù),參數(shù)名與形參變量名相同,定義同名的形參即可接收參數(shù)。

1、簡單參數(shù)

@RestController
public class RequestController {
        // http://localhost:8080/simpleParam?name=Tom&age=10
    // 第1個請求參數(shù): name=Tom   參數(shù)名:name,參數(shù)值:Tom
    // 第2個請求參數(shù): age=10     參數(shù)名:age , 參數(shù)值:10
    
    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(String name , Integer age ){//形參名和請求參數(shù)名保持一致
        System.out.println(name+"  :  "+age);
        return "OK";
    }
}

如果后臺需要但是前臺并沒傳對應(yīng)的參數(shù),這個時候會返回 null

當(dāng)前臺傳的參數(shù)名和后臺接受參數(shù)的方法形參列表不一致的時候,可以通過@RequestParam(“ ”)來指定

@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=20
    // 請求參數(shù)名:name

    //springboot方式
    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam("name") String username , Integer age ){
        System.out.println(username+"  :  "+age);
        return "OK";
    }
}

另外@RequestParam中的required屬性默認(rèn)為true(默認(rèn)值也是true),代表該請求參數(shù)必須傳遞,如果不傳遞將報錯,如果該參數(shù)是可選的,可以將required屬性設(shè)置為false

代碼如下:

@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required = false) String username, Integer age){
    System.out.println(username+ ":" + age);
    return "OK";
}

這個注解還有一個參數(shù),是defaultValue表示如果前臺沒有傳遞參數(shù)就默認(rèn)為當(dāng)前指定的值。

    @RequestMapping("/simpleParam")
    public String simpleParam(@RequestParam(name = "name", required = false,defaultValue ="匿名用戶") String userName, Integer age) {
        
//        打印輸出
        System.out.println(userName+"----"+age);
        return "ok";
    }

2、實(shí)體參數(shù)

簡單實(shí)體對象:

在使用簡單參數(shù)做為數(shù)據(jù)傳遞方式時,前端傳遞了多少個請求參數(shù),后端controller方法中的形參就要書寫多少個。如果請求參數(shù)比較多,通過上述的方式一個參數(shù)一個參數(shù)的接收,會比較繁瑣。

此時,我們可以考慮將請求參數(shù)封裝到一個實(shí)體類對象中。 要想完成數(shù)據(jù)封裝,需要遵守如下規(guī)則:請求參數(shù)名與實(shí)體類的屬性名相同

要求是前臺傳過來的參數(shù)必須和對象中的參數(shù)名稱相同,順序相同。

@RestController
public class RequestController {
    // http://localhost:8080/simpleParam?name=Tom&age=20
    
    //實(shí)體參數(shù):簡單實(shí)體對象  User有兩個屬性,一個是name 一個是age,這樣Spring就會自動完成賦值
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        System.out.println(user);
        return "OK";
    }
}

復(fù)雜實(shí)體對象:對象套對象

比如說User中又多了一個字段: Address 而這個類又有兩個屬性,這個時候前臺傳遞參數(shù)的時候就需要發(fā)生改變,后臺還是用User接受

public class User {
    private String name;
    private Integer age;
    private Address address; //地址對象
    .....
}


public class Address {
    private String province;
    private String city;
    .....
}

方法代碼

@RestController
public class RequestController {
    //實(shí)體參數(shù):復(fù)雜實(shí)體對象
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "OK";
    }
}

3、數(shù)組集合參數(shù)

數(shù)組集合參數(shù)的使用場景:在HTML的表單中,有一個表單項(xiàng)是支持多選的(復(fù)選框),可以提交選擇的多個值。

xxxxxxxx?hobby=game&hobby=java

后端程序接收上述多個值的方式有兩種:

  • 數(shù)組
  • 集合

數(shù)組參數(shù):請求參數(shù)名與形參數(shù)組名稱相同且請求參數(shù)為多個,定義數(shù)組類型形參即可接收參數(shù)

@RestController
public class RequestController {
    //數(shù)組集合參數(shù)
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }
}

集合參數(shù):請求參數(shù)名與形參集合對象名相同且請求參數(shù)為多個,@RequestParam 綁定參數(shù)關(guān)系

默認(rèn)情況下,請求中參數(shù)名相同的多個值,是封裝到數(shù)組。如果要封裝到集合,要使用@RequestParam綁定參數(shù)關(guān)系

Controller方法:

@RestController
public class RequestController {
    //數(shù)組集合參數(shù)
    @RequestMapping("/listParam")
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }
}

4、日期參數(shù)

上述演示的都是一些普通的參數(shù),在一些特殊的需求中,可能會涉及到日期類型數(shù)據(jù)的封裝(其實(shí)我們一般都存字符串,不會轉(zhuǎn)來轉(zhuǎn)去,所以這里了解)。比如,如下需求:

因?yàn)槿掌诘母袷蕉喾N多樣(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么對于日期類型的參數(shù)在進(jìn)行封裝的時候,需要通過@DateTimeFormat注解,以及其pattern屬性來設(shè)置日期的格式。

  • @DateTimeFormat注解的pattern屬性中指定了哪種日期格式,前端的日期參數(shù)就必須按照指定的格式傳遞。
  • 后端controller方法中,需要使用Date類型 LocalDateT或LocalDateTime類型,來封裝傳遞的參數(shù)。

Controller方法:

@RestController
public class RequestController {
    //日期時間參數(shù)
   @RequestMapping("/dateParam")
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "OK";
    }
}

5、JSON參數(shù)

在學(xué)習(xí)前端技術(shù)時,我們有講到過JSON,而在前后端進(jìn)行交互時,如果是比較復(fù)雜的參數(shù),前后端通過會使用JSON格式的數(shù)據(jù)進(jìn)行傳輸。 (JSON是開發(fā)中最常用的前后端數(shù)據(jù)交互方式) ,其實(shí)我們也會看到, 后臺如果返回給前臺數(shù)據(jù)的時候,有的是字符串,又的是集合,有的是JSON, 那么前臺在解析的時候就十分的麻煩, 后來經(jīng)過一個實(shí)體類用來存放所有的數(shù)據(jù), 然后返回這個對象, 這樣前臺在接受的時候只要處理JSON就好.在筆記的最后會提到

下面介紹在Postman中怎么發(fā)送JSON數(shù)據(jù):

服務(wù)端Controller方法接收J(rèn)SON格式數(shù)據(jù):

  • 傳遞json格式的參數(shù),在Controller中會使用實(shí)體類進(jìn)行封裝。
  • 封裝規(guī)則:JSON數(shù)據(jù)鍵名與形參對象屬性名相同,定義POJO類型形參即可接收參數(shù)。需要使用 @RequestBody標(biāo)識。
  • @RequestBody注解:將JSON數(shù)據(jù)映射到形參的實(shí)體類對象中(JSON中的key和實(shí)體類中的屬性名保持一致)

通過添加@RequestBody注解Spring可以自動的將JSON轉(zhuǎn)換為對象.

實(shí)體類:

public class User {
    private String name;
    private Integer age;
    private Address address;
    
    //省略GET , SET 方法
}  
@RestController
public class RequestController {
    //JSON參數(shù)
    @RequestMapping("/jsonParam")
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }
}

6、路徑參數(shù)(開發(fā)中使用的模式)

傳統(tǒng)的開發(fā)中請求參數(shù)是放在請求體(POST請求)傳遞或跟在URL后面通過?key=value的形式傳遞(GET請求)。

在現(xiàn)在的開發(fā)中,經(jīng)常還會直接在請求的URL中傳遞參數(shù)。例如:

http://localhost:8080/user/1		
http://localhost:880/user/1/0

上述的這種傳遞請求參數(shù)的形式呢,我們稱之為:路徑參數(shù)。

  • 前端:通過請求URL直接傳遞參數(shù)
  • 后端:使用{…}來標(biāo)識該路徑參數(shù),需要使用@PathVariable獲取路徑參數(shù)

路徑參數(shù):

前端:通過請求URL直接傳遞參數(shù)后端:使用{…}來標(biāo)識該路徑參數(shù),需要使用@PathVariable獲取路徑參數(shù)

Controller方法:

@RestController
public class RequestController {
    //路徑參數(shù)
    @RequestMapping("/path/{id}")
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "OK";
    }
}

傳遞多個路徑參數(shù):

@RestController
public class RequestController {
    //路徑參數(shù)  前臺路徑  xxxx/path/12/jack
    @RequestMapping("/path/{id}/{name}")
    public String pathParam2(@PathVariable Integer id, @PathVariable String name){
        System.out.println(id+ " : " +name);
        return "OK";
    }
}

響應(yīng):

前面我們學(xué)習(xí)過HTTL協(xié)議的交互方式:請求響應(yīng)模式(有請求就有響應(yīng))

那么Controller程序呢,除了接收請求外,還可以進(jìn)行響應(yīng)。先說一下使用到的注解:

@ResponseBody

  • 類型:方法注解、類注解
  • 位置:書寫在Controller方法上或類上
  • 作用:將方法返回值直接響應(yīng)給瀏覽器

如果返回值類型是實(shí)體對象/集合,將會轉(zhuǎn)換為JSON格式后在響應(yīng)給瀏覽器

在我們前面所編寫的controller方法中,都已經(jīng)設(shè)置了響應(yīng)數(shù)據(jù)??匆幌骂惖淖⒔釦RestController, 這個注解是一個復(fù)合注解,里面包括了 @ResponseBody

結(jié)論:在類上添加@RestController就相當(dāng)于添加了@ResponseBody注解。

  • 類上有@RestController注解或@ResponseBody注解時:表示當(dāng)前類下所有的方法返回值做為響應(yīng)數(shù)據(jù)
  • 方法的返回值,如果是一個POJO對象或集合時,會先轉(zhuǎn)換為JSON格式,在響應(yīng)給瀏覽器

下面我們來測試下響應(yīng)數(shù)據(jù):

@RestController
public class ResponseController {
    //響應(yīng)字符串
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World ~");
        return "Hello World ~";
    }
    //響應(yīng)實(shí)體對象
    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address addr = new Address();//創(chuàng)建實(shí)體類對象
        addr.setProvince("廣東");
        addr.setCity("深圳");
        return addr;
    }
    //響應(yīng)集合數(shù)據(jù)
    @RequestMapping("/listAddr")
    public List<Address> listAddr(){
        List<Address> list = new ArrayList<>();//集合對象
        
        Address addr = new Address();
        addr.setProvince("廣東");
        addr.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陜西");
        addr2.setCity("西安");

        list.add(addr);
        list.add(addr2);
        return list;
    }
}

在服務(wù)響應(yīng)了一個對象或者集合,那私前端獲取到的數(shù)據(jù)是什么樣子的呢?我們使用postman發(fā)送請求來測試下。測試效果如下:

統(tǒng)一響應(yīng)結(jié)果

可能大家會發(fā)現(xiàn),我們在前面所編寫的這些Controller方法中,返回值各種各樣,沒有任何的規(guī)范。

如果我們開發(fā)一個大型項(xiàng)目,項(xiàng)目中controller方法將成千上萬,使用上述方式將造成整個項(xiàng)目難以維護(hù)。那在真實(shí)的項(xiàng)目開發(fā)中是什么樣子的呢?

在真實(shí)的項(xiàng)目開發(fā)中,無論是哪種方法,我們都會定義一個統(tǒng)一的返回結(jié)果。方案如下:

這樣前端只需要按照統(tǒng)一格式的返回結(jié)果進(jìn)行解析(僅一種解析方案),就可以拿到數(shù)據(jù)。

統(tǒng)一的返回結(jié)果使用類來描述,在這個結(jié)果中包含:

  • 響應(yīng)狀態(tài)碼:當(dāng)前請求是成功,還是失敗
  • 狀態(tài)碼信息:給頁面的提示信息
  • 返回的數(shù)據(jù):給前端響應(yīng)的數(shù)據(jù)(字符串、對象、集合)

定義在一個實(shí)體類Result來包含以上信息。代碼如下:

public class Result {
    private Integer code;//響應(yīng)碼,1 代表成功; 0 代表失敗
    private String msg;  //響應(yīng)碼 描述字符串
    private Object data; //返回的數(shù)據(jù)

    public Result() { }
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    //增刪改 成功響應(yīng)(不需要給前端返回?cái)?shù)據(jù))
    public static Result success(){
        return new Result(1,"success",null);
    }
    //查詢 成功響應(yīng)(把查詢結(jié)果做為返回?cái)?shù)據(jù)響應(yīng)給前端)
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
    //失敗響應(yīng)
    public static Result error(String msg){
        return new Result(0,msg,null);
    }
}

改造后的Controller:統(tǒng)一返回Result

@RestController
public class ResponseController { 
    //響應(yīng)統(tǒng)一格式的結(jié)果
    @RequestMapping("/hello")
    public Result hello(){
        System.out.println("Hello World ~");
        //return new Result(1,"success","Hello World ~");
        return Result.success("Hello World ~");
    }

    //響應(yīng)統(tǒng)一格式的結(jié)果
    @RequestMapping("/getAddr")
    public Result getAddr(){
        Address addr = new Address();
        addr.setProvince("廣東");
        addr.setCity("深圳");
        return Result.success(addr);
    }

    //響應(yīng)統(tǒng)一格式的結(jié)果
    @RequestMapping("/listAddr")
    public Result listAddr(){
        List<Address> list = new ArrayList<>();

        Address addr = new Address();
        addr.setProvince("廣東");
        addr.setCity("深圳");

        Address addr2 = new Address();
        addr2.setProvince("陜西");
        addr2.setCity("西安");

        list.add(addr);
        list.add(addr2);
        return Result.success(list);
    }
}

總結(jié) 

到此這篇關(guān)于SpringBoot接受前臺參數(shù)的6種方式以及統(tǒng)一響應(yīng)的文章就介紹到這了,更多相關(guān)SpringBoot接受前臺參數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java BeanMap實(shí)現(xiàn)Bean與Map的相互轉(zhuǎn)換

    Java BeanMap實(shí)現(xiàn)Bean與Map的相互轉(zhuǎn)換

    這篇文章主要介紹了利用BeanMap進(jìn)行對象與Map的相互轉(zhuǎn)換,通過net.sf.cglib.beans.BeanMap類中的方法來轉(zhuǎn)換,效率極高,本文給大家分享實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2022-11-11
  • IntelliJ Idea SpringBoot 數(shù)據(jù)庫增刪改查實(shí)例詳解

    IntelliJ Idea SpringBoot 數(shù)據(jù)庫增刪改查實(shí)例詳解

    SpringBoot 是 SpringMVC 的升級,對于編碼、配置、部署和監(jiān)控,更加簡單。這篇文章主要介紹了IntelliJ Idea SpringBoot 數(shù)據(jù)庫增刪改查實(shí)例,需要的朋友可以參考下
    2018-02-02
  • Spring boot集成swagger2生成接口文檔的全過程

    Spring boot集成swagger2生成接口文檔的全過程

    這篇文章主要給大家介紹了關(guān)于Spring boot集成swagger2生成接口文檔的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • SpringMVC基于配置的異常處理器

    SpringMVC基于配置的異常處理器

    這篇文章主要為大家介紹了SpringMVC基于配置的異常處理器,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Java Spring boot 2.0 跨域問題的解決

    Java Spring boot 2.0 跨域問題的解決

    本篇文章主要介紹了Java Spring boot 2.0 跨域問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 基于SSM+Shiro+Bootstrap實(shí)現(xiàn)用戶權(quán)限管理系統(tǒng)

    基于SSM+Shiro+Bootstrap實(shí)現(xiàn)用戶權(quán)限管理系統(tǒng)

    這篇文章主要介紹了基于SSM+Shiro實(shí)現(xiàn)一個用戶權(quán)限管理系統(tǒng),每位用戶只可訪問指定的頁面,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,快跟隨小編一起學(xué)習(xí)吧
    2021-12-12
  • 簡單聊一聊Spring中Bean別名的處理原理

    簡單聊一聊Spring中Bean別名的處理原理

    今天來和小伙伴們聊一聊 Spring 中關(guān)于 Bean 別名的處理邏輯,別名,顧名思義就是給一個 Bean 去兩個甚至多個名字,整體上來說,在 Spring 中,有兩種不同的別名定義方式,感興趣的小伙伴跟著小編一起來看看吧
    2023-09-09
  • 如何使用新方式編寫Spring MVC接口

    如何使用新方式編寫Spring MVC接口

    這篇文章主要介紹了如何使用新方式編寫Spring MVC接口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot關(guān)閉druid的頁面和添加密碼驗(yàn)證方式

    SpringBoot關(guān)閉druid的頁面和添加密碼驗(yàn)證方式

    這篇文章主要介紹了SpringBoot關(guān)閉druid的頁面和添加密碼驗(yàn)證方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java使用spring實(shí)現(xiàn)讀寫分離的示例代碼

    java使用spring實(shí)現(xiàn)讀寫分離的示例代碼

    本篇文章主要介紹了java使用spring實(shí)現(xiàn)讀寫分離的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論