SpringMvc(4-1)Spring MVC 中的 forward 和 redirect(转)
Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染。通过配置,我们配置某个 ViewResolver 如下:
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <description>
- 假如逻辑试图名为 "hello",因此 viewResolver 将解析成 /WEB-INF/jsp/hello.jsp
- </description>
- <property name="order" value="10" />
- <property name="prefix" value="/WEB-INF/jsp/" />
- <property name="suffix" value=".jsp" />
- </bean>
- 如果逻辑视图名为 hello,框架通过 forward 的方式转发到了 /WEB-INF/jsp/hello.jsp。
- 如果逻辑视图名是 /hello,框架还是转发到了 /WEB-INF/jsp/hello.jsp,即 /WEB-INF/jsp//hello.jsp 等同于 /WEB-INF/jsp/hello.jsp。
现在有个问题,如果 /hello 就是某个 controller 的映射,我想转发到这个 controller,怎么办?
- public String handle() {
- // return "forward:/hello" => 转发到能够匹配 /hello 的 controller 上
- // return "hello" => 实际上还是转发,只不过是框架会找到该逻辑视图名对应的 View 并渲染
- // return "/hello" => 同 return "hello"
- return "forward:/hello";
- }
同理,如果我们想重定向到某个资源,我们可以通过 redirect 前缀来达到重定向到其它资源的目的:
- public String handle() {
- // 重定向到 /hello 资源
- return "redirect:/hello";
- }
下面是关于redirect和forward方式的区别:
redirect方式相当于”response.sendRedirect()”. 这种方式浏览器地址栏最后显示的路径是转发后的新的路径。工作方式是这样的, 服务器端会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后服务器发新的response给浏览器. 这时页面收到的request对象是重新从浏览器发来的。这种方式的特点:
A.在转发前后有两个不同的request对象,转发前后的两个控制器在request上的参数(request.getParameter())和request属性(request.getAttribute())不能共享;
B.如果转发前后的两个控制器都配置在spring 拦截器范围内,这样拦截器会拦截前后两个request,即会拦截两次;
C.最后返回到浏览器后,因为地址栏显示的是转发后的url,所以刷新页面时只会执行后面的url映射的控制器.
forward方式相当于request.getRequestDispatcher().forward(request,response),这种方式的外部特征是浏览器地址显示的路径是转发前的路径。工作方式是这样,forward 发生在服务器内部,在前一个控制器处理完毕后,直接进入下一个控制器处理, 并将最后的response发给浏览器. 这种方式的特点:
A.转发前后是同一个request,后一个控制器可共享前一个控制器的参数与属性;
B.因为是同一个request,拦截器只会拦截前一个url,如果前一个url在映射时未配置到拦截器拦截,则拦截后一个url,即只拦截一次;
C.最后返回到浏览器后,因为地址栏显示的是转发前的url,所以刷新页面时会依次执行前后两个控制器.
原文地址:https://www.cnblogs.com/lexiaofei/p/7044429.html?utm_source=itdadao&utm_medium=referral
最新文章
- 我的 vim 基本配置
- Frog Jump
- Jquery中使用setInterval和setTimeout会提示缺少对象的错误,解决方法如下:
- java中compareTo和compare方法之比较
- PCB电路板上防潮绝缘抗腐蚀的三防漆
- JS的词法作用域
- Http状态码完整说明
- JVM学习之常见溢出类型
- 数据结构——表(list)
- 恭喜我开通了CSDN博客
- [数据结构]Splay简介
- Java程序员入门:程序员究竟可以干多少年?
- Java中的枚举的治理
- 再看Java基本类型
- 用 Heapster 监控集群 - 每天5分钟玩转 Docker 容器技术(176)
- 纵观 jBPM:从 jBPM3 到 jBPM5 以及 Activiti5
- weex安装失败,按照官网步骤多次失败后成功
- CSS------div无法覆盖图片全部如何处理
- C# Po3协议读取邮件内容遇到的问题
- less-7
热门文章
- java(数组及常用简单算法 )
- spring三大框架整合
- dp之完全背包 hdu--2159一维数组做法
- [AngularFire] Resolve snapshotChanges doesn&#39;t emit value when data is empty
- Codeforces Round #193 (Div. 2) 部分题解
- easyui树查找
- C++访问WebService gSoap方式
- 【Expression 序列化】WCF的简单使用及其Expression Lambada的序列化问题初步解决方案
- win7桌面有个无法删除的IE图标
- 将一个字符串当做一个方法名或对象的key