我們知道,瀏覽器向伺服器發起請求,攜帶資料,請求將其交給後臺Controller
等處理,處理完成之後,我們需要將處理結果和頁面等內容返回到瀏覽器,但是這過程是怎麼做到的呢,這篇文章描述的是後臺向前臺頁面傳輸資料的方法。
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)
邏輯檢視: 頁面的名稱叫邏輯檢視,並不是真正的頁面地址,但是可以由檢視解析器進行拼接,得到真正的頁面地址,即物理檢視。
物理檢視 = 字首+邏輯檢視+字尾
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】指令也可以存取控制器方法
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"; //
}
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"; //存取上面那個重定向方法,指令可以存取控制器方法
}
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");//重定向
}
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方法)。
好了來實戰吧
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.74</version>
</dependency>
fastjson
拿別人的東西總要先測試測試吧,萬一有bug呢,雖然這是阿里巴巴的並且有賊多人使用,但是養成這個習慣,準沒錯!【學會沒嘿嘿】
先建立一個小物件(我也想)
public class Person {
private int id;
private String username;
private String password;
//省略set/get方法,但是需要有
}
建立測試類,測試javabean轉json和json轉javabean
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」}
轉換成功!
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()方法,不然輸出的是雜湊值喲。
好的,妥妥的沒問題,測一下也不花多少時間嘛,這個習慣總時好的!
@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
}
@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;
}