转发和重定向是页面跳转的二种实现方式
转发(forward):客户端发出请求,服务器接收到该请求,并直接做出相应的处理后进行页面跳转(在服务器端直接完成)。
重定向(redirect):客户端先发出请求,服务器接收到该请求,接收到之后并不直接做处理,而是在返回给游览器,在让游览器发出一次请求到服务器端,并找到需要处理的页面,找到之后在返回给客户端(游览器来完成)。
通俗的来说 : 比如你今天没有钱吃饭了 ,你向张三借钱,张三摸摸空荡荡的口袋,发现自己并没有多余的钱借给你,此时张三想到了李四,李四这个小逼崽子家里昨天刚拆迁,钱全部打到他卡里了,然后张三一个电话打过去说有急事借我点钱,然后张三吧从李四那借来的钱给你,这个操作就相当于转发(最终目的只找了张三,张三给你完成了借钱的操作)。
好又有一天,你有花没钱了,你又去找张三借,可是张三想起来你一次你借我的钱没还,搞的我自己从口袋掏的钱补给李四的,不知道这个小逼崽子什么时候能还,这时张三就不想给你去借,他就和你说,我吧李四的电话给你,你自己打电话去借,这操作就相当于重定向(最终找了二个人,先找的张三,张三发现上一次借我的钱都没有还,就把李四的电话给你,让你在去找李四借,最终找了二个人)。
借钱人相当于游览器,发出请求,而张三李四相当于服务器,给你完成借钱操作。
转发和重定向的区别:
- 转发是服务器行为,只需一次跳转,用户看不到url地址上的变化。重定向是游览器端的行为,需要进行二次跳转,用户能看到url地址上的变化。
- 转发的速度比重定向的速度相对要高,因为转发只需要做一次请求,而重定向需要做二次请求。
- 转发能够获取request作用域中的数据,因为他只发出了一次请求,而重定向无法获取request中的数据 ,因为他发出了二次请求,每一次请求对应着一次新的request
- 转发只能访问当前服务器中的数据,而重定向可以访问任意服务器中的数据
- 转发不能解决数据的重复提交问题(就是能按F5进行刷新操作),而重定向能解决数据的重复提交。
转发和重定向语句
原生转发:request.getRequestDispatcher("路径").forward(request, response);
原生重定向:response.sendRedirect("路径");
SpringMvc转发:forward:/路径
SpringMvc重定向:redirect:/路径
SpringMvc转发和重定向注意点 :
在利用SpringMvc中使用转发和重定向他会自动跳过视图解析器,它是直接从项目的跟目录中开始查找指定页面。
案例
先演示一下错误案例 看他是否会调高视图解析器
首页
控制器类
@Controller
public class UrlController
{
/*错误演示*/
@RequestMapping("/handle0")
public String handle0(){
System.out.println("handle0运行");
/*
错误演示
视图解析器:
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"/>
</bean>
如果经过了视图解析器按到理会找到/WEB-INF/pages/hello.jsp页面
* */
return "forward:/hello";
}
@RequestMapping("/handle1")
public String handle1(){
System.out.println("handle1运行");
// 转发
return "forward:/hello.jsp";
}
@RequestMapping("/handle2")
public String handle2(){
System.out.println("handle2运行");
// 重定向
return "redirect:/hello.jsp";
}
}
我们发现在当我们去掉了forward之后他就会自动解析
正确案例
Controller类