大家好,我是路人,这是 SpringMVC 系列第 29 篇。
request.getRequestDispatcher(path).forward(request,response);
接口需满足下面这 3 条的会被 SpringMVC 当做转发进行处理
forward:转发的路径
案例代码如下,当访问/forward/test1
的时候,返回值以forward:
开头,SpringMVC 会将请求转发到/forward/test2
@RequestMapping("/forward/test1")
public String test1() {
return "forward:/forward/test2";
}
@RequestMapping(value = "/forward/test2", produces = "text/html;charset=UTF-8")
@ResponseBody
public String test2() {
return "我是test2";
}
测试效果:浏览器中访问/forward/test1
输出
response.sendRedirect(url);
接口需满足下面这 3 条的会被 SpringMVC 当做转发进行处理
redirect:重定向的路径
案例代码如下,当访问/redirect/test1
的时候,返回值以redirect:
开头,SpringMVC 会将请求转发到/redirect/test2
@RequestMapping("/redirect/test1")
public String test1() {
return "redirect:/redirect/test2";
}
@RequestMapping(value = "/redirect/test2", produces = "text/html;charset=UTF-8")
@ResponseBody
public String test2() {
return "我是test2";
}
测试效果:浏览器中访问/redirect/test1
,效果如下,浏览器地址栏变成/redirect/test2
了
直接在重定向的 url 中直接拼接参数,如redirect:地址?name=路人&age=30
,如
@RequestMapping("/redirect/test1")
public String test1() {
return "redirect:/redirect/test2?name=路人&age=30";
}
RedirectAttributes
的参数redirectAttributes.addAttribute("参数","值")
,放入重定向需要传递的参数redirectAttributes.addAttribute
丢进去的参数,SpringMVC 重定向的时候,会自动将这些参数以?参数1=值1&参数2=值2
拼接到重定向的地址上,类似于上面的方式 1。访问接口 test3,会被重定向到 test4,顺便传递了 2 个参数
@RequestMapping("/redirect/test3")
public String test3(RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("name", "路人");
redirectAttributes.addAttribute("age", 30);
return "redirect:/redirect/test4";
}
@RequestMapping(value = "/redirect/test4", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String, Object> test4(@RequestParam("name") String name, @RequestParam("age") int age) {
Map<String, Object> result = new LinkedHashMap<>();
result.put("name", name);
result.put("age", age);
return result;
}
浏览器中访问/redirect/test3
接口,会被重定向到/redirect/test4
,效果如下,test3 方法中丢到addAttribute
中的 2 个参数name
和age
,被自动拼接到地址后面了。
上面我们使用的是RedirectAttributes
的addAttribute
放入参数,这次我们要使用另外一个方法addFlashAttribute
放入重定向需要传递的参数,具体有什么区别呢,请向下看。
RedirectAttributes
的参数redirectAttributes.addFlashAttribute("参数","值")
,这种方式传递的参数是被隐藏的,不会被拼接在地址后,内部是通过 session 共享数据来实现的。org.springframework.ui.Model
或者org.springframework.ui.ModelMap
类型的参数来接收传递过来的参数,调用model.getAttribute("参数名")
可以获取传递过来的参数访问接口 test5,会被重定向到 test6,顺便传递了 2 个参数
@RequestMapping("/redirect/test5")
public String test5(RedirectAttributes redirectAttributes) {
redirectAttributes.addFlashAttribute("name", "路人");
redirectAttributes.addFlashAttribute("age", 30);
return "redirect:/redirect/test6";
}
/**
* 需要使用一个org.springframework.ui.Model或者org.springframework.ui.ModelMap类型的参数来接收传递过来的参数,
* 方法内部调用model.getAttribute("参数名")可以获取传递过来的参数
*
* @param model
* @return
*/
@RequestMapping(value = "/redirect/test6", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String, Object> test6(Model model) {
String name = (String) model.getAttribute("name");
Integer age = (Integer) model.getAttribute("age");
Map<String, Object> result = new LinkedHashMap<>();
result.put("name", name);
result.put("age", age);
return result;
}
浏览器中访问/redirect/test5
接口,会被重定向到/redirect/test6
,效果如下,参数传递成功了,传递是隐藏式的。
redirectAttributes.addFlashAttribute 放入重定向需要传递的参数,SpringMVC 在重定向到新地址之前,会将这部分数据丢到 session 中,当重定向的请求过来后,SpringMVC 又会从 session 中拿到这部分数据,然后丢到 Model 或者 ModelMap 中,然后冲 session 中清理掉这部分数据。
https://gitee.com/javacode2018/springmvc-series