servlet容器、HttpServletRequest和HttpServletResponse的详解

转自
https://blog.csdn.net/tong_xinglong/article/details/12972819

如果说DOM是javascript与HTML的桥梁,那么servlet就是前端与后端的桥梁,HttpServletRequest和HttpServletResponse就是之间的信使。

请求与响应相关的类和接口非常多,下表是主要的与请求和相应接口相关的类以及接口。

主要的与请求和相应接口相关的类及接口

在这里插入图片描述

在上面给出的类和接口中,最主要的是HttpServletRequest和HttpServletResponse接口,下面将详细介绍这两个接口。

1.HttpServletRequest

HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据。同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息。下表是接口HttpServletRequest的常用方法。

说明:HttpServletRequest接口提供了很多的方法。

接口HttpServletRequest的常用方法
在这里插入图片描述

2.HttpServletResponse

在Servlet中,当服务器响应客户端的一个请求时,就要用到HttpServletResponse接口。设置响应的类型可以使用setContentType()方法。发送字符数据,可以使用getWriter()返回一个对象。下表是接口HttpServletResponse的常用方法。

接口HttpServletResponse的常用方法

在这里插入图片描述


以下转自
https://www.cnblogs.com/liuyandeng/p/5336649.html

3. 由来

Web服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest和HttpServletResponse对象。从客户端取数据找HttpServletRequest,向服务器发送数据找HttpServletResponse。

3.1 HttpServletRequest

公共接口类HttpServletRequest继承自ServletRequest。客户端浏览器发出的请求被封装成为一个HttpServletRequest对象。所有的信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统都包含在其内。

一个 HTTP 请求包含以下三部分:

  • a.请求地址(URL)
  • b.请求头(Request headers)
  • c.实体数据(Entity body)

出现乱码的原因和解决: 查看原文

3.2 HttpServletResponse

HttpServletResponse继承了ServletResponse接口,并提供了与Http协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法.

HttpServletResponse对象可以向客户端发送三种类型的数据:

  • a.响应头(Response headers)
  • b.状态码(Protocol—Status code—Description)
  • c.实体数据(Entity body )

4. ServletRequest与ServletResponse

4.1 ServletRequest

代表一个HTTP请求,请求在内存中是一个对象,这个对象是一个容器,可以存放请求参数和属性

请求对象何时被创建,当通过URL访问一个JSP或者Servlet的时候,也就是当调用Servlet的service()、doPut()、doPost()、doXxx()方法时候的时候,执行Servlet的web服务器就自动创建一个ServletRequest和ServletResponse的对象,传递给服务方法作为参数

请求对象 由 Servlet容器自动产生,这个对象中自动封装了请求中get和post方式提交的参数,以及请求容器中的属性值,还有http头等等。当Servlet或者JSP得到这个请求对象的时候,就知道这个请求时从哪里发出的,请求什么资源,带什么参数等等。通过请求对象,可以获得Session对象和客户端的Cookie。请求需要指定URL,浏览器根据URL生成HTTP请求并发送给服务器。

4.2 ServletResponse

ServletResponse也是由容器自动创建的,代表Servlet对客户端请求的响应,响应的内容一般是HTML,而HTML仅仅是响应内容的一部分。请求中如果还包含其他资源会依次获取,如页面中含有图片会进行第二个http请求用来获得图片内容

相应对象有以下功能:

  • 1、向客户端写入Cookie
  • 2、重写URL
  • 3、获取输出流对象,向客户端写入文本或者二进制数据
  • 4、设置响应客户端浏览器的字符编码类型
  • 5、设置客户端浏览器的MIME类型。

5. 一个简单的 servlet 容器

Servlet 接口需要实现下面的 5 个方法:

public void init(ServletConfig config) throws ServletException

public void service(ServletRequest request, ServletResponse response) throws ServletException,

java.io.IOException

public void destroy()

public ServletConfig getServletConfig()

public java.lang.String getServletInfo()
  • 在某个 servlet 类被实例化之后,init 方法由 servlet 容器调用。servlet 容器只调用该方法一次,调用后则可以执行服务方法了。在 servlet 接收任何请求之前,必须是经过正确初始化的。

  • 当一个客户端请求到达后,servlet 容器就调用相应的 servlet 的 service 方法,并将 Request 和 Response对象作为参数传入。在 servlet 实例的生命周期内,service 方法会被多次调用。

  • 在将 servlet 实例从服务中移除前,会调用 servlet 实例的 destroy 方法。一般情况下,在服务器关闭前,会发生上述情况,servlet 容器会释放内存。只有当 servlet 实例的 service 方法中所有的线程都退出或执行超时后,才会调用 destroy 方法。当容器调用了 destroy 方法后,就不会再调用 service 方法了。

下面从 servlet 容器的角度观察 servlet 的开发。在一个全功能 servlet 容器中,对 servlet 的每个 HTTP 请求来说,容器要做下面几件事:

  • 1.当第一次调用 servlet 时,要载入 servlet 类,调用 init 方法(仅此一次);
  • 2.针对每个 request 请求,创建一个 Request 对象和一个 Resposne 对象;
  • 3.调用相应的 servlet 的 service 方法,将 Request 对象和 Response 对象作为参数传入;
  • 4.当关闭 servlet 时,调用 destroy 方法,并卸载该 servlet 类。

输出缓冲区的介绍

(1)Servlet程序输出的HTTP消息的响应正文首先被写入到Servlet引擎提供的一个输出缓冲区中,直到输出缓冲区被填满或者Servlet程序已经写入了所有的响应内容,缓冲区中的内容才会被Servlet引擎发送到客户端。

(2)使用输出缓冲区后,Servlet引擎就可以将响应状态行、各响应头和响应正文严格按照HTTP消息的位置顺序进行调整后再输出到客户端。

(3)如果在提交响应到客户端时,输出缓冲区中已经装入了所有的响应内容,Servlet引擎将计算响应正文部分的大小并自动设置Content-Length头字段。

(4)如果在提交响应到客户端时,输出缓冲区中装入的内容只是全部响应内容的一部分,Servlet引擎将使用HTTP1.1的chunked编码方式(通过设置Transfer-Encoding头字段来指定)传输响应内容。

输出缓冲区的有关方法

  System.out.println(response.getBufferSize());    //读取缓存区的大小

  response.setBufferSize(1024);  //设置缓冲区的的大小,会小与你设置的值

  System.out.println(response.getBufferSize());

  int len=response.getBufferSize();  //填满缓冲区

  for(int i =0;i<len;i++){

     System.out.println("w");

  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值