Servlet 核心接口

在Servlet体系结构中,除了用于实现Servlet的Servlet接口、GenericServlet类和HttpServlet类外,还有一些辅助Servlet获取相关资源信息的重要接口,了解这些接口的作用并熟练掌握这些接口的常用方法是使用Servlet进行Web应用开发的基础。

  • ServletConfig 接口:用于获取Servlet初始化参数和ServletContext对象。
  • ServletContext 接口: 代表当前Servlet运行环境,Servlet可以通过ServletContext对象来访问Servlet容器中的各种资源。
  • HttpServletRequest接口:用于封装HTTP请求信息。
  • HttpServletResponse接口: 用于封装HTTP响应消息。

HttpServletRequest 接口

javax.servlet.http.HttpServletRequest 接口定义为

public interface HttpServletRequest extends ServletRequest

在Servlet API 中,ServletRequet接口被定义为用于封装请求的信息,ServletRequest对象由 Servlet 容器在用户每次请求 Servlet 时创建并传入Servlet 的 service() 方法中。HttpServletRequest 接口继承了 ServletRequest 接口,是专用于HTTP协议的子接口,用于封装HTTP请求信息。在HttpServlet类的 service方法中,传入的ServletRequest 对象被强制转换为 HttpServletRequest对象来进行HTTP请求信息的处理。

获取请求行信息

客户端浏览器和服务器端Servlet通过HTTP协议进行通讯,HTTP协议采用了请求/响应模型,协议的请求报文由请求行、请求头和可选的请求正文组成。

获取请求行信息的方法及描述

方法 描述
getMethod() 获取请求使用的HTTP方法,例如 GET、POST
getRequestURI() 获取请求行中的资源部分
getProtocol() 获取使用的协议及版本号
getQueryString() 获取请求URL后面的查询字符串,只对GET有效
getServletPath() 获取Servlet所映射的路径
getConextPatch() 获取请求资源所属的Web应用路径

获取请求头信息

常见HTTP请求头

请求头名称 说明
Host 初始URL中的主机和端口,可以通过这个信息获得提出请求的主机名和端口号
Connection 表述是否需要持久连接。如果值为 Keep-Alive或者请求使用的是 HTTP1.1,它就可以利用持久连接的优点,当页面包含多个元素时,可以显著的减少下载所需要的时间。
Content-Length 消息正文的长度
Cache-Control 指定请求和响应遵循的缓存机制。常见值 no-cache,只是请求和响应消息不能缓存。
Accept 浏览器可接受的MIME类型
Origin 说明最初请求是从哪来发起,只用于POST请求
User-Agent 浏览器相关信息,例如浏览器类型及版本,浏览器语言、客户所使用的操作系统及版本等。
Accept-Charset 浏览可接受的字符集
Content-Type 表示请求内容的MIME类型。由于经常要设置Context-Type,因此 HttpServletResponse 提供了一个专用的方法 setContentType
Referer 包含一个URL,表示从哪个地址出发访问到当前请求地址
Accept-Encoding 浏览器能够进行解码的数据编码方式。例如,gzip,服务器能够支持gzip的浏览器返回经gzip编码的html页面,许多情形下可以减少5-10倍的下载时间
Accept-Language 浏览器所希望的语言种类。
Cookie 表示客户端的Cookie信息

HttpServletRequest提供getHeader方法来根据指定的请求头名称读取对应的请求头信息,如果当前的请求中提供了对应的请求头,则返回对应的值,否则返回null。

public abstract String getHeader(StringheaderName)

尽管getHeader方法提供读取请求头信息的通用方式,但由于一些请求头的应用很普遍,HttpServletRequest还提供了专门对这些请求头的访问方法。

方法 描述
getIntHeader(String name ) 获取整数类型参数名为name的http头部
getDateHeader(String name) 获取long类型参数名为name的http头部
getContentLength() 获取请求内容的长度,以字节为单位
getContentType() 获取请求的文档类型和编码
getLocale() 获取用户浏览器设置的local信息
getCookies() 获取一个Cookie数组,该数组包含这个请求中当前的所有cookie

获取请求正文

请求正文内容为POST请求参数名称和值所组成的一个字符串;而对于GET请求,其请求参数附属在请求行中,没有请求正文。

HTTP协议的POST请求,主要通过FORM表单向Web服务器端程序提交数据请求的方式实现。 表单元素的 enctype 属性用于指定浏览器使用哪种编码方式将表单中的数据传送给 Web 服务器,该属性有两种取值

  • application/x-www.form-urlencoded (默认)
  • multipart/form-data

HttpServletRequest 接口获取请求参数的方法和描述

方法 描述
String getParameter(String name) 返回由name指定的用户请求参数的值
Enumeration getParameterNames() 返回所有用户请求的参数名
String[] getParameterValues(String name) 返回由name指定的用户请求参数对应的一组值
Map getParameterMap() 返回一个请求参数的Map对象,Map中的键为参数的名称,值为参数名对应的参数值
ServletInputStream getInputStream() 获取上传文件二进制输入流
BufferedReader getReader() 获取上传文件字符缓冲输入流

enctype属性只有在表单向服务器上传文件时才会设置为 multipart/form-data,并且此属性只适用于POST请求方式。

获取网络连接信息

HttpServletRequest接口还为客户端和服务器的网络通信提供了相应的网络连接信息。

方法 描述
getRemoteAddr() 获取请求用户的IP地址
getRemoteHost() 获取请求用户的主机名称
getRemotePort() 获取请求用户的主机所使用的网络端口号
getLocalAddr() 获取Web服务器的IP地址
getLocalName() 获取Web服务器的主机名
getLocalPort() 获取Web服务器所使用的网络端口号
getServerName() 获取网站的域名
getServerPort() 获取URL请求的端口号
getScheme() 获取请求使用的协议
getRequestURL() 获取请求的URL地址

HttpServletResponse 接口

javax.servlet.http.HttpServletResponse 接口的定义为

public interface HttpServletResponse extends ServletResponse

在Servlet API 中,ServletResponse 接口被定义为用于创建响应消息,ServletResponse 对象由Servlet容器在用户每次请求Servlet时创建并传入 Servlet 的 service() 方法中。HttpServletResponse 接口继承自ServletResponse接口,是专用于HTTP协议的子接口,用于封装HTTP响应消息。在HttpServlet类的service()方法中,传入的ServletResponse对象被强制转换为 HttpServletResponse 对象来进行HTTP响应信息的处理。

HttpServletResponse接口提供了具有如下功能类型的方法:

  • 设置响应状态的方法
  • 构建响应头的方法
  • 创建响应正文的方法

设置响应状态

一个完整的HTTP响应报文由响应行响应头响应正文组成。

HTTP协议响应报文的响应行由报文协议和版本以及状态码和状态描述构成。状态码由3个十进制数字组成,第1个十进制数字定义了状态码的类型,后两个数字没有分类作用。HTTP状态码共分为5种类型

分类 分类描述
1** 表示信息,服务器收到请求,需要请求者继续执行操作
2** 表示请求已经成功被服务器接收、理解并接受
3** 表示需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址在本次响应的Location域中指明
4** 表述客户端错误,请求包含语法错误或者无法完成请求
5** 表示服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到当前的软硬件资源无法完成对请求的处理

HttpServletResponse 接口设定状态码的方法及描述

方法 描述
setStatus(int sc) 以指定的状态码响应返回给客户端
setError(int sc) 使用指定的状态码向客户端返回一个错误响应
sendError(int sc,String msg) 使用指定的状态码和状态描述向客户端返回一个错误响应
sendRedirect(String location) 请求的重定向,会设定响应Location报头以及改变状态码

构建响应消息头

在Servlet中,可以通过HttpServletResponse的setHeader()方法来设置HTTP响应消息头,它接收两个参数用于指定响应消息头的名称和对应的值。

常用HTTP响应消息头

响应报头名称 说明
Server 一种标明Web服务器软件及其版本号的头标
Content-Type 返回文档时所采用的MIME类型
Transfer-Encoding 表示为了达到安全传输或者数据压缩等目的而对实体进行的编码。如chunked编码,该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束,这在实体长度未知时特别有用。
Date 发送HTTP消息的日期
Content-Encoding 用于说明页面在传输过程中已经采用的编码方式
Content-Length 响应内容的长度,以字节为单位
Expires 特定的一段时间,这段时间后应该将文档认作是过期的,不应该再继续缓存
Refresh 多少秒后浏览器应该重新载入页面
Cache-Control 用来指定响应遵循的缓存机制,若取值no-cache表示阻止浏览器缓存页面
Last-Modified 文档最后被改动的时间。不要直接设置这个报头,而应该提供getLastModified方法
Location 浏览器应该重新连接到的URL。一般无须直接设置这个报头,而是使用sendRedirect方法进行设定
Content-Disposition 通过这个报头,可以请求浏览器询问用户将响应存储到磁盘上给定名称的文件中
Set-Cookie 浏览器应该记录下来的cookie,不要直接设置这个报头,而应该使用 addCookie方法
WWW-Authenticate 授权的类型和范围。需要在Authorization 报头中给出

此外对于一些常用的消息头,Servlet API 中也提供了一些特定的方法来进行设置。

响应方法 说明
setContentType(String mime) 设定Content-type消息头
setContentLength(int length) 设定Content-Length 消息头
addHeader(String name,String value) 新增String类型的值到名为name的http头部
addIntHeader(Stirng name,int value) 新增int类型的值到名为name的http头部
addDateHeader(String name, long date) 新增long类型的值到名为name的http头部
addCookie(Coolie c) 为 Set-Cookie消息头增加一个值

创建响应正文

在Servlet中,向客户端输出的响应数据是通过输出流对象来完成的,HttpServletResponse接口提供了两个获取不同类型输出流对象的方法。

方法 描述
getOutputStream() 返回字节输出流对象 ServletOutputStream
getWrite() 返回字符输出流对象 PrintWriter
上一篇:Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页


下一篇:SolrCloud初识