文章目錄
- 描述
- 處理器回傳值的型別
- 1. `ModelAndView`回傳資料和視圖
- 2. `String`回傳邏輯視圖
- `String`回傳可以設定請求轉發和重定向
- 2.1 `String`回傳值,通過`forward `請求轉發
- 2.2 `String`回傳值,通過`redirect `重定向
- 3. `void`回傳值,不回傳【springmvc不推薦使用】
- 4. `json`回傳值為json資料,`fastjson`使用【****】
- `@ResponseBody`和`@RequestBody`
- 4.1 環境準備(依賴)
- 4.2 基礎測驗`fastjson`
- 4.2.1 測驗javabean物件轉json資料格式
- 4.2.2 測驗json資料格式轉javabean物件
- 4.3 `@ResponseBody`注解
- 4.4 `@RequestBody`注解
描述
??我們知道,瀏覽器向服務器發起請求,攜帶資料,請求將其交給后臺Controller等處理,處理完成之后,我們需要將處理結果和頁面等內容回傳到瀏覽器,但是這程序是怎么做到的呢,這篇文章描述的是后臺向前臺頁面傳輸資料的方法,
處理器回傳值的型別
1. ModelAndView回傳資料和視圖
??ModelAndView是SPringMVC提供模型視圖,在前后端不分離的情況下,這種用法是最多的,但是前后端分離后,以json資料格式為主,
??ModelAndView可以拆分理解,Model就是資料模型,View就是頁面視圖,就是同時包含模型和視圖,
主要使用方法:
- 通過
addObject(key,value)設定資料,回傳給前臺 - 通過
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
@ResponseBody注解,用于方法回傳值轉json資料格式注解加在方法上,SpringMVC可以【自動地】將方法的回傳物件轉為json資料,發送給頁面進行展示,
看關鍵字自動的,敲黑板,很重要,這就是我們使用它的原因,畢竟,誰喜歡寫代碼弄來弄去還有bug呢,自動完成,贊!
@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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/177205.html
標籤:其他
上一篇:【Core Java系列2】泣血整理!Java泛型最全歸納,你知道的和不知道的都能找到
下一篇:Java刷題常用API整合
