转发与重定向
什么是转发
转发是指我们的一个请求处理器(ServletA)将请求交给另一个处理器处理(ServletB),再讲结果返回。
基本流程
客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。
原理图
特点
- 用户浏览器的地址栏不会被更改,也就是说,用户访问什么地址就跳转到什么地址,和用户的输入地址一致。
- Servlet之间使用的是同一个request对象,什么意思呢?
示例
以我们熟悉的代码为例子,这是很简单的设计模式,根据if条件判断要执行哪一条方法,方法1将参数交给方法2处理,这是很常见的业务拆分。
pubic void 方法1(参数1,参数2){
if(...){
方法2(参数1,参数2);
}
else{
方法3(参数1,参数2);
}
}
pubic void 方法2(参数1,参数2){
}
pubic void 方法3(参数1,参数2){
}
servlet也如此,我们有的时候会将业务拆分,让不同的servlet处理更加单一的事情,然后使用转发技术进行相互的调用,并且使用同一个requset和response对象。
public class servlet1 implements Servlet{
if(...){
request.getRequestDispatcher("/servlet2").forward(request, response);
}
else{
request.getRequestDispatcher("/servlet3").forward(request, response);
}
}
@WebServlet("/servlet2")
public class servlet2 implements Servlet{
...
}
@WebServlet("/servlet3")
public class servlet3 implements Servlet{
...
}
当然转发的Servlet处理完之后可以再进行转发。举个例子登录验证Servlet1是登录验证,Servlet2是登录安全验证。
//查看账号密码是否正确
request.getRequestDispatcher("/servlet1").forward(request, response);
...
//查看登录设备是否是已认证设备
request.getRequestDispatcher("/servlet2").forward(request, response);
什么是重定向
当我们的请求处理器接收到请求时,不处理请求而是告诉用户浏览器应该发送ABC请求,然后用户浏览器再跳转到ABC请求。
基本流程
客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)
原理图
特点
- 用户浏览器地址栏会变化
- 使用不同的request对象
示例
用户访问个人网站时,我们应该判断一下他有没有登录,如果说登录过了,直接可以进入主页,否则,应该让他去登录界面登录。
if(isLogin()){
主页();
}
else{
respoonse.sendRedirect("\虚拟路径\login");
}
以QQ空间登录为例子,网址变了。
区别
区别 | 转发forward() | 重定向sendRedirect() |
---|---|---|
根目录 | 包含项目访问地址 | 不包含项目访问地址 |
地址栏 | 不会发生变化 | 会发生变化 |
哪里跳转 | 服务器端进行的跳转 | 浏览器端进行的跳转 |
请求域中数据 | 不会丢失 | 会丢失 |
注意:
重定向是告诉用户浏览器应该使用哪一个URL地址,所以我们必须给完整的访问地址,虚拟路径+请求地址。
转发是大家都在一个工作环境下的,你知道我我知道你,所以我们转发之间只需要输入/serlvet2
另一个Servlet的请求地址即可,不用加虚拟路径