servlet 转发与重定向

转发与重定向

什么是转发

转发是指我们的一个请求处理器(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");
}

区别

在这里插入图片描述

注意:

重定向是告诉用户浏览器应该使用哪一个URL地址,所以我们必须给完整的访问地址,虚拟路径+请求地址。
转发是大家都在一个工作环境下的,你知道我我知道你,所以我们转发之间只需要输入/serlvet2另一个Servlet的请求地址即可,不用加虚拟路径

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值