【SSM - SpringMVC篇】08 - SpringMVC的方法返回值,fastjson使用,json和javabean的轉換

2020-10-17 21:00:14

描述

  我們知道,瀏覽器向伺服器發起請求,攜帶資料,請求將其交給後臺Controller等處理,處理完成之後,我們需要將處理結果和頁面等內容返回到瀏覽器,但是這過程是怎麼做到的呢,這篇文章描述的是後臺向前臺頁面傳輸資料的方法

處理器返回值的型別

1. ModelAndView返回資料和檢視

  ModelAndView是SPringMVC提供模型檢視,在前後端不分離的情況下,這種用法是最多的,但是前後端分離後,以json資料格式為主。
  ModelAndView可以拆分理解,Model就是資料模型,View就是頁面檢視,就是同時包含模型和檢視。

主要使用方法:

  1. 通過addObject(key,value)設定資料,返回給前臺
  2. 通過setViewName()設定邏輯檢視,就是需要跳轉返回到的頁面路徑(在SpringMVC中配合檢視解析器使用【檢視解析器自動加前字尾】,只要寫名稱就行)
@Controller
public class ReturnValueController {
    //public 返回值型別 方法名(引數型別 引數名){}
    //通過path存取當前方法,且請求方式為get/post方式
    @RequestMapping(path="ModelAndView.action",method = {RequestMethod.POST,RequestMethod.GET})
    public ModelAndView testModelAndView(){//
        User user= new Person(null,"striveday","123456");

        //使用ModelAndView實現請求轉發
        ModelAndView mv = new ModelAndView();
        mv.addObject("user",user);
        mv.setViewName("ModelAndView");//檢視解析器設定:字首+邏輯檢視名+字尾
        return mv;
    }
}

邏輯檢視和物理檢視概念:

物理檢視 :是指真正的檔案路徑地址,在這裡就是字首+邏輯檢視+字尾( /WEB-INF/jsp/ModelAndView.jsp)
邏輯檢視: 頁面的名稱叫邏輯檢視,並不是真正的頁面地址,但是可以由檢視解析器進行拼接,得到真正的頁面地址,即物理檢視。
物理檢視 = 字首+邏輯檢視+字尾


2. String返回邏輯檢視

返回頁面名稱,也就是需要返回的頁面路徑(邏輯名)。
用這種方式也是可以進行攜帶資料(Model
  Model可以用來向頁面傳遞引數,通過在方法引數上注入Model,來實現攜帶資料。

model.addAttribute(「key」, value);

案例:

  @RequestMapping(path="testString.action",method = {RequestMethod.GET,RequestMethod.POST})
    public String testString(Model model){
        //Model 可以設定資料,自動由檢視解析器帶到頁面
        model.addAttribute("data","String返回值");
        return "StringSuccess"; //邏輯檢視 檔名
    }
  • 在Spring MVC框架中,控制器類中處理方法的return語句預設就是請求轉發實現,實現的是轉發到檢視。
  • ModelAndView這些都是通過請求轉發實現的。

String返回可以設定請求轉發和重定向

forward:指令,用於請求轉發
redirect :指令,用於重定向

forward 指令:後面接物理檢視
redirect 指令:後面接專案存取路徑+物理檢視

【注意1***】forward:指令和redirect :指令,檢視解析器是不對指令後面的內容拼接字首和字尾的
【注意2】指令也可以存取控制器方法

2.1 String返回值,通過forward請求轉發
@RequestMapping(path="testForward .action",method = {RequestMethod.GET,RequestMethod.POST})
    public String testForward (Model model){
        //Model 可以設定資料,自動由檢視解析器帶到頁面
        model.addAttribute("data","wHelloWord");
        return "forward:/WEB-INF/jsp/success.jsp"; //
    }
2.2 String返回值,通過redirect重定向

重定向是不能存取WEB-INF

@RequestMapping(path="testRedirect.action",method = {RequestMethod.GET,RequestMethod.POST})
    public String testRedirect(Model model){
        //Model 可以設定資料,自動由檢視解析器帶到頁面
        model.addAttribute("data","wHelloWord");
        //return "redirect:http://www.taobao.com"; //存取淘寶
        //return "redirect:success.jsp"; //重定向存取
        return "redirect:testForward .action"; //存取上面那個重定向方法,指令可以存取控制器方法
    }


3. void返回值,不返回【springmvc不推薦使用】

  void返回值,進行頁面跳轉就是用以前的請求轉發和重定向。只是以前重定向無法傳輸資料,現在可以通過Model來進行資料傳輸。關於請求轉發實現可以看這個:請求轉發和重定向程式碼實現

@RequestMapping(path="testVoid.action",method = {RequestMethod.GET,RequestMethod.POST})
    public void testVoid(HttpServletRequest req, HttpServletResponse resp)throws Exception{
        //請求轉發
        req.setAttribute("name","請求轉發");
        req.getRequestDispatcher("testVoid.jsp").forward(req,resp);
        //response.sendRedirect(request.getContextPath()+"/testVoid.jsp");//重定向
    }


4. json返回值為json資料,fastjson使用【****】

  現在都要求前後端分離,而前後端分離的關鍵是使用ajax請求,那麼ajax請求基本都用json進行資料傳遞。
  SpringMVC預設使用Jackson進行資料轉換,這個我前面有寫過,想了解的看這個:
===》 Jackson使用,json資料轉換

  好了,不打廣告了哈哈哈,我們今天用的不是自帶的Jackson哦,所以好好看吧。
  今天介紹的是阿里巴巴的fastjson,進行資料與json資料格式之間的轉換。

=============== 分隔線 =====》》》》》》》》》
接下來對的是重點!!!
這裡有兩個很重要的註解:@ResponseBody@RequestBody
fastjson中我們需要用到這兩個註解

@ResponseBody@RequestBody

  1. @ResponseBody註解,用於方法返回值轉json資料格式

註解加在方法上,SpringMVC可以【自動地】將方法的返回物件轉為json資料,傳送給頁面進行展示。
看關鍵字自動的,敲黑板,很重要,這就是我們使用它的原因,畢竟,誰喜歡寫程式碼弄來弄去還有bug呢,自動完成,贊!

  1. @RequestBody註解,用於方法引數轉json資料格式

在方法形參的前邊加上@RequestBody註解,該註解可以自動解析頁面傳送過來的json格式資料,解析完之後,自動的將json中的資料封裝到方法形參物件裡面(set方法)。

好了來實戰吧

4.1 環境準備(依賴)

     <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.74</version>
      </dependency>

4.2 基礎測試fastjson

拿別人的東西總要先測試測試吧,萬一有bug呢,雖然這是阿里巴巴的並且有賊多人使用,但是養成這個習慣,準沒錯!【學會沒嘿嘿】
先建立一個小物件(我也想)

public class Person {
    private int id;
    private String username;
    private String password;
    //省略set/get方法,但是需要有
}

建立測試類,測試javabean轉json和json轉javabean

4.2.1 測試javabean物件轉json資料格式

JSON.toJSONString(javabean物件):實現將javabean物件轉json資料格式。

import com.alibaba.fastjson.JSON;
public class TestFastJson {
    @Test
    public void  test01(){
        Person p = new Person(1,"striveday","GF123456");
        String json  =  JSON.toJSONString(p);//呼叫靜態方法toJSONString,引數傳入物件 ,將物件轉成json
        System.out.println(json);
    }
}

執行結果:
{「id」:1,「password」:「GF123456」,「username」:「striveday」}
轉換成功!

4.2.2 測試json資料格式轉javabean物件

JSON.parseObject(json資料, javabean的class):實現將json資料格式轉換為javabean物件。

@Test
    public void  test02(){
        String json = "{\"id\":1,\"password\":\"GF123456\",\"username\":\"striveday\"}";//copy剛剛執行結果哈
        //json轉javaBean,參1:json  參2:物件class類
        Person p = JSON.parseObject(json,Person.class);
        System.out.println(p);
    }

執行結果
Person{id=1, username=‘striveday’, password=‘GF123456’, city=‘null’, birthday=null, birthday2=null}
這裡需要重寫javabean的toString()方法,不然輸出的是雜湊值喲。

好的,妥妥的沒問題,測一下也不花多少時間嘛,這個習慣總時好的!

4.3 @ResponseBody註解

@ResponseBody註解用於方法返回值轉json資料格式
該註解加在方法上,SpringMVC可以【自動地】將方法的返回物件轉為json資料,傳送給頁面進行展示。

@ResponseBody註解用於將Controller的方法返回的物件,通過適當的HttpMessageConverter轉換為指定要求格式後,寫入到Response物件的body資料區。(一般是json、xml等資料格式)

 @RequestMapping(path = "testResponseBody.action",method = {RequestMethod.POST,RequestMethod.GET})
    @ResponseBody 
    public Object testResponseBody(){
        Person p1 = new Person(1,"striveday","GF123456");
        Person p2 = new Person(2,"studyday","GF123456");
        List<Person> list = new ArrayList<Person>();
        list.add(p1);
        list.add(p2);
        return list; //springmvc自動地將list使用ObjectMapper轉成json
    }

4.4 @RequestBody註解

@RequestBody註解,用於方法引數轉json資料格式
在方法形參的前邊加上@RequestBody註解,該註解可以自動解析頁面傳送過來的json格式資料,解析完之後,自動的將json中的資料封裝到方法形參物件裡面(set方法)

其實 @RequestBody註解就是讀取request請求中的body資料,然後使用系統預設設定的HttpMessageConverter進行解析,再把相應的資料繫結到請求作用域中傳遞給後臺controller方法,然後引數自動繫結到Controller方法的引數上(實現方法返回值物件轉json資料格式,所以頁面name值和controller形式引數名稱要相同)

 @RequestMapping(path = "testRequestBody.action",method = {RequestMethod.POST,RequestMethod.GET})
    public ModelAndView  testRequestBody(@RequestBody  Person person){//
       System.out.println("object:"+person);
       return null;
    }