Servlet 主要API介绍
- Servlet API 主要由2个Java包构成:javax.servlet 、java.servlet.http;
- javax.servlet 包定义了与 Servlet 接口相关的通用接口和类;
- java.servlet.http 包主要定义了与HTTP协议相关的 HttpServlet类、HttpServletRequest类、HttpServletResponse类;
Servlet 接口
Servlet API 的核心为 javax.servlet.Servlet 接口,所有Servlet类必须实现该接口;
其中定义的接口方法如下:
|
void init(ServletConfig config)
| 负责初始化Servlet对象,容器在创建Servlet对象后,会调用该方法 |
|
void service(ServletRequest req, ServletResponse res)
| 负责响应客户的请求,为客户提供相应服务 |
|
void destroy()
| 负责释放 Servlet 对象占用的资源,但Servlet对象结束生命周期时,会调用该方法 |
|
ServletConfig getServletConfig()
| 返回 ServeltConfig 对象,包含Servlet的初始化信息 |
|
String getServletInfo()
| 返回包含Servlet创建者、版本信息等的字符串 |
Servlet API 中,javax.servlet.GenericServlet 抽象类 和 其子类 java.servlet.http.HttpServlet 实现了 Servlet 接口,用户开发自己的Servlet类时,一般如果没有特殊需求,可以选择直接通过继承这2个类来实现;
GenericServlet 抽象类
对于GenericServlet类的 init() 方法,如果希望当前 Servlet 类对象与 ServeltConfig 对象关联,在初始化方法中应调用 super.init(config)方法,如下:
public void init(ServletConfig config){
super.init(config);
......
}
HttpServlet 抽象类
HttpServlet 是 GenericServlet 的子类,拓展了与http协议相关的方法,主要有如下:
| doGet(HttpServletRequest req, HttpServletResponse res) | 处理 GET 请求 |
| doPost(HttpServletRequest req, HttpServletResponse res) | 处理 POST 请求 |
| doPut(HttpServletRequest req, HttpServletResponse res) | 处理 PUT 请求(主要用于FTP) |
| doDelete(HttpServletRequest req, HttpServletResponse res) | 处理 DELETE 请求(主要用于FTP) |
HttpServlet 的在处理请求的过程中,会首先调用service()方法,service方法()在判断请求类型之后,根据请求类型调用相应的doGet,doPost,doPut,doDelete等方法,如果要维持以上的调用特性,在继承HttpServlet重写service()方法时,要首先调用super.service()方法,如下:
public void service(HttpServletRequest req,HttpServletResponse res){
super.service(req,res);
......
}
ServletRequest 接口
ServletRequest 用于表示客户端的请求,提供了一系列用于读取客户端请求数据的方法,常用API如下;
| 请求范围与属性相关 | |
| setAttribute(String name,Object obj) | 在请求范围保存一个属性 |
| getAttribute(String name) | 在请求范围内返回一个指定属性 |
| removeAttribute(String name) | 在请求范围内删除指定属性 |
| 请求报头相关 | |
| getContentLength() | 返回请求正文长度,未知时返回-1 |
| getContentType() | 返回请求正文的MINE类型,未知时返回null |
| getParameter(String name) | 返回指定请求参数的参数值 |
| getLocalAddr() | 返回服务器端的IP地址 |
| getLocalName() | 返回服务器端的主机名 |
| getLocalPort() | 返回服务器端的 FTP 端口号 |
| getRemoteAddr() | 返回客户端的IP地址 |
| getRemoteHost() | 返回客户端的主机名 |
| getRemotePort() | 返回客户端的 FTP 端口号 |
| getProtocol() | 返回客户端与服务端通信的协议名称和版本号 |
| getInputStream() | 返回用于读取请求正文的 InputStream 对象 |
| getReader() | 返回用于读取请求正文的 BufferedReader 对象 |
※ 关于请求范围的概念,详见 点击打开链接
HttpServletRequest 接口
HttpServletRequest 是 ServletRequest 的子接口,在 ServletRequest 提供的方法的基础上,提供了http相关的支持方法,主要API如下:
| getContextPath() | 返回客户端请求所访问的 Web 应用的 URL 入口,如客户端访问的 URL 为 http://localhost:8080/helloApp/welcome,该方法返回"/helloApp" |
| getCookies() | 返回 HTTP 请求中的所有cookie,返回一个Cookie[] 数组 |
| getHeader(String name) | 返回 HTTP 头部中的特定项目 |
| getHeaderNames() | 返回一个包含 HTTP 头部所有信息的 Enumeration 对象 |
| getMethod() | 返回 HTTP 的请求方法(METHOD_GET,METHOD_POST等) |
| getRequestURL() | 返回 HTTP 请求头部第1行中的URL |
| getQueryString() | 返回 HTTP 请求中的查询字符串,即 URL 中"?"之后的内容 |
ServletReponse 接口
ServletReponse 用于生成响应结果,常用的API如下;
| getCharacterEncoding() | 获取响应正文的字符编码 |
| getContentType() | 获取相应正文的 MINE 类型 |
| getBufereSize() | 获取存放相应正文的缓冲区大小,单位byte |
| setCharacterEncoding(String charset) | 设置响应正文的字符编码,charset值参照http://www.iana.org/assignments/character-sets,常用 “UTF-8”“GBK”“GB_2312-80” |
| setContentType(String type) | 设置响应正文的 MINE 类型,如字符串"text/html;charset=UTF-8" |
| setBufereSize(int size) | 设置存放相应正文缓冲区大小,单位byte |
| setContentLength(int len) | 设置响应正文长度 |
| reset() | 清空缓冲区内的正文数据,同时清除相应码状态、响应头 |
| resetBuffer() | 清空缓冲区内的正文数据,不清除相应码状态、响应头 |
| flushBuffer() | 强制将缓冲区内的响应正文发送到客户端 |
| isCommitted() | 返回缓冲区内的数据是否提交给客户 |
| getOutputStream() | 获取传输二级制正文的 ServletOutputStream |
| getWriter() | 获取传输字符串形式正文的 PrintWriter |
一般一个 ServletReponse 响应客户端的过程如下:
- 设置响应正文的MIME类型或CharacterEncoding类型;
- 获取响应正文的 ServletOutputStream 或 PrintWriter 对象;
- 向ServletOutputStream 或 PrintWriter 对象写入数据;
- 当缓存区内的数据已满时,ServletOutputStream 或 PrintWriter 对象会自动将数据发送到客户端,并清空缓冲区;
- 当向流写入数据结束时,Servlet 容器调用 ServletReponse对象的 flushBuffer()方法,之后调用ServletOutputStream 或 PrintWriter的flush()或close() 方法;
简单示例
class DemoServlet extends GenericServlet{
...
public service(ServletRequest request,ServletResponse reponse) throws ServletException, IOException{
reponse.setContenttype("text/html;charset=UTF-8")
PrintWriter out = reponse.getWriter();
out.println("<html><title>test</title><body><p>hello world<p/></body><html>");
//以下过程也可以省略
out.flushBuffer();
out.flush();
out.close();
}
...
}
HttpServletReponse 接口
HttpServletReponse 是 ServletReponse 的子接口,实现了与http相关的方法,常用的API如下:
| addHeader(String name,String value) | 向 HTTP 响应头添加一些内容 |
| sendError(int sc,[String msg]) | 向客户端发送一个代表特定错误的HTTP响应状态代码和错误信息 |
| setHeader(String ,String value) | 修改 HTTP 相应头的内容 |
| setStatus(int sc) | 设置 HTTP 响应的状态码 |
| addCookie(Cookie cookie) | 向 HTTP 响应中加入一个Cookie |
HttpServletReponse 中定义了一些 HTTP 响应状态码的静态常量
| HttpServletReponse.SC_BAD_REQUEST | 400 |
| HttpServletReponse. SC_FOUND | 302 |
| HttpServletReponse. SC_METHOD_NOT_ALLOWED | 405 |
| HttpServletReponse. SC_NON_AUTHORITATIVE_INFORMATION | 203 |
| HttpServletReponse. SC_FORBIDDEN | 403 |
| HttpServletReponse. SC_NOT_FOUND | 404 |
| HttpServletReponse. SC_OK | 200 |
ServletConfig 接口
ServletConfig 用于保存 Servlet 初始化信息,在 Servlet对象初始化方法 init(ServletConfig config)中使用;
| getInitParameter(String name) | 返回指定的配置参数 |
| getInitParameterNames() | 返回一个包含所有配置参数的 Enumeration 对象 |
| getServletContext() | 返回ServletContext对象 |
| getServletName() | 返回 Servlet 的名字,即web.xml中对应<servlet>的<servlet-name>元素 |
ServletContext 接口
- ServletContex是 Servlet 与 Servlet容器 之间进行通信的接口;
- Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对象,同一个 Web应用的所有Servlet共享一个ServletContext;Servlet对象们通过它们的ServletContext访问容器中的各种资源;
- ServletContext对象可以在 GenericServlet , HttpServlet 中通过调用 getServletContext() 获取;
ServletContext提供的API方法可以分为以下几类:
| 用于在 Web 应用范围内存共享数据 | |
| setAttribute(String name,Object obj) | 保存一个属性到 ServletContext |
| getAttribute(String name) | 在 ServletContext 内返回一个指定属性 |
| getAttributNames() | 返回一个包含所有ServletContext中属性的Enumeration对象 |
| removeAttribute(String name) | 在 ServletContext 内删除指定属性 |
| 访问当前 Web 应用的资源 | |
| getContextPath() | 返回当前 Web 应用的 URL 入口 |
| getInitParameter(String name) | 返回 Web 应用范围内的初始化配置参数 |
| getInitParameterNames() | 返回包含一个包含Web 应用范围内所有初始化配置参数的Enumeration对象 |
| getServletContextName() | 返回当前 Web 应用的名称,即 web.xml 文件中的<display-name>元素值 |
| getRequestDispatcher(String name) | 返回一个用于指向其他Web 组件转发请求的 RequestDispatcher 对象 |
| 访问 Servlet 容器中的其他 Web 应用 | |
| getContext(String urlpath) | 根据指定的URL,返回当前 Servlet容器的其他Web应用的ServletContext对象; 给定的URL必须以"/"为开头,起始路径为服务器的根文档进行解释; 假如一个Servlet容器根目录中包含demoApp,helloApp 2个Web程序,从demoApp的一个Servlet访问helloApp中的ServletContext,该函数URL路径参数为“/helloApp”; |
| 访问 Servlet 容器的相关信息 | |
| getMajorVersion() | 返回 Servlet容器 支持的 Java Servlet API 的主版本号 |
| getMinorVersion() | 返回 Servlet容器 支持的 Java Servlet API 的次版本号 |
| getServletInfo() | 返回 Servlet容器 的名字和版本 |
| 访问服务器端的文件系统资源 | |
| getRealPath(String path) | 根据指定的虚拟路径,返回文件系统的一个真实路径 |
| getResource(String path) | 返回一个映射到指定路径的URL |
| getResourceAsStream(String path) | 返回一个用于读取参数指定文件的输入流(常用) |
| getMimeType(String file) | 获取指定参数路径的文件的MIME类型 |
| 输出日志 | |
| log(String msg) | 向 Servlet 的日志文件中写入日志 |
| log(String message,java.lang.Throwable throwable) | 向 Servlet 的日志文件中写入错误日志,和异常堆栈信息 |
RequestDispatcher 接口
- RequestDispatcher用于收来自客户端的请求并将它们发送到服务器上的任何资源(比如 servlet、HTML 文件或 JSP 文件)的对象 ,在整个Servlet模型中用于转发和包含,
- RequestDispatcher 对象可以由 ServletContext 的 getRequestDispatcher() 方法获取;
|
forward(ServletRequest request, ServletResponse response)
|
将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。此方法允许一个 servlet 对请求进行初步处理,并使另一个资源生成响应; |
|
include(ServletRequest request, ServletResponse response)
|
包含响应中某个资源(servlet、JSP 页面和 HTML 文件)的内容。事实上,此方法支持编程式服务器端包含。
|
关于 RequestDispatcher转发和包含的用法详见:点击打开链接

本文详细介绍了Servlet的主要API,包括Servlet接口、GenericServlet和HttpServlet抽象类,以及ServletRequest、HttpServletRequest、ServletResponse和HttpServletResponse接口。特别讨论了如何设置响应类型、向客户端发送数据以及ServletConfig和ServletContext在Servlet容器中的作用。RequestDispatcher接口的角色也在文中被提及,它是转发和包含请求的关键。
428

被折叠的 条评论
为什么被折叠?



