Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
SpringMVC教程
-> 重定向和转向详解
1、Helloword
2、@Controller、@RequestMapping
3、接口测试利器
4、如何接受请求中的参数?
5、@RequestBody接收Json格式数据
6、多文件上传
7、返回页面常见的5种方式
8、返回json格式数据 & 通用返回值设计
9、SpringMVC返回null是什么意思?
10、异步处理请求
11、如何集成静态资源?
12、拦截器怎么用?
13、统一异常处理
14、实战篇:通用返回值 & 异常处理设计
15、全注解的方式 & 原理解析
16、源码解析SpringMVC处理请求的流程
17、源码解析SpringMVC容器的启动过程
18、RequestBodyAdvice:对@ReuqestBody进行增强
19、ResponseBodyAdvice:对@ResponseBody进行增强
20、RESTful接口详解
21、接口调用利器RestTemplate
22、参数解析器HandlerMethodArgumentResolver解密
23、@RequestParam用法及原理详解
24、@RequestBody原理解密
25、@RequestHeader详解
26、@CookieValue详解
27、@RequestAttribute详解
28、@SessionAttribute详解
29、重定向和转向详解
30、Converter转换器详解
31、跨域问题详解
32、类容协商,颠覆你的认知
33、终章
34、CORS通信
35、浏览器安全策略 & CORS
36、Http中的Content-Type详解
上一篇:@SessionAttribute详解
下一篇:Converter转换器详解
<div style="display:none"></div> **大家好,我是路人,这是SpringMVC系列第29篇。** ## 1、本文内容3个知识点 - SpringMVC中转发如何实现? - SpringMVC重定向如何实现? - 重定向3种传参方式 ## 2、转发 ### 2.1、servlet原生实现转发 ```java request.getRequestDispatcher(path).forward(request,response); ``` ### 2.2、SpringMVC实现转发 接口需满足下面这3条的会被SpringMVC当做转发进行处理 - 接口返回值为String类型 - 返回值格式:`forward:转发的路径` - 方法或者类上不要标注@ResponseBody注解 案例代码如下,当访问`/forward/test1`的时候,返回值以`forward:`开头,SpringMVC会将请求转发到`/forward/test2` ```java @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`输出 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/240/9c662d2e-07af-429c-9e26-c6eea3c6ad87.png) ## 3、重定向 ### 3.1、servlet原生实现重定向 ``` response.sendRedirect(url); ``` ### 3.2、SpringMVC实现重定向 接口需满足下面这3条的会被SpringMVC当做转发进行处理 - 接口返回值为String类型 - 返回值格式:`redirect:重定向的路径` - 方法或者类上不要标注@ResponseBody注解 案例代码如下,当访问`/redirect/test1`的时候,返回值以`redirect:`开头,SpringMVC会将请求转发到`/redirect/test2` ```java @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`了 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/240/63a3939c-e5f9-4d87-95aa-e5d80f81a67a.png) ### 3.3、重定向传参方式1:手动在地址后拼接参数 直接在重定向的url中直接拼接参数,如`redirect:地址?name=路人&age=30`,如 ```java @RequestMapping("/redirect/test1") public String test1() { return "redirect:/redirect/test2?name=路人&age=30"; } ``` ### 3.4、重定向传参方式2:RedirectAttributes.addAttribute("参数","值") #### 用法 - 接口中需要有一个类型为`RedirectAttributes`的参数 - 调用`redirectAttributes.addAttribute("参数","值")`,放入重定向需要传递的参数 - **原理:**通过`redirectAttributes.addAttribute`丢进去的参数,SpringMVC重定向的时候,会自动将这些参数以`?参数1=值1&参数2=值2`拼接到重定向的地址上,类似于上面的方式1。 #### 案例代码 > 访问接口test3,会被重定向到test4,顺便传递了2个参数 ```java @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`,被自动拼接到地址后面了。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/240/2451eccc-e435-4a1a-b8af-d54a62e4a66e.png) ### 3.5、重定向传参方式2:RedirectAttributes.addFlashAttribute("参数","值") 上面我们使用的是`RedirectAttributes`的`addAttribute`放入参数,这次我们要使用另外一个方法`addFlashAttribute`放入重定向需要传递的参数,具体有什么区别呢,请向下看。 #### 用法 - 接口中需要有一个类型为`RedirectAttributes`的参数 - 调用`redirectAttributes.addFlashAttribute("参数","值")`,这种方式传递的参数是被隐藏的,不会被拼接在地址后,内部是通过session共享数据来实现的。 - 被重定向到的接口,需要使用一个`org.springframework.ui.Model`或者`org.springframework.ui.ModelMap`类型的参数来接收传递过来的参数,调用`model.getAttribute("参数名")`可以获取传递过来的参数 #### 案例代码 > 访问接口test5,会被重定向到test6,顺便传递了2个参数 ```java @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`,效果如下,参数传递成功了,传递是隐藏式的。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/240/b7687158-a77f-4422-b6e8-eca7bf71a611.png) #### 原理 redirectAttributes.addFlashAttribute 放入重定向需要传递的参数,SpringMVC在重定向到新地址之前,会将这部分数据丢到session中,当重定向的请求过来后,SpringMVC又会从session中拿到这部分数据,然后丢到Model或者ModelMap中,然后冲session中清理掉这部分数据。 ### 3.6、RedirectAttributes.addAttribute和RedirectAttributes.addFlashAttribute区别 - 都可以实现重定向传递参数 - addAttribute传递的参数,最后会追加在新的地址上,而addFlashAttribute传递的参数是隐藏式的 - addFlashAttribute可以传递大量的信息,不过addFlashAttribute有个弊端,重定向到新地址之后,如下图,如果此时用户刷新页面,传递的参数取不到了,就丢失了,建议使用方式1和方式2;方式3可以作为了解。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/240/f91a3829-f270-4e0e-a65c-2abd86b6a2b7.png) ## 4、案例代码git地址 ### 4.1、git地址 ```html https://gitee.com/javacode2018/springmvc-series ``` ### 4.2、本文案例代码结构说明 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/240/530d3cce-2e4a-4c78-acf7-067840abab79.png) <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
#custom-toc-container