文章目录
文章目录
- 文章目录
- @[toc]
- 一、什么是HttpServletRequest、HttpServletReSponse?
- 二、Servlet中HttpServletRequest[源码](https://so.csdn.net/so/search?q=源码&spm=1001.2101.3001.7020)分析
- 获取客户端传递的参数
- 请求转发
- 三、Servlet中HttpServletReSponse源码分析
- 向浏览器发送响应头:
- 响应的状态码:
- 重定向的底层方法:
- 四、请你聊一聊转发与重定向
- 转发请求与重定向的作用
- 4.1转发请求:
- 概念:
- 转发的特点
- 转发使用哪个方法?
- 4.2什么是重定向
- 概念:
- 重定向的特点
- 重定向该用那个方法
- 重定向:
- 4.3 疑问
- 4.4 重定向和转发的区别
文章目录
- 文章目录
- @[toc]
- 一、什么是HttpServletRequest、HttpServletReSponse?
- 二、Servlet中HttpServletRequest[源码](https://so.csdn.net/so/search?q=源码&spm=1001.2101.3001.7020)分析
- 获取客户端传递的参数
- 请求转发
- 三、Servlet中HttpServletReSponse源码分析
- 向浏览器发送响应头:
- 响应的状态码:
- 重定向的底层方法:
- 四、请你聊一聊转发与重定向
- 转发请求与重定向的作用
- 4.1转发请求:
- 概念:
- 转发的特点
- 转发使用哪个方法?
- 4.2什么是重定向
- 概念:
- 重定向的特点
- 重定向该用那个方法
- 重定向:
- 4.3 疑问
- 4.4 重定向和转发的区别
一、什么是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);
1
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");
1
重定向:
4.3 疑问
问:什么时候使用转发,什么时候使用重定向?
- 如果要保留请求域中的数据,使用转发,否则使用重定向。以后访问数据库,增删改使用重定向,查询使用转发。
问:转发或重定向后续的代码是否还会运行?
- 无论转发或重定向后续的代码都会执行
4.4 重定向和转发的区别
区别 | 转发forward() | 重定向sendRedirect() |
---|---|---|
根目录 | 包含项目访问地址 | 没有项目访问地址 |
地址栏 | 不会发生变化 | 会发生变化 |
哪里跳转 | 服务器端进行的跳转 | 浏览器端进行的跳转 |
请求域中数据 | 不会丢失 | 会丢失 |