在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. async/await 与 generator、co 的对比

    之前写过一个分批预加载资源的插件,其实质便是串行执行异步,使用的方法是generator + promise -- 前几天写了一个爬虫,抓取页面的n个页面的音频资源,其也是串行执行异步,但是在使用的a ...

  2. C# 枚举器和迭代器

    一.枚举器(enumerator)和可枚举类型(enumeration) 我们都知道foreach语句可以用来遍历数组中的元素,但你有没有想过为什么它可以被foreach处理呢? 这是因为数组可以按需 ...

  3. [Luogu 2656] 采蘑菇

    Description 小胖和ZYR要去ESQMS森林采蘑菇. ESQMS森林间有N个小树丛,M条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的蘑菇.小胖和ZYR经过某条小径一次,可以采 ...

  4. UIKit 框架之UIControl

    前面的UIWebView.UIImageView这些都是视图,显示为主,与用户交互较少,最多也就是通过UIResponder与用户交互.但这样会很麻烦,还要判断点击次数等等问题,那问题就来了:OC中怎 ...

  5. 使用IcoMoon生成图标字体

    就我个人而言,往往要想找点什么ICON素材啊,往往都是酱婶滴,先去FontAwesome(在线图标字体库,但资源有限)里面巴拉巴拉,或者其他资源看看有没有合适的.如果没有就去求助我们大UI,笑笑给我来 ...

  6. c#中Socket网络通信的入门

    请访问 http://balabiu.com/?p=16 后续本文更新将在这里: 将设计服务器端异步接受客户端连接和客户端消息.

  7. 几种流行的AJAX框架对比:Jquery,Mootools,Dojo,ExtJs,Dwr

    1:Jquery 主页:http://jquery.com/ 设计思想:简洁的方案思想,几乎所有操作都是以选择DOM元素(有强大的Selector)开始,然后是对其的操作(Chaining等特性). ...

  8. 第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍

    第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structur ...

  9. Java - Iterator源码解析

    java提高篇(三十)-----Iterator 迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式.Iterator模式是用于遍历集合类的标准 ...

  10. BCB 读写Word文档

    void __fastcall TForm1::btn1Click(TObject *Sender) { Variant WordApp,WordDocs,WordDoc; Variant word_ ...