Servlet API的查询网址:通过Tomcat的官网链接找到

可见,Servlet API有4个packages

  1. javax.servlet // 包含定义Servlet和Servlet容器之间契约的类和接口
  2. javax.servlet.http // 包含定义Http Servlet和Servlet容器之间契约的类和接口
  3. javax.servlet.annotation // 包含标注Servlet、Filter、Listener标注的标注。
  4. javax.servlet.description // 包含提供程序化登录web应用程序的配置信息的类型。

Servlet接口

Servlet技术的核心是javax.servelt.Servlet接口,该接口是所有Servlet类必须直接或者间接实现的一个接口。

Servlet接口定义了Servlet与Servlet容器之间的契约,即Servlet容器将Servlet类载入内存,并在Servlet实例上调用具体的方法,在每个应用程序中,每种Servlet类型只能有一个实例。

Servlet接口中定义了5个抽象方法

Servlet没有main()方法,所有的行为都由Servlet容器控制,调用Servlet方法时的参数也有Servlet容器传递。

ServletRequest接口

对于每一个HTTP请求,Servlet容器都会创建一个javax.servlet.ServletRequest实例,并将其传递给Servlet的service()方法。ServletRequest实例封装了这个HTTP请求的信息。

常用的方法有:

  1. public int getContentlength() // 获得请求主体的字节数
  2. public String getContentType() // 获取请求主体的MIME类型
  3. public String getProtocol() // 获得这个HTTP请求的协议名称和版本
  4. public String getParameter(String name) // 获取指定参数的值,通常用于返回HTML表单域的值或者查询字符串的值
  5. public String getParameterNames()
  6. public String getParameterMap()
  7. public String getParameterValues()

ServletResponse接口

javax.servlet.ServletResponse接口表示一个Servlet响应。在调用Servlet的service()方法前,Servlet容器会首先创建一个ServletResponse实例,并将其作为第二个参数传递给service(),ServletResponse隐藏了向浏览器发送相应的复杂过程。

常用方法有:

  1. public java.io.PrintWriter getWriter() // 得到一个向客户端发送文本的PrintWriter实例。默认使用ISO-8895-1编码
  2. public ServletOutputStream getOutputStream() // 用于发送二进制数据的
  3. pubic void setContentType(String type) // 设置相应的内容类型,比如"text/html"表示内容类型为HTML

ServletConfig接口

ServletConfig实例对象可以封装通过注解(@WebServlet)或者部署描述符(web.xml文件)传递给Servlet的初始配置信息。

当Servlet容器初始化Servlet时,Servlet容器会向Servlet的init()方法传入一个ServletConfig实例对象。因此在Servlet内部可以通过调用ServletConfig的响应方法获得初始参数的值

通过注解或者部署描述符传入的每一条信息就叫做一个初始参数。每个初始参数由key和value两个元件组成。

该接口只有4个方法

使用ServletConfig在Servlet中获取初始参数的范例

  1. package app01a;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5.  
  6. import javax.servlet.Servlet;
  7. import javax.servlet.ServletConfig;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.ServletRequest;
  10. import javax.servlet.ServletResponse;
  11. import javax.servlet.annotation.WebInitParam;
  12. import javax.servlet.annotation.WebServlet;
  13.  
  14. @WebServlet(name = "ServletConfigDemoServlet", urlPatterns = { "/servletConfigDemo" }, //url映射
  15. initParams = { @WebInitParam(name = "admin", value = "harry Taciak"), // 向Servlet中传入初始参数
  16. @WebInitParam(name = "emial", value = "admin@example.com") // 向Servlet中传入初始参数
  17. }
  18. )
  19. public class ServletConfigDemoServlet implements Servlet {
  20. private transient ServletConfig servletConfig;
  21. @Override
  22. public void destroy() { }
  23.  
  24. @Override
  25. public ServletConfig getServletConfig() {
  26. return this.servletConfig;
  27. }
  28.  
  29. @Override
  30. public String getServletInfo() {
  31. return "servletConfig demo";
  32. }
  33.  
  34. @Override
  35. public void init(ServletConfig servletConfig) throws ServletException {
  36. this.servletConfig = servletConfig;
  37. }
  38.  
  39. @Override
  40. public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
  41. ServletConfig servletConfig = getServletConfig();
  42. String admin = servletConfig.getInitParameter("admin");
  43. String email = servletConfig.getInitParameter("email");
  44. response.setContentType("text/html");
  45. PrintWriter writer = response.getWriter();
  46. writer.print("<html><head></head><body>" +
  47. "Admin: " + admin +
  48. "<br/>Email: " + email +
  49. "</body></html>");
  50. }
  51. }

ServletContext接口

ServletContext实例对象表示Servlet应用程序,每个Web应用程序只有一个上下文。

通过调用ServletConfig对象的getServletContext()方法,可以获得ServletContext实例对象。

ServletContext用于Web应用中的资源共享。有了ServletContext,就可以共享从应用程序中的所有资料出访问到的信息,并且可以动态注册Web对象。

ServletContext将Web对象保存在ServletContext中的一个内部Map中,保存在ServletContext中的对象称为属性。

GenericServlet抽象类

  1. public abstract class GenericServlet
  2. extends java.lang.Object
  3. implements Servlet, ServletConfig, java.io.Serializable

GenericServlet抽象类实现了Servlet接口和ServletConfig接口。并完成了以下工作:

-- 将init()方法中的ServletConfig对象赋给一个类的成员变量,来保存ServletConfig,从而可以通过调用getServletConfig()获得ServletConfig对象。其实现代码如下:

  1. public void init (ServletConfig servletConfig) throws ServletException {
  2. this.servletConfig = servletConfig;
  3. this.init(); // 这是 GenericServlet 提供的一个没有参数的init()方法,可以通过覆盖init()来提供初始化代码
  4. }

-- 为Servlet接口中的除了service()方法外提供默认的实现

-- 提供方法,包围ServletConfig中的方法.

HttpServlet抽象类

  1. public abstract class HttpServlet
  2. extends GenericServlet

HttpServlet类覆写了GenericServlet类中的service()方法;同时还重载了另外一个service() 方法,二者的参数类型不同。

覆盖后的service()方法将Servlet容器的ServletRequest和ServletResponse对象分别转化成HttpServletRequest和HttpServletResponse对象,并调用新的service()方法。

  1. public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
  2. HttpServletRequest request;
  3. HttpServletResponse response;
  4. try {
  5. request = (HttpServletRequest) req; // 类型转换
  6. response = (HttpServletResponse) resp; // 类型转换
  7. } catch (ClasscastException e) {
  8. throw new ServletException("non-Http request or response");
  9. }
  10. service(request, response); // 调用新的service()方法
  11. }
  12.  
  13. // 由于在调用Servlet的service()时,Servlet容器总会传入一个HttpServletRequest和一个HttpServletResponse,预备使用Http,因此这种转换总会成功。

然后,HttpServlet中的service()方法会检查用来发送请求的HTTP请求方法(通过调用HttpServletRequest的getMethod()方法获得),并根据HTTP方法调用相应的doGet()、doPost()、doHead()、doPut()、doTrace()、doOptions()、doDelete()中的一个。

因此不需要覆写service()方法了,只需要覆写相应的doXxx()即可,其中doGet()和doPost()最常用。

总之,HttpServlet有两个特性是GenericService()所不具备的

(1)不用覆写service()方法,而是覆写doGet()、doPost()、或者其他doXxx()方法

(2)使用HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。

HttpServletRequest接口

HttpServletRequest表示在HTTP环境中的ServletRequest。

  1. public interface HttpServletRequest
  2. extends ServletRequest

HttpServletResponse接口

HttpServletResponse表示在HTTP环境中的ServletResponse。

  1. public interface HttpServletResponse
  2. extends ServletResponse

Servlet API的更多相关文章

  1. Struts2中获取servlet API的几种方式

    struts2是一个全新的MVC框架,如今被广大的企业和开发者所使用,它的功能非常强大.这给我们在使用servlet 纯java代码写项目的时候带来了福音.但是一般来说,我们的项目不到一定规模并不需要 ...

  2. Servlet API遍程常用接口和类

    本文主要总结Servlet  API遍程常用接口和类 Servlet API http://tomcat.apache.org/tomcat-5.5-doc/servletapi/index.html ...

  3. Struts2中使用Servlet API步骤

    Struts2中使用Servlet API步骤 Action类中声明request等对象 Map<String, Object> request; 获得ActionContext实例 Ac ...

  4. 【SpringMVC】SpringMVC系列8之Servlet API 作为入参

    8.Servlet API 作为入参 8.1.概述 MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数: HttpServletRequest HttpServletRes ...

  5. Struts2 Action与Servlet API耦合

    单元测试在开发中是非常重要的一个环节程序员在写完代码时,相应的单元测试也应写完整,否则你的代码就是不能让人信服的Struts2将Action与Servlet的API进行解耦之后,就使得单元测试变得非常 ...

  6. struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

    Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...

  7. Action访问Servlet API

    访问Servlet API 1.通过ActionContent类访问Servlet API ActionContext中访问Servlet API的几个常用的方法: (1)Map getApplica ...

  8. SingleThreadModel is deprecated in Servlet API version 2.4

    Ensures that servlets handle only one request at a time. This interface has no methods. If a servlet ...

  9. struts2访问servlet API

    搭建环境: 引入jar包,src下建立struts.xml文件 项目配置文件web.xml. web.xml: <?xml version="1.0" encoding=&q ...

  10. struts2中访问servlet API

    Struts2中的Action没有与任何Servlet API耦合,,但对于WEB应用的控制器而言,不访问Servlet API几乎是不可能的,例如需要跟踪HTTP Session状态等.Struts ...

随机推荐

  1. 大型运输行业实战_day13_1_定时任务spring-quartz

    1.jar包 拷贝quartz-2.2.3.jar包到项目 2.编写定时任务类TicketQuart.java package com.day02.sation.task; import com.da ...

  2. target=_blank攻击

    [target=_blank攻击] 在<a>标签中加入 rel="noopener noreferrer" 来避免. 参考:https://mathiasbynens. ...

  3. NBU 还原LINUX ORACLE RAC数据库(CRM)

    CRM集群数据库恢复 linux centos 6.6 oracle 11.2.0.3 集群环境 1.53 oraclea 1.54 oracleb 在linux操作系统root用户下安装好NBUci ...

  4. CRTD模拟MFG工单进行绑定优化

    需求:按单按库生产的CRTD状态半成品工单重复创建问题 绑定成功案例: SELECT DEMANDLINEID,SUPPLYORDERID,DEMANDORDERID,QTYALLOCATED,ITE ...

  5. web 浏览器窗口

    1.窗口位置: 取得浏览器窗口左边和上边距屏幕左边和上边的位置 var leftPos = (typeof window.screenLeft == "number")? wind ...

  6. Appium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks

    问题: 使用Apppium1.6启动ios9.3报错Original error: Sdk '9.3.5' was not in list of simctl sdks   我的启动配置如下 {   ...

  7. as3.0划线带撤销功能

    package com{ import flash.display.MovieClip; import flash.display.SimpleButton; import flash.events. ...

  8. label标签的显示和隐式关联问题

    按钮的html <!-- 学校 --> <div class="layui-inline"> <label class="layui-for ...

  9. oracle 修改数据精度问题

    今天,在建表后插入语句时,报了这样的错误,对于这样的错误,搜集了一些资料,进行了总结如下: 建表语句: 1 2 3 4 5 6 7 8 9 create table pre_info( pre_cod ...

  10. 模板】AC自动机(简单版)

    模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...