在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 |