Request和Response

一.request和response简介:

  1. request和response的作用执行流程

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。

故:当需要获取客户机提交过来的数据时,找request对象就行了。
当需要向客户机输出数据,找response对象。

请求响应的具体现实流程:
1.浏览器发送请求

2.服务器接收请求,创建两个对象(request和response),将请求的信息封装request对象

3.找到对应的servlet,将这两个对象传递给servlet

4.Servlet收到请求,执行service方法,处理自己的业务逻辑,生成动态的内容,将内容返回给服务器

5.服务器收到内容之后,进行拆分,生成响应信息,返回给浏览器

6.浏览器解析

2.关于 request和response的体系结构:

httpServlet实现了service方法。
Servlet的service方法中有两个参数servletRequest和servletResponse

httpServlet实现了service方法

将两个对象进行了强转

ServletRequest==>HttpServletRequest

ServletResponse==>HttpServletResponse

//具体的实现类是由服务器帮我们创建的

tomact的实现类(了解)

org.apache.catalina.connector.RequestFacade

org.apache.catalina.connector.ResponseFacade

javax.servlet.Servlet接口中的service方法

public abstract void service(ServletRequest req, ServletResponse res)

javax.servlet.GenericServlet类中的service方法

public abstract void service(ServletRequest req, ServletResponse res)

javax.servlet.http.HttpServlet类中的service方法

在这个类中对service方法进行了重载

public void service(ServletRequest req, ServletResponse res)

protected void service(HttpServletRequest req, HttpServletResponse resp)

二.response

响应:用于向浏览器写东西
1.response常用方法:

2.response操作响应行(操作状态码)

格式:协议/版本 状态码 状态码说明

例如:HTTP/1.1 200 OK

在http响应行中,包括协议,版本号,以及有一个很重要的值,它叫做响应状态码.响应行中我们主要就是操作这些状态码,它可以有五种类型取值:

100-199
200-299
300-399
400-499
500-599

常用状态码

200请求成功(其后是对GET和POST请求的应答文档。)

302所请求的页面已经临时转移至新的url。(重定向)(配合location响应头使用)

304未按预期修改文档。(让浏览器读缓存)

客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since(什么时候修改的))头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

404没有找到文件或目录。(用户操作错误)

405请求中指定的方法不被允许

500请求未完成。服务器遇到不可预知的情况(代码错误)

504网关错误.

HttpServletResponse操作状态码方法

void setStatus(int sc): 设置状态代码.针对于非错误的状态码

例如:setstatus 200

void sendError(int status,String msg) throws IOException 设置错误状态码及信息

例如:response.sendError(404);报404错误

response.sendError(404,一不小心走丢了.........);报错误并且有错误信息

3.response操作响应头

http响应头的格式是 key/value的格式,可以有多个value值,以”,”分开.

例如:

Content-Encoding: gzip

Content-Length: 123

Content-Language: zh-cn

Content-Type: text/html; charset=GB2312

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT

HttpServletResponse操作响应头 API

public void setHeader(String name,String value)

用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值

(设置字符串形式的响应头 注意:若设置过,会覆盖)

public void addHeader(String name, String value)

用给定名称和值添加响应头。此方法允许响应头有多个值

(追加字符串形式的响应头 注意:若没有设置过则设置,若设置过则追加)

public void setIntHeader(String name, int value)

用给定名称和整数值设置响应头。如果已经设置了头,则新值将重写以前的值。

(设置整型的响应头)

public void addIntHeader(String name, int value)

用给定名称和整数值添加响应头。此方法允许响应头有多个值。

(添加整型的响应头)

public voidsetDateHeader(String name, long date)

用给定名称和日期值设置响应头。该日期根据距历元时间的毫秒数指定。如果已经设置了头,则新值将重写以前的值。(设置时间类型的响应头)

public void addDateHeader(String key, long date)

用给定名称和日期值添加响应头。该日期根据距历元时间的毫秒数指定。此方法允许响应头有多个值。(添加时间类型的响应头)

三.request

请求:要想获取浏览器发送过来的参数,通过request就可以了
1.HttpServletRequest对象用于封装http请求,对于http请求它有三部分组成,http请求行,http请求头及请求正文,
常用方法:

2.request操作请求行

格式:请求方式 请求资源 协议/版本

例子:GET /day10 HTTP/1.1

public String getMethod()获取请求方式例如 GET、POST

public String getRequestURI()获取去请求资源(不带参数) 是uri 例如:/day10/r

public String getProtocol()获取协议的名称和版本。(例如 HTTP/1.1)

public String getQueryString()

返回包含在请求 URL 中路径后面的查询字符串。如果 URL 没有查询字符串,则此方法返回 null。

例如:

//获取请求方式
String m= request.getMethod();
//获取请求资源
String url=request.getRequestURI();
//获取协议版本
String pro=request.getProtocol();

public String getContextPath()获取的是项目名

public StringBuffer getRequestURL() 获取请求的完整路径

重新构造客户端用于发出请求的 URL。返回的 URL 包含一个协议、服务器名称、端口号、服务器路径,但是不包含查询字符串参数。

public String getRemoteAddr()获取请求的ip地址

返回发送请求的客户端或最后一个代理的 Internet Protocol (IP) 地址

  1. request操作请求头

格式:key/value(value可以为多个)

public String getHeader(String name) 获取字符串格式的请求头

以 String 的形式返回指定请求头的值。

public java.util.Enumeration<E> getHeaders(String name)获取多个值的请求头

以 String 对象的 Enumeration 的形式返回指定请求头的所有值。

public java.util.Enumeration<E> getHeaderNames()获取所有请求头的名称

返回此请求包含的所有头名称的枚举。如果该请求没有头,则此方法返回一个空枚举。

public int getIntHeader(String name) 获取整型格式的请求头

以 int 的形式返回指定请求头的值。如果该请求没有指定名称的头,则此方法返回 -1。如果无法将头转换为整数,则此方法抛出 NumberFormatException。

public long getDateHeader(String name)获取时间类型的请求头

以表示 Date 对象的 long 值的形式返回指定请求头的值

案例:防盗链

  1. request获取请求参数(只有post有请求体)

Get请求 地址栏

http://localhost:端口/day10/1.html?username=tom&password=1234&hobby=eat&hobby=sleep

Post请求里面放的是?号后面的东西

请求参数是浏览器发送请求时携带的信息。

Get和Post请求的区别:

GET:参数会追加到地址栏上,post不会

请求参数大小有限制(一般不超过1kb),post没有

POST:相对于get请求安全

有请求体,存放请求参数,get没有

dopost方法里面访问doget方法内容

只要在post方法里调用就可以了反之亦然

doget(request,response);

public String getParameter(String name)(获取单一的值)

以 String 形式返回请求参数的值,如果该参数不存在,则返回 null

public String[] getParameterValues(String name)(获取多个值)

返回包含给定请求参数拥有的所有值的 String 对象数组,如果该参数不存在,则返回 null。

public java.util .Map<String, String[]> getParameterMap()(以map方式返回的所有的参数和值)

返回此请求的参数的 java.util.Map。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。

public java.util.Enumeration<E> getParameterNames()

返回包含此请求中所包含参数的名称的 String 对象的 Enumeration。如果该请求没有参数,则此方法返回一个空的 Enumeration。

  1. request获取参数中文出现乱码

原因:

汉字在不同的编码表中的码值不一样,那么在使用不同的编码表进行解码与编码操作时,就会出现乱码问题.

浏览器在提交的时候使用utf-8编码

Tomcat得到请求参数是使用iso8859-1进行了解码,封装到了request中。

在通过request获取请求信息就是乱码。

解决:

先使用iso8859-1进行编码

在使用utf-8进行解码

每个参数都要new才行(get,post方法都可行)

username= new String(username.getBytes(“iso8859-1”),”utf-8”);

如果请求方式是POST,

可以直接使用request.setCharacterEncoding(“utf-8”);就可以解决。

  1. request域对象的介绍

request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理.

request

xxxAttribute();

生命周期:一次请求开始,到响应结束之前

setAttribute方法 设置

getAttribute方法 获取

removeAttribute方法 删除

getAttributeNames方法

request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,从而共享请求中的数据

request.getRequestDispatcher("内部路径").forward(request,response)。

请求转发和重定向的区别

1.请求转发是服务器内部跳转,地址栏不会发生改变

重定向地址栏会发生改变。

2.请求转发,只有一次请求,一次响应.

重定向,有两次请求,两次响应。

3.请求转发存在request域,可以共享数据.

重定向不存在request域。

4.请求转发只能在服务器的内部跳转,简单说,只能访问本站内资源。

重定向可以访问站外资源,也可以访问站内资源.

5.请求转发是由request 发起的 . request.getRequestDispatcher().forward()

重定向是由response 发起的 response.sendRedirect();

6.请求转发与重定向时路径写法不一样.

重定向要跳转的路径是浏览器在次发起的,是浏览器端路径:写法: /工程名/资源

请求转发是服务器内部跳转,这时它与浏览器无关 写法:/资源

  1. 请求包含

RequestDispatcher.include()方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能

被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略.include在程序执行上效果类似forward,但是使用forward只有一个程序可以生成响应,include可以由多个程序一同生成响应 ----- 常用来页面布局

New两个html页面分别为 i1.html&i2.html

i1内容1111111111

i2内容22222222222

New一个Servlet get方法下

request.getRequestDispatcher(“/i1.html”).include(request,response);

request.getRequestDispatcher(“/i2.html”).include(request,response);

最后在页面输出的内容为111111111122222222222是两个页面的所用内容.

 

posted @ 2020-07-17 14:45  乱炖er  阅读(461)  评论(0编辑  收藏  举报