SpringMVC中转发与重定向(redirect与forward)实践实例

简介: SpringMVC中转发与重定向(redirect与forward)实践实例

forward 转发,如return "forward:/hello"; 浏览器的地址栏不会变,但是通常会有新的视图页面。


redirect 重定向,如return "redirect:/hello"; 浏览器的地址栏会变。


spring控制器最后返回一个ModelAndView(urlName)点击查看视图详解过程 , 其中urNamel可以是一个视图名称,由视图解析器负责解析后进行浏览器渲染,也可以通过redirect/forward:url方式转到另一个控制器进行处理.


【1】redirect

相当于”response.sendRedirect()”。这种方式外部特征就是浏览器地址栏最后显示的路径是转发后的新的路径。


工作方式

服务器端会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后服务器发新的response给浏览器. 这时页面收到的request是一个新从浏览器发来的。


这种方式的结果是:


在转发前后有两个不同的request对象,转发前后的两个控制器在request上的参数(request.getParameter())和request属性(request.getAttribute())不能共享;


如果转发前后的两个控制器都配置在spring 拦截器范围内,这样拦截器会拦截前后两个request,即会拦截两次;


最后返回到浏览器后,因为地址栏显示的是转发后的url,所以刷新页面时只会执行后面的url映射的控制器.

【2】forward

相当于request.getRequestDispatcher().forward(request,response)。这种方式的外部特征是浏览器地址显示的路径是转发前的路径.


工作方式

forward 发生在服务器内部,在前一个控制器处理完毕后,直接进入下一个控制器处理, 并将最后的response发给浏览器。


这种方式的结果是:

转发前后是同一个request,后一个控制器可共享前一个控制器的参数与属性;


因为是同一个request,拦截器只会拦截前一个url,如果前一个url在映射时未配置到拦截器拦截,则拦截后一个url,即只拦截一次;


最后返回到浏览器后,因为地址栏显示的是转发前的url,所以刷新页面时会依次执行前后两个控制器.

【3】转发与重定向实例

① 转到到一个jsp页面

如下转发到/index2.jsp。


index.jsp 页面

<a href="springmvc/testForward">Test Forward</a>


Controller

@RequestMapping("/testForward")
public String testForward(){
  System.out.println("testForward");
  return "forward:/index2.jsp";
}


result as follows :

可以看到浏览器链接为请求链接,并没有发生二次改变,但是页面已经是index2.jsp !


② 转发到另外一个方法

即,转发对象为另一个方法的@RequestMapping匹配的url!

JSP页面不变,更改后台测试方法。

@RequestMapping("/testForward")
public String testForward(){
  System.out.println("testForward");
  return "forward:testMap";
  //  因为这里是同一个类的另一个方法,故没有 /
}


result as follows :

可以看到,链接未发生改变,仍为请求链接!但是页面在 success.jsp !


③ 重定向实例

重定向到index2.jsp

jsp 页面

<a href="springmvc/testRedirect">Test Redirect</a>


Controller

@RequestMapping("/testRedirect")
public String testRedirect(){
  System.out.println("testRedirect");
  return "redirect:/index2.jsp";
  //'/'表示相对于项目根目录
}

result as follows :

可以看到页面在index2.jsp,但是url 已经发生了改变!


④ 重定向到另外一个方法

jsp 页面不变,更改后台方法。

@RequestMapping("/testRedirect")
public String testRedirect(){
  System.out.println("testRedirect");
  return "redirect:testMap";//'/'表示相对于项目根目录
}


result as follows:

JSP页面请求的url 为springmvc/testRedirect,重定向到springmvc/testMap。此时在success.jsp页面,URL也发生了改变!



转发是服务器的操作,重定向是浏览器的操作!

目录
相关文章
SpringMVC——核心技术:重定向(redirect:)、请求转发(forward:)
SpringMVC——核心技术:重定向(redirect:)、请求转发(forward:)
SpringMVC——核心技术:重定向(redirect:)、请求转发(forward:)
|
Web App开发 前端开发 Java
SSM-SpringMVC-22:SpringMVC中转发(forward)和重定向(redirect)
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     转发和重定向大家都熟悉,都学到框架了,怎么能不了解转发和重定向呢? 如果有不熟悉的,可以去百度搜几篇博客去看看,绝对比我在这儿再多扯点好,所以我这儿要讲的重点就是springmvc的转发和重定向的写法   首先了解一个概念:携带数据的要用转发而不是重定向,重定向是在客户端完成,转发是在服务器端完成,所以路径写法有所不同   我在这篇博客要写的是:转发到页面,转发到别的处理方法,重定向到页面,重定向到别的处理方法。
1350 0
|
前端开发 Java Spring
Spring MVC中页面跳转(forward or redirect)
一 处理方法返回值设置为String类,一切麻烦都没有了: @RequestMapping("/dologin") public String dologin(HttpServletRequest request, User user) { return "panel/bingo"; } 原因很简单,你返回一个String,一个字符串,这个字符串代表View的名字。
1812 0
|
前端开发 Java Spring
Spring MVC 中的 forward 和 redirect
  Spring MVC 中,我们在返回逻辑视图时,框架会通过 viewResolver 来解析得到具体的 View,然后向浏览器渲染。
883 0
|
2月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
10天前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
16 1
|
13天前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
4天前
|
XML Java 数据格式
SpringMVC的XML配置解析-spring18
SpringMVC的XML配置解析-spring18
|
4天前
|
应用服务中间件
从代码角度戳一下springMVC的运行过程-spring16
从代码角度戳一下springMVC的运行过程-spring16