具體介紹
詳細介紹每一個返回類型的各個特點;
ModelAndView
1 |
@RequestMapping (method=RequestMethod.GET) |
2 |
public ModelAndView
index(){ |
3 |
ModelAndView
modelAndView = new ModelAndView( "/user/index" ); |
4 |
modelAndView.addObject( "xxx" , "xxx" ); |
通過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" ); |
對於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>(); |
PS:響應的view應該也是該請求的view。等同於void返回。
Java代碼
- @RequestMapping("/demo2/show")
- publicMap<String, String> getMap() {
- Map<String, String> map = newHashMap<String, String>();
- map.put("key1", "value-1");
- map.put("key2", "value-2");
- returnmap;
- }
在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); |
或者通過配合@ResponseBody來將內容或者對象作爲HTTP響應正文返回(適合做即時校驗);
1 |
@RequestMapping (value
= "/valid" ,
method = RequestMethod.GET) |
3 |
String
valid( @RequestParam (value
= "userId" ,
required = false )
Integer userId, |
4 |
@RequestParam (value
= "logName" )
String strLogName) { |
5 |
return String.valueOf(!userService.isLogNameExist(strLogName,
userId)); |
ps:返回字符串表示一個視圖名稱,這個時候如果需要在渲染視圖的過程中需要模型的話,就可以給處理器添加一個模型參數,然後在方法體往模型添加值就可以了,
String 指定返回的視圖頁面名稱,結合設置的返回地址路徑加上頁面名稱後綴即可訪問到。
注意:如果方法聲明瞭註解@ResponseBody ,則會直接將返回值輸出到頁面。
例如:
Java代碼
- @RequestMapping(value = "/something", method = RequestMethod.GET)
- @ResponseBody
- publicString helloWorld() {
- return"Hello World";
- }
上面的結果會將文本"Hello World "直接寫到http響應流。
Java代碼
- @RequestMapping("/welcome")
- publicString welcomeHandler() {
- return"center";
- }
返回字符串代表的意義:
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的時候,則響應的視圖頁面爲對應着的訪問地址
02 |
@RequestMapping (value= "/type" ) |
03 |
public class TypeController extends AbstractBaseController{ |
05 |
@RequestMapping (method=RequestMethod.GET) |
07 |
ModelAndView
modelAndView = new ModelAndView(); |
08 |
modelAndView.addObject( "xxx" , "xxx" ); |
返回的結果頁面還是:/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中獲取