1.重定向访问服务器两次,转发只访问服务器一次。
2.转发页面的URL不会改变,而重定向地址会改变
3.转发只能转发到自己的web应用内,重定向可以重定义到任意资源路径。
4.转发相当于服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,前后页 共用一个request,可以通过此来传递一些数据或者session信息,request.setAttribute()和 request.getAttribute()。而重定向会产生一个新的request,不能共享request域信息与请求参数
5.由于转发相当于服务器内部方法调用,所以转发后面的代码仍然会执行(转发之后记得return);重定向代码执行之后是方法执行完成之后进行重定向操作,也就是访问第二个请求,如果是方法的最后一行进行重定向那就会马上进行重定向(重定向也需要return)。
6.无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中移除。
可以这么理解:
转发相当于,张三向你借钱,但是你兜里没钱,所以你去找李四借到钱之后借给张三。对于张三而言并不知道你的钱是和李四借的。
重定向相当于,张三向你借钱,你兜里没钱,你告诉他李四有钱,所以张三再次去找李四借钱。
重定向是指将请求重新发送到一个新的URL,新的URL可以是另一个控制器方法、一个静态资源或者一个外部URL。通过重定向可以实现页面跳转和访问其他资源。在Spring MVC中,可以使用redirect:前缀来实现重定向。例如,return “redirect:/index.jsp”;表示重定向到index.jsp页面。
转发是指将请求转发给另一个控制器方法或者一个JSP页面进行处理,转发不改变客户端的URL。在Spring MVC中,可以使用forward:前缀来实现转发。例如,return “forward:/url”;表示将请求转发到/url地址。转发可以在服务器内部进行,因此可以共享请求和响应对象。
重定向和转发的选择取决于具体的需求。如果需要跳转到一个新的URL或者访问其他资源,可以使用重定向。如果需要将请求转发给另一个控制器方法或者JSP页面进行处理,可以使用转发
<br>
<a href="${pageContext.request.contextPath}/one.action">1.请求转发页面</a><br>
<a href="${pageContext.request.contextPath}/two.action">2.请求转发action</a><br>
<a href="${pageContext.request.contextPath}/three.action">3.重定向页面</a><br>
<a href="${pageContext.request.contextPath}/four.action">4.重定向action</a><br>
<br>
具体的Controller类,实现请求与转发
package com.powernode.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class JumpAction {
@RequestMapping("/one.action")
public String one(){
System.out.println("这是请求转发页面。。。。");
return "main";//默认这是请求转发,使用视图解析器进行前后缀拼接进行页面跳转
}
@RequestMapping("/two.action")
public String two(){
System.out.println("这是请求转发action跳转。。。。");
//forward:这组字符串可以屏蔽前后缀的拼接
return "forward:/other.action";
}
@RequestMapping("/three.action")
public String three(){
System.out.println("这是重定向页面。。。。");
//redirect: 这组字符串可以屏蔽前缀后缀的拼接,实现重定向跳转
return "redirect:/admin/main.jsp";
}
@RequestMapping("/four.action")
public String four(){
System.out.println("这是重定向 action跳转。。。。");
//redirect: 这组字符串可以屏蔽前缀后缀的拼接,实现重定向跳转
return "redirect:/other.action";
}
}
springmvc.xml的配置文件
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.powernode.controller">
context:component-scan>
<mvc:annotation-driven>mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/admin/">property>
<property name="suffix" value=".jsp">property>
bean>
beans>
不需要去创建,直接拿来使用即可.
1)HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)Model
5)Map
6)ModelMap
//做一个数据,传到main.jsp页面上
Users u = new Users(“张三”,22);
//传递数据
request.setAttribute("requestUsers",u);
session.setAttribute("sessionUsers",u);
model.addAttribute("modelUsers",u);
map.put("mapUsers",u);
modelMap.addAttribute("modelMapUsers",u);
注意:Map,Model,ModelMap和request一样,都使用请求作用域进行数据传递.所以服务器端的跳转必须是请求转发.