三种方式实现作用域放值
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 }