springMVC controller中方法的返回值類型

具體介紹

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

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類的屬性和方法

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中獲取

發佈了60 篇原創文章 · 獲贊 247 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章