在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

Servlet 核心接口的更多相关文章

  1. Java Web 学习与总结(二)Servlet核心接口+Servlet3.0配置

    Servlet3.0版本对Servlet配置进行了重大变革,Servlet类不需要再麻烦的去编辑web.xml文件了,只需要在类上面进行注释就可以了,获得了 Java 社区的一片赞誉之声,以下是新增的 ...

  2. Hibernate(三)__核心接口和类

    该图显示了核心接口类以及配置文件的关系层次,越往下越偏向底层数据库. 1. hibernate.cfg.xml文件 ①该文件主要用于指定各个参数,是hibernate核心文件 ②默认放在src目录下, ...

  3. hibernate核心接口,和扩展接口。回顾笔记,以前没记,现在补上,纯手工敲的。

    hibernate核心接口: 所有的hibernate应用都会访问hibernate的5个核心接口 1,Configuration接口 Configuration用于配置并且根启动Hibernate. ...

  4. Servlet相关接口和Servlet的生命周期

    http://www.cnblogs.com/luotaoyeah/p/3860292.html Servlet相关接口和Servlet的生命周期 创建一个Servlet类最直接的方式是实现javax ...

  5. Hibernate详解(5)——Hibernate核心接口和工作原理

    Hibernate核心接口 Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration .这五个接口构成了Hi ...

  6. spring中基础核心接口总结

    spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...

  7. JavaEE Servlet 核心方法及生命周期

    做JavaWeb开发,免不了要和Servlet打交道.Servlet是Sun(Oracle)官方定义的一个Web开发规范,所有Servlet开发都必须遵守.自己以前也没有从头做过Web开发,所以这方面 ...

  8. Hibernate的核心接口

    Hibernate5个核心接口 所有Hibernate应用中都会访问Hibernate的5个核心接口 Configuration接口:配置Hibernate,根启动Hibernate,创建Sessio ...

  9. Spring Boot REST(一)核心接口

    Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...

随机推荐

  1. 并发编程之 ThreadLocal 源码剖析

    前言 首先看看 JDK 文档的描述: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局 ...

  2. 杭电 OJ 提交代码需要注意的问题

    杭电acm 提交代码需要注意的问题 1. 用 Java 的时候类名请用 Main 2. Java 提交出现 PE 的可能原因有 1) 最基本的错误是空格问题,比如注意每行的末尾是否输出空格 2) 用 ...

  3. Spring全家桶系列–SpringBoot渐入佳境

    //本文作者:cuifuan //本文将收录到菜单栏:<Spring全家桶>专栏中 首发地址:https://www.javazhiyin.com/20913.html 萌新:小哥,我在实 ...

  4. 记一次Full GC问题的排查

    今天看到监控平台显示项目的Full GC次数过多,查看了一下监控曲线,如下图,发现发生的时间点基本上都是在上午十点之后,到下午五点. 分析:考虑到业务形态,开始初步怀疑是访问人数增多引起的虚拟机内存不 ...

  5. Flask如何给多个视图函数增加装饰器

    这几天在学习Flask, 遇到了些小问题,比如说怎么给多个视图函数加相同的装饰器 给单独一个视图函数加装饰器的话很简单,写一个装饰器,然后直接加在原装饰器下面即可,多个的话,会报这样一个错误: 这个异 ...

  6. 你不知道的JavasScript上篇·第三章·对象

    1.Object.defineProperty()&&getter.setter Object.defineProperty(目标对象,属性名(string型),{ get:funct ...

  7. 高性能JavaScript(编程实践)

    避免双重求值JavaScript 允许你在程序中提取一个包含代码的字符串,然后动态执行,有四种方法可以实现,eval(),Function() 构造函数 settimeout 和 setinterva ...

  8. Android 投射工具和录屏工具

    前言 写博客,难免需要上传手机截图或者是Gif文件,分享两个常用的工具 GifCam GifCam,一个简单的 屏幕录制工具,可以实现Gif的录制编辑和保存 Total Control Total C ...

  9. Maven学习(六)maven使用中遇到的坑

    坑1:使用eclipse构建web项目时,pom.xml中 <packaging>war</packaging> 报错 eclipse给出的报错信息提示是:web.xml is ...

  10. [Swift] Swift笔记

    开始整理Swift笔记了.打算直接用Playground去写,里面自带的Markup语法和Markdown差不多,显示的效果也不差于博客.而且用Xcode看代码也方便.所以这部分内容不再在博客里记录了 ...