第五章:ModelAndView的三種實現作用域放置以及SpringMVC的轉發和重定向


三種方式實現作用域放值

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM