Request和Response的入门学习

内容:
*response
*request
*编码
*路径
--------------------------------------
服务器处理请求的流程:
服务器每次收到请求时,都会为这个请求开辟一个新的流程。
服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体。
服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应。


----------------------------------------
response:其类型为HttpServletResponse
ServletResponse--与协议无关的类型
HttpServletResponse--与http协议有关的类型


回忆一下http协议!http协议中响应的内容包含哪些东西呢?
*状态码:200表示成功,302表示重定向,404表示访问的资源不存在,500表示服务器错误。
>sendError(int sc)--发送错误状态代码,例如404 500
>sendError(int sc,String msg)--发送错误状态码加一个错误信息。
>setStatus(int sc)--发送成功的状态码,可以用料发送302.
*响应头:Content-Type,Refresh,Localtion等等
头就是一个键值对!可能会存在一个头(一个名称,一个值),也可能会存在一个头(一个名称,多个值)
>setHeader(String name,String value):适用于单值的响应头,例如:response.setHeader("aa","AA");
>addHeader(String name,String value):适用于多值的响应头
>setIntHeader(String name,int value):适用于单值的Int类型响应头。
>addIntHeader(String name,int value):适用于多值的Int类型的响应头。
>setDateHeader(String name,long value):适用于单值的毫秒类型的响应头。
>addDateHeader(String name,long value):适用于多值的毫秒类型的响应头。
案例:
>发送302,设置Location头,完成重定向。
>定时刷新:设置Refresh头,你可以把它理解成,定时重定向!
>禁用浏览器缓存:Cache-Control、pragma、expires
><meta>标签可以代替响应头:<meta http-equiv="Content-Type" content="text/html";charset="UTF-8">
*响应体:通常是html 也可以是图片!
>response的两个流:
*ServletOutputStream:用来向客户端发送字节数据。ServletOutputStream out=response.getOutputStream();
*PrintWriter:用来向客户端发送字符数据!需要设置编码。PrintWriter writer=response.getWriter();
*两个流不能同时使用!
案例:
>使用PrintWriter发送字符数据
>使用ServletOutputStream发送字节数据(图片)
*重定向:设置302,设置Location!其中变化的只有Location,所以java提供了一个快捷方法,完成重定向!
>sendRedirect(String Location)方法。


request:


回忆一下Http协议,请求协议中的数据都可以通过request对象来获取!
*获取常用信息:
**获取客户端IP,案例:封IP。request.getRemoteAddr()
**请求方式
*获取请求头:
**String getHeader(String name)适用于单值头
**int getIntHeader(String name)适用于单值Int类型请求头。
**long getDateHeader(String name)适用于单值毫秒类型的请求头。
**Enumeration<String> getHeaders(String name),适用于多值请求头


案例:
**通过User-Agent识别用户浏览器类型
**防盗链:如果请求不是通过本站的超链接发出的,发送错误状态码404.
*获取请求url
**String getScheme();获取协议
**String getServerName();获取服务器名
**String getServerPort();获取服务器端口
**String getContextPath();获取项目名称
**String getServletPath();获取Servlet路径
**String getQueryString();获取参数部分,即问号后面的部分
**String getRequestURL();获取请求URL,等于项目名称+Servlet路径
**String getRequestURL();获取请求URL,等于不包含参数的整个请求路径。


*获取请求参数:
**String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数
**String[] getParameterValue(String name);获取指定名称的请求参数值,适用于多值请求参数
**Enumeration<String> getParameterNames();获取所有请求参数的名称。
**Map<String,String[]> getParameterMap();获取所以请求参数,其中key为参数名,value为参数值。
案例:超链接参数。
案例:表单数据。
*请求转发和请求包含:
RequestDispatcher rd=request.getRequestDispatcher("/MyServlet");
请求转发:rd.forward(request,response);
请求包含:rd.includ(request,response);


有时候一个请求需要多个Servlet协作才能完成,所以需要在一个Servlet跳到另一个Servlet!
**一个请求跨多个Servlet,需要使用转发和包含。
**请求转发:由下一个Servlet完成响应体,当前Servlet可以设置响应头!(留头不留体)
**请求包含:由两个Servlet共同完成响应体(都留)
**无论是请求转发还是请求包含,都在一个请求范围内!使用同一个request和response!
*request域
void setAttribute(String name,Object Value)
Object getAttribute(String name)
**同一请求范围内使用request.setAttribute()、request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()来获取值。
*请求转发和重定向的区别:
**请求转发是一个请求一次响应,而重定向是两次请求两次响应。
**请求转发地址栏不变化,而重定向会显示后一个请求的地址。
**请求转发只能转发到本项目其他的Servlet,而重定向不只能重定向到本项目其他的Servlet还能定向到其他项目。
**请求转发是服务器端的行为,只需给出转发的Servlet路径,而重定向需要给出RequestURI,即包含项目名称。
----------------------------------

猜你喜欢

转载自blog.csdn.net/qq_18725165/article/details/80370912
今日推荐