三種方式實現作用域放值
springMVC處理請求過程中,往作用域中放值有以下三種方式:
總結:根據ModelAndView源碼調試,不管用以下哪種方式,都會把Model數據和View數據封裝到一個ModelAndView中
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.ui.Model; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.servlet.ModelAndView; 7 8 import java.util.Map; 9 10 /** 11 * 三種方式實現作用域放值 12 */ 13 @Controller 14 public class TestController { 15 16 /** 17 * 第一種:返回值為ModelAndView 18 * @return 19 */ 20 @RequestMapping("/hello") 21 public ModelAndView hello(){ 22 ModelAndView mav = new ModelAndView(); 23 mav.addObject("msg","spring mvc"); 24 mav.setViewName("success"); 25 return mav; 26 } 27 28 /** 29 * 第二種:形參為Map 30 * @param map 31 * @return 32 */ 33 @RequestMapping("/hello2") 34 public String hello2(Map<String,Object> map){ 35 map.put("msg","spring mvc2"); 36 return "success"; 37 } 38 39 /** 40 * 第三種:形參為Model 41 * @param model 42 * @return 43 */ 44 @RequestMapping("/hello3") 45 public String hello3(Model model){ 46 model.addAttribute("msg","spring mvc3"); 47 return "success"; 48 } 49
請求轉發和重定向
相同點
都是web開發中資源跳轉的方式。
不同點
轉發:是服務器內部的跳轉,瀏覽器的地址欄不會發生變化。從一個頁面到另一個頁面的跳轉還是同一個請求,也即是只有一個請求響應。可以通過request域來傳遞對象。
重定向:是瀏覽器自動發起對跳轉目標的請求,瀏覽器的地址欄會發生變化。從一個頁面到另一個頁面的跳轉是不同的請求,也即是有兩個或兩個以上的不同的請求的響應。無法通過request域來傳遞對象。可以跳轉到任意服務器,可以用在系統間的跳轉。
視圖解析器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> 6 7 <context:component-scan base-package="com.iwakan.controller"/> 8 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 9 <property name="prefix" value="/WEB-INF/view/"/> 10 <property name="suffix" value=".jsp"/> 11 </bean> 12 </beans>
- forward:請求轉發(去前后綴)
- redirect:重定向
基於返回ModelAndView對象
mv.setViewName("str");
- str=”forward : 路徑” 請求轉發到一個jsp中
- str=”forward : controller的映射” 請求轉發到一個controller方法中
- str=”redirect: 路徑” 請求轉發到一個非WEB-INF的jsp
常用:
- str=”redirect : controller的映射” 重定向到一個controller方法中
- str=”XXX” 根據前后綴,請求轉發到 前綴/XXX.后綴
1:請求轉發到jsp(默認的)
package com.iwakan.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; /** * 1.forward:xxx.jsp * ①經過視圖解析器的:直接mv.setViewName("xxx"),視圖解析器會自動拼接上前綴和后綴的,例如:/WEB-INF/view/xxx.jsp * ②不經過視圖解析器:字節拼接跳轉的路徑:例如跳轉到/WEB-INF/view2/helloForward.jsp * 2.forward:controller */ @Controller public class TestController2 { /** * 請求轉發到jsp(默認的) */ @RequestMapping(value = "/testForward1", method = RequestMethod.POST) public ModelAndView testForwardToJsp() { ModelAndView mv = new ModelAndView(); mv.addObject("msg", "forward");//設置參數 //請求轉發到/WEB-INF/view/success.jsp mv.setViewName("success");//默認加入前后綴 return mv; } /** * 訪問非視圖解析器的視圖時,用forward */ @RequestMapping(value = "/testForward2", method = RequestMethod.POST) public ModelAndView testForwardToJsp2() { ModelAndView mv = new ModelAndView(); //因為視圖解析器里的前綴是寫死的【/WEB-INF/view/】,所以要到/WEB-INF/view2/下的頁面需要用到轉發, // 也可以將視圖解析器的前綴改為/WEB-INF/,其他變換的部分自己拼接。例如下面的代碼可以寫成【mv.setViewName("/view2/helloForward")】 mv.setViewName("forward:/WEB-INF/view2/helloForward.jsp"); //不添加前后綴 return mv; } }
2:請求轉發到controller(必須用forward)
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * 1.forward:xxx.jsp 10 * ①經過視圖解析器的:直接mv.setViewName("xxx"),視圖解析器會自動拼接上前綴和后綴的,例如:/WEB-INF/view/xxx.jsp 11 * ②不經過視圖解析器:字節拼接跳轉的路徑:例如跳轉到/WEB-INF/view2/helloForward.jsp 12 * 2.forward:controller 13 */ 14 @Controller 15 public class TestController2 { 16 17 /** 18 * 請求轉發到controller(必須用forward) 19 */ 20 @RequestMapping(value = "/testForward3", method = RequestMethod.POST) 21 public ModelAndView testForwardToController() { 22 ModelAndView mv = new ModelAndView(); 23 mv.setViewName("forward:testForward1"); 24 return mv; 25 } 26 27 }
3:重定向到controller
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.ui.Model; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 import org.springframework.web.servlet.ModelAndView; 7 8 import java.util.Map; 9 10 @Controller 11 public class TestController { 12 13 @RequestMapping("/hello2") 14 public String hello2(Map<String,Object> map){ 15 map.put("msg","spring mvc2"); 16 return "success"; 17 } 18 19 }
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * 1.forward:xxx.jsp 請求轉發到一個jsp中 10 * ①經過視圖解析器的:直接mv.setViewName("xxx"),視圖解析器會自動拼接上前綴和后綴的,例如:/WEB-INF/view/xxx.jsp 11 * ②不經過視圖解析器:字節拼接跳轉的路徑:例如跳轉到/WEB-INF/view2/helloForward.jsp 12 * 2.forward:controller 請求轉發到一個controller方法中 13 * 14 * 3.redirect:xxx.jsp 請求重定向到一個非WEB-INF的jsp 15 * 16 * 4.redirect:controller 重定向到一個controller方法中 17 */ 18 @Controller 19 public class TestController2 { 20 21 /** 22 * 重定向到Controller 23 */ 24 @RequestMapping(value = "/testRedirect1",method = RequestMethod.POST) 25 public ModelAndView testRedirectToController() { 26 ModelAndView mv = new ModelAndView(); 27 mv.setViewName("redirect:hello2"); 28 return mv; 29 } 30 }
4:重定向到jsp
1 package com.iwakan.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.RequestMethod; 6 import org.springframework.web.servlet.ModelAndView; 7 8 /** 9 * 1.forward:xxx.jsp 請求轉發到一個jsp中 10 * ①經過視圖解析器的:直接mv.setViewName("xxx"),視圖解析器會自動拼接上前綴和后綴的,例如:/WEB-INF/view/xxx.jsp 11 * ②不經過視圖解析器:字節拼接跳轉的路徑:例如跳轉到/WEB-INF/view2/helloForward.jsp 12 * 2.forward:controller 請求轉發到一個controller方法中 13 * 14 * 3.redirect:xxx.jsp 請求重定向到一個非WEB-INF的jsp 15 * 16 * 4.redirect:controller 重定向到一個controller方法中 17 */ 18 @Controller 19 public class TestController2 { 20 21 /** 22 * 重定向到非【WEB-INF】下的jsp,因為/WEB-INF下的頁面不能直接訪問,只能通過轉發。 23 */ 24 @RequestMapping(value = "/testRedirect2", method = RequestMethod.POST) 25 public ModelAndView testRedirectToJsp() { 26 ModelAndView mv = new ModelAndView(); 27 mv.setViewName("redirect:/helloRedirect.jsp"); 28 return mv; 29 } 30 }