02. Servlet 主要API介绍

来源:互联网 发布:当店家软件 编辑:程序博客网 时间:2024/05/18 20:33


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)方法,如下:

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()方法,如下:
1
public void service(HttpServletRequest req,HttpServletResponse res){
2
    super.service(req,res);
3
    ......
4
}

ServletRequest 接口

ServletRequest 用于表示客户端的请求,提供了一系列用于读取客户端请求数据的方法,常用API如下;
请求范围与属性相关setAttribute(String name,Object obj)在请求范围保存一个属性getAttribute(String name)在请求范围内返回一个指定属性removeAttribute(String name)在请求范围内删除指定属性请求报头相关getContentLength()返回请求正文长度,未知时返回-1getContentType()返回请求正文的MINE类型,未知时返回nullgetParameter(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行中的URLgetQueryString()返回 HTTP 请求中的查询字符串,即 URL 中"?"之后的内容

ServletReponse 接口

ServletReponse 用于生成响应结果,常用的API如下;
getCharacterEncoding()获取响应正文的字符编码getContentType()获取相应正文的 MINE 类型getBufereSize()获取存放相应正文的缓冲区大小,单位bytesetCharacterEncoding(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)设置存放相应正文缓冲区大小,单位bytesetContentLength(int len)设置响应正文长度reset()清空缓冲区内的正文数据,同时清除相应码状态、响应头resetBuffer()清空缓冲区内的正文数据,不清除相应码状态、响应头flushBuffer()强制将缓冲区内的响应正文发送到客户端isCommitted()返回缓冲区内的数据是否提交给客户getOutputStream()获取传输二级制正文的 ServletOutputStreamgetWriter()获取传输字符串形式正文的 PrintWriter
一般一个 ServletReponse 响应客户端的过程如下:
  • 设置响应正文的MIME类型或CharacterEncoding类型;
  • 获取响应正文的 ServletOutputStream 或 PrintWriter 对象;
  • ServletOutputStream 或 PrintWriter 对象写入数据;
  • 当缓存区内的数据已满时,ServletOutputStream 或 PrintWriter 对象会自动将数据发送到客户端,并清空缓冲区;
  • 当向流写入数据结束时,Servlet 容器调用 ServletReponse对象的 flushBuffer()方法,之后调用ServletOutputStream 或 PrintWriter的flush()或close() 方法;
简单示例
1
class DemoServlet extends GenericServlet{
2
    ...
3
    public service(ServletRequest request,ServletResponse reponse) throws ServletException, IOException{
4
        
5
        reponse.setContenttype("text/html;charset=UTF-8")
6
        PrintWriter out = reponse.getWriter();
7
        out.println("<html><title>test</title><body><p>hello world<p/></body><html>");
8
        //以下过程也可以省略
9
        out.flushBuffer();
10
        out.flush();
11
        out.close();
12
    }
13
    ...
14
}

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  400HttpServletReponse. SC_FOUND 302HttpServletReponse. SC_METHOD_NOT_ALLOWED405HttpServletReponse. SC_NON_AUTHORITATIVE_INFORMATION203HttpServletReponse. SC_FORBIDDEN403HttpServletReponse. SC_NOT_FOUND404HttpServletReponse. SC_OK200


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)保存一个属性到 ServletContextgetAttribute(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)返回一个映射到指定路径的URLgetResourceAsStream(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() 方法获取;
RequestDispatcher主要的API如下:
forward(ServletRequest request, ServletResponse response)
将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。此方法允许一个 servlet 对请求进行初步处理,并使另一个资源生成响应;
include(ServletRequest request, ServletResponse response)
包含响应中某个资源(servlet、JSP 页面和 HTML 文件)的内容。事实上,此方法支持编程式服务器端包含。
关于 RequestDispatcher转发和包含的用法详见:点击打开链接




原创粉丝点击