第五章: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