JavaWeb专栏之(五):面试官的灵魂质问—什么是转发与重定向?

JavaWeb专栏之(五):面试官的灵魂质问—什么是转发与重定向?

前言:

本文继续探究Servlet中底层源码,其中HttpServletRequest与HttpServletReSponse为Servlet的核心关键,而很多面试题目就基于Request和Response中的属性,例如:什么是转发与重定向?Request的属性已经实现过程...本文带你走进HTTPServletRequest与HTTPServletResponce底层源码中,让您知其然,知其所以然

最后:本专栏的代码已经同步到Gitee中,欢迎小伙伴一键start,原创整理不易,多多支持哦!传送门:https://gitee.com/shunchangdu/Javaweb_servlet

关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top

在这里插入图片描述


一、什么是HttpServletRequest、HttpServletReSponse?

web服务器端接收到客户端发送的Http请求后,会针对这个请求,分别创建代表请求的HttpServletRequest,一个代表响应的HTTPServletResponse;

HttpServletRequest:获取客户端的请求参数

HttpServleRespanse:响应客户端的所有信息

二、Servlet中HttpServletRequest源码分析

HttpservletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpservletRequest,通过HttpServletrequest中方法,可以获得客户端的所有信息。

我们进入到ServletRequest的源码中,其中封装了大量的获取请求的信息

在这里插入图片描述

获取客户端传递的参数

在这里插入图片描述

String username = req.getParameter("username");
String password = req.getParameter("password");
String[] games = req.getParameterValues("games");//接收多个参数

请求转发

request.getRequestDispatcher("index.jsp").forward(request, response);

三、Servlet中HttpServletReSponse源码分析

HttpServleRespanse:响应客户端的所有信息,进入到ServletResponse的源码中,可以看到底层代码中,封装了很多获取客户端的方法

在这里插入图片描述

向浏览器发送数据的方法:

ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;

向浏览器发送响应头:

void setCharacterEncoding(String paramString);

void setContentLength(int paramInt);

void setContentLengthLong(long paramLong);

void setContentType(String paramString);

void setDateHeader(String paramString, long paramLong);
    
void addDateHeader(String paramString, long paramLong);
    
void setHeader(String paramString1, String paramString2);
    
void addHeader(String paramString1, String paramString2);
    
void setIntHeader(String paramString, int paramInt);
    
void addIntHeader(String paramString, int paramInt);

void setStatus(int paramInt);

响应的状态码:

public static final int SC_CONTINUE = 100;
public static final int SC_SWITCHING_PROTOCOLS = 101;
public static final int SC_OK = 200;
public static final int SC_CREATED = 201;
public static final int SC_ACCEPTED = 202;
public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
public static final int SC_NO_CONTENT = 204;
public static final int SC_RESET_CONTENT = 205;
public static final int SC_PARTIAL_CONTENT = 206;
public static final int SC_MULTIPLE_CHOICES = 300;
public static final int SC_MOVED_PERMANENTLY = 301;
public static final int SC_MOVED_TEMPORARILY = 302;
public static final int SC_FOUND = 302;
public static final int SC_SEE_OTHER = 303;
public static final int SC_NOT_MODIFIED = 304;
public static final int SC_USE_PROXY = 305;
public static final int SC_TEMPORARY_REDIRECT = 307;
public static final int SC_BAD_REQUEST = 400;
public static final int SC_UNAUTHORIZED = 401;
public static final int SC_PAYMENT_REQUIRED = 402;
public static final int SC_FORBIDDEN = 403;
public static final int SC_NOT_FOUND = 404;
public static final int SC_METHOD_NOT_ALLOWED = 405;
public static final int SC_NOT_ACCEPTABLE = 406;
public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
public static final int SC_REQUEST_TIMEOUT = 408;
public static final int SC_CONFLICT = 409;
public static final int SC_GONE = 410;
public static final int SC_LENGTH_REQUIRED = 411;
public static final int SC_PRECONDITION_FAILED = 412;
public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
public static final int SC_REQUEST_URI_TOO_LONG = 414;
public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
public static final int SC_EXPECTATION_FAILED = 417;
public static final int SC_INTERNAL_SERVER_ERROR = 500;
public static final int SC_NOT_IMPLEMENTED = 501;
public static final int SC_BAD_GATEWAY = 502;
public static final int SC_SERVICE_UNAVAILABLE = 503;
public static final int SC_GATEWAY_TIMEOUT = 504;
public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

重定向的底层方法:

void sendRedirect(String paramString) throws IOException;

在这里插入图片描述

四、请你聊一聊转发与重定向

在这里插入图片描述

转发请求与重定向的作用

在Servlet中实现页面的跳转有两种方式:转发重定向

4.1转发请求:

概念:

客户首先发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的student_list.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在student_list中都能取出来,因此,student_list能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应。

转发的特点

  • 地址栏不发生变化,显示的是上一个页面的地址

  • 请求次数:只有1次请求

  • 根目录:http://localhost:8080/项目地址/,包含了项目的访问地址

  • 请求域中数据不会丢失

转发使用哪个方法?

request.getRequestDispatcher("index.jsp").forward(request, response);

4.2什么是重定向

概念:

客户发送一个请求到服务器,服务器匹配servlet,servlet处理完之后调用了sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问student_list.jsp,紧接着客户端收到这个请求后,立刻发出一个新的请求,去请求student_list.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。(服务器向浏览器发送一个302状态码以及一个location消息头,浏览器收到请求后会向再次根据重定向地址发出请求)

重定向的特点

  • 地址栏:显示新的地址
  • 请求次数:2次
  • 根目录:http://localhost:8080/ 没有项目的名字,在重定向过程中要写全地址
  • 请求域中的数据会丢失,因为是2次请求

重定向该用那个方法

response.sendRedirect("/项目名称/index.jsp");

重定向:

在这里插入图片描述

4.3 疑问

问:什么时候使用转发,什么时候使用重定向?

  • 如果要保留请求域中的数据,使用转发,否则使用重定向。以后访问数据库,增删改使用重定向,查询使用转发。

问:转发或重定向后续的代码是否还会运行?

  • 无论转发或重定向后续的代码都会执行

4.4 重定向和转发的区别

区别转发forward()重定向sendRedirect()
根目录包含项目访问地址没有项目访问地址
地址栏不会发生变化会发生变化
哪里跳转服务器端进行的跳转浏览器端进行的跳转
请求域中数据不会丢失会丢失

总结

本文详细描述转发与重定向底层代码的实现以及区别,相信您已经有了更深层次的了解,在面试场景中尽量使用场景来描述转发与重定向。本期的干活就分享到这,觉得不错的小伙伴一键start哟

关注《遇见小Du说》学习更多小知识
在这里插入图片描述

我们下期不见不散哟,下期内容为:《面试官的灵魂质问--什么是Cookie与session?》,敬请期待....

  • 19
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Du猿

您的肯定就是小Du最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值