天天看點

SpringMVC的Controller控制器傳回值詳解

簡介

對于springMVC處理方法支援支援一系列的傳回方式:

  1. ModelAndView
  2. Model
  3. ModelMap
  4. Map
  5. View
  6. String
  7. Void

具體介紹

詳細介紹每一個傳回類型的各個特點;

ModelAndView

1

@RequestMapping

(method=RequestMethod.GET)

2

public

ModelAndView index(){

3

ModelAndView modelAndView = 

new

ModelAndView(

"/user/index"

);

4

modelAndView.addObject(

"xxx"

"xxx"

);

5

return

modelAndView;

6

}

通過ModelAndView構造方法可以指定傳回的頁面名稱,也可以通過setViewName()方法跳轉到指定的頁面 ,

使用addObject()設定需要傳回的值,addObject()有幾個不同參數的方法,可以預設和指定傳回對象的名字。

調用addObject()方法将值設定到一個名為ModelMap的類屬性,ModelMap是LinkedHashMap的子類,

具體請看類。

1

@RequestMapping

(method=RequestMethod.GET)

2

public

ModelAndView index(){

3

ModelAndView modelAndView = 

new

ModelAndView();

4

modelAndView.addObject(

"xxx"

"xxx"

);

5

modelAndView.setViewName(

"/user/index"

);

6

return

modelAndView;

7

}

對于ModelAndView類的屬性和方法

SpringMVC的Controller控制器傳回值詳解

Model

一個模型對象,主要包含spring封裝好的model和modelMap,以及Java.util.Map,當沒有視圖傳回的時候視圖名稱将由requestToViewNameTranslator決定;Model 是一個接口, 其實作類為ExtendedModelMap,繼承了ModelMap類。

ModelMap

待續

Map

1

@RequestMapping

(method=RequestMethod.GET)

2

public

Map<String, String> index(){

3

Map<String, String> map = 

new

HashMap<String, String>();

4

map.put(

"1"

"1"

);

5

//map.put相當于request.setAttribute方法

6

return

map;

7

}

PS:響應的view應該也是該請求的view。等同于void傳回。

Java代碼  

  1. @RequestMapping("/demo2/show")  
  2.     publicMap<String, String> getMap() {  
  3.         Map<String, String> map = newHashMap<String, String>();  
  4.         map.put("key1", "value-1");  
  5.         map.put("key2", "value-2");  
  6.         returnmap;  
  7.     }  

在jsp頁面中可直通過${key1}獲得到值, map.put()相當于request.setAttribute方法。

寫例子時發現,key值包括 - . 時會有問題.

View

這個時候如果在渲染頁面的過程中模型的話,就會給處理器方法定義一個模型參數,然後在方法體裡面往模型中添加值。可以傳回pdf excel等,暫時沒詳細了解。

String

對于String的傳回類型,筆者是配合Model來使用的;

1

@RequestMapping

(method = RequestMethod.GET)

2

public

String index(Model model) {

3

String retVal = 

"user/index"

;

4

List<User> users = userService.getUsers();

5

model.addAttribute(

"users"

, users);

6

7

return

retVal;

8

}

或者通過配合@ResponseBody來将内容或者對象作為HTTP響應正文傳回(适合做即時校驗);

1

@RequestMapping

(value = 

"/valid"

, method = RequestMethod.GET)

2

public

@ResponseBody

3

String valid(

@RequestParam

(value = 

"userId"

, required = 

false

) Integer userId,

4

@RequestParam

(value = 

"logName"

) String strLogName) {

5

return

String.valueOf(!userService.isLogNameExist(strLogName, userId));

6

7

}

ps:傳回字元串表示一個視圖名稱,這個時候如果需要在渲染視圖的過程中需要模型的話,就可以給處理器添加一個模型參數,然後在方法體往模型添加值就可以了,

String 指定傳回的視圖頁面名稱,結合設定的傳回位址路徑加上頁面名稱字尾即可通路到。

注意:如果方法聲明了注解@ResponseBody ,則會直接将傳回值輸出到頁面。

例如:

Java代碼  

  1. @RequestMapping(value = "/something", method = RequestMethod.GET)  
  2. @ResponseBody  
  3. publicString helloWorld()  {  
  4. return"Hello World";  
  5. }  

上面的結果會将文本"Hello World "直接寫到http響應流。

Java代碼  

  1. @RequestMapping("/welcome")  
  2. publicString welcomeHandler() {  
  3.   return"center";  
  4. }  

傳回字元串代表的意義:

1):字元串代表邏輯視圖名

真實的通路路徑=“字首”+邏輯視圖名+“字尾”

注意:如果傳回的String代表邏輯視圖名的話,那麼Model的傳回方式如下:

   public String testController(Model model){

model.addAttribute(attrName,attrValue);//相當于ModelAndView的addObject方法

return "邏輯視圖名";

   }

2):代表redirect重定向

redirect的特點和servlet一樣,使用redirect進行重定向那麼位址欄中的URL會發生變化,同時不會攜帶上一次的request

案例:

public String testController(Model model){

return "redirect:path";//path代表重定向的位址

}

3):代表forward轉發

通過forward進行轉發,位址欄中的URL不會發生改變,同時會将上一次的request攜帶到寫一次請求中去

案例:

public String testController(Model model){

return "forward:path";//path代表轉發的位址

}

詳細例子參考:http://blog.csdn.net/u011001084/article/details/52847174

Void

當傳回類型為Void的時候,則響應的視圖頁面為對應着的通路位址

01

@Controller

02

@RequestMapping

(value=

"/type"

)

03

public

class

TypeController 

extends

AbstractBaseController{

04

05

@RequestMapping

(method=RequestMethod.GET)

06

public

void

index(){

07

ModelAndView modelAndView = 

new

ModelAndView();

08

modelAndView.addObject(

"xxx"

"xxx"

);

09

}

10

}

傳回的結果頁面還是:/type

PS:這個時候我們一般是将傳回結果寫在了HttpServletResponse 中了,如果沒寫的話,spring就會利用RequestToViewNameTranslator 來傳回一個對應的視圖名稱。如果這個時候需要模型的話,處理方法和傳回字元串的情況是相同的。

小結:

1.使用 String 作為請求處理方法的傳回值類型是比較通用的方法,這樣傳回的邏輯視圖名不會和請求 URL 綁定,具有很大的靈活性,而模型資料又可以通過 ModelMap 控制。

2.使用void,map,Model 時,傳回對應的邏輯視圖名稱真實url為:prefix字首+視圖名稱 +suffix字尾組成。

3.使用String,ModelAndView傳回視圖名稱可以不受請求的url綁定,ModelAndView可以設定傳回的視圖名稱。

Model model,HttpServletRequest request, ModelMap map聲明變量

request.getSession().setAttribute("test", "haiwei2Session");

request.setAttribute("test", "haiwei1request"); 

map.addAttribute("test", "haiweiModelMap");

model.addAttribute("test", "haiweiModel");

我通過${test}這個方式取值,優先取Model和ModelMap的,Model和ModelMap是同一個東西,誰最後指派的就取誰的,然後是request,最後是從session中擷取

繼續閱讀