Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染。通过配置,我们配置某个 ViewResolver 如下:

  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <description>
  3. 假如逻辑试图名为 "hello",因此 viewResolver 将解析成 /WEB-INF/jsp/hello.jsp
  4. </description>
  5. <property name="order" value="10" />
  6. <property name="prefix" value="/WEB-INF/jsp/" />
  7. <property name="suffix" value=".jsp" />
  8. </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,怎么办?

        我们可以通过forward 前缀来达到转发到其它资源的目的: 

  1. public String handle() {
  2. // return "forward:/hello" => 转发到能够匹配 /hello 的 controller 上
  3. // return "hello" => 实际上还是转发,只不过是框架会找到该逻辑视图名对应的 View 并渲染
  4. // return "/hello" => 同 return "hello"
  5. return "forward:/hello";
  6. }

同理,如果我们想重定向到某个资源,我们可以通过 redirect 前缀来达到重定向到其它资源的目的:

  1. public String handle() {
  2. // 重定向到 /hello 资源
  3. return "redirect:/hello";
  4. }

下面是关于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

最新文章

  1. 我的 vim 基本配置
  2. Frog Jump
  3. Jquery中使用setInterval和setTimeout会提示缺少对象的错误,解决方法如下:
  4. java中compareTo和compare方法之比较
  5. PCB电路板上防潮绝缘抗腐蚀的三防漆
  6. JS的词法作用域
  7. Http状态码完整说明
  8. JVM学习之常见溢出类型
  9. 数据结构——表(list)
  10. 恭喜我开通了CSDN博客
  11. [数据结构]Splay简介
  12. Java程序员入门:程序员究竟可以干多少年?
  13. Java中的枚举的治理
  14. 再看Java基本类型
  15. 用 Heapster 监控集群 - 每天5分钟玩转 Docker 容器技术(176)
  16. 纵观 jBPM:从 jBPM3 到 jBPM5 以及 Activiti5
  17. weex安装失败,按照官网步骤多次失败后成功
  18. CSS------div无法覆盖图片全部如何处理
  19. C# Po3协议读取邮件内容遇到的问题
  20. less-7

热门文章

  1. java(数组及常用简单算法 )
  2. spring三大框架整合
  3. dp之完全背包 hdu--2159一维数组做法
  4. [AngularFire] Resolve snapshotChanges doesn&#39;t emit value when data is empty
  5. Codeforces Round #193 (Div. 2) 部分题解
  6. easyui树查找
  7. C++访问WebService gSoap方式
  8. 【Expression 序列化】WCF的简单使用及其Expression Lambada的序列化问题初步解决方案
  9. win7桌面有个无法删除的IE图标
  10. 将一个字符串当做一个方法名或对象的key