UML 类图
1. public abstract class HttpServlet extends GenericServlet
2. public abstract class GenericServlet implements Servlet, ServletConfig,
java.io.Serializable
3. 在 Servlet 中有 方法
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
4. 在 HttpServlet 中有 方法
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
......
}
Servlet 接口
- init():在 Servlet 实例化之后,Servlet 容器会调用 init() 方法,来初始化该对象,主要是为了让 Servlet 对象在处理客户请求前可以完成一些初始化的工作,例如,建立数据库的连接,获取配置信息等。
对于每一个 Servlet 实例,init() 方法只能被调用一次。init() 方法有一个类型为 ServletConfig 的参数,Servlet 容器通过这个参数向 Servlet 传递配置信息。Servlet 使用 ServletConfig 对象从 Web 应用程序的配置信息中获取以名-值对形式提供的初始化参数。
另外,在 Servlet 中,还可以通过 ServletConfig 对象获取描述 Servlet 运行环境的 ServletContext 对象,使用该对象,Servlet 可以和它的Servlet 容器进行通信。
- service():容器调用 service() 方法来处理客户端的请求。要注意的是,在 service() 方法被容器调用之前,必须确保 init() 方法正确完成。
容器会构造一个表示客户端请求信息的请求对象(类型为 ServletRequest )和一个用于对客户端进行响应的响应对象(类型为 ServletResponse )作为参数传递给 service() 方法。
在 service() 方法中,Servlet 对象通过 ServletRequest 对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse 对象的方法设置响应信息。
- destroy():当容器检测到一个Servlet对象应该从服务中被移除的时候,容器会调用该对象的 destroy() 方法,以便让 Servlet 对象可以释放它所使用的资源,保存数据到持久存储设备中,例如,将内存中的数据保存到数据库中,关闭数据库的连接等。
当需要释放内存或者容器关闭时,容器就会调用 Servlet 对象的 destroy() 方法。在 Servlet 容器调用 destroy() 方法前,如果还有其他的线程正在 service() 方法中执行,容器会等待这些线程执行完毕或等待服务器设定的超时值到达。一旦 Servlet 对象的 destroy() 方法被调用,容器不会再把其他的请求发送给该对象。
如果需要该 Servlet 再次为客户端服务,容器将会重新产生一个 Servlet 对象来处理客户端的请求。在 destroy() 方法调用之后,容器会释放这个 Servlet 对象,在随后的时间内,该对象会被 Java 的垃圾收集器所回收。
-
getServletConfig():该方法返回容器调用 init() 方法时传递给 Servlet 对象的 ServletConfig 对象,ServletConfig 对象包含了 Servlet 的初始化参数。
-
getServletInfo():返回一个String 类型的字符串,其中包括了关于 Servlet 的信息,例如,作者、版本和版权。该方法返回的应该是纯文本字符串,而不是任何类型的标记(HTML、XML等)。
ServletRequest 和 ServletResponse
Servlet 由 Servlet 容器来管理,当客户请求到来时,容器创建一个 ServletRequest 对象,封装请求数据,同时创建一个 ServletResponse对象,封装响应数据。这两个对象将被容器作为 service() 方法的参数传递给 Servlet,Servlet 利用 ServletRequest 对象获取客户端发来的请求数据,利用 ServletResponse 对象发送响应数据。
ServletRequest 接口常用方法:
- public Object getAttribute(String name);返回以 name为名字的属性的值。
- public Enumeration getAttributeNames();返回一个包含可用于此请求的属性名称的Enumeration 。 如果请求没有可用的属性,则此方法返回一个空的Enumeration
- public void removeAttribute(String name);移除请求中 名字为 name 的属性。
- public void setAttribute(String name, Object o);在请求中保存名为 name 的属性。如果第二个参数为 null, 则相当于调用 removeAttribute。
- public String getCharacterEncoding();获取请求正文使用的字符编码的名字
- public int getContentLength();以字节为单位,返回请求正文的长度。如果长度位置,返回 -1.
- public String getContentType();返回请求正文的 MIME 类型,如果未知,则返回 null。
- public ServletInputStream getInputStream() throws IOException;返回一个输入流,使用该输入流可以以二进制的方式读取请求正文的内容。他是一个抽象类,继承自 java.io.InputStream
- public BufferedReader getReader() throws IOException;返回一个 BufferedReader 对象,以字符数据方式读取请求真正文。
- public String getLocalName();返回接收到请求的 IP 接口的主机名。
- public int getLocalPort();返回接收到请求的网络接口的 IP 端口号。
- public String getParameter(String name);返回请求中 name 参数的值,如果name 参数有多个值,值返回列表的第一个。
- public Enumeration getParameterNames();返回请求中包含的所有参数的名字。
- public String[] getParameterValues(String name);返回请求中 name 参数所有的值。
- public String getProtocol();返回请求使用的协议的名字和版本。
- public String getRemoteAddr();返回发送请求的客户端或者最后一个代理服务器的 IP 地址。
- public String getRemoteHost();返回发送请求的客户端或者最后一个代理服务器的完整限定名。
- public int getRemotePort();返回发送请求的客户端或者最后一个代理服务器的 IP 源端口。
- public RequestDispatcher getRequestDispatcher(String path);返回 RequestDispatcher 对象,作为 path 所定位的资源的封装。
- public String getServerName();返回请求发送到服务器的主机名
- public int getServerPort();返回请求发送到的服务器的端口号。
- public void setCharacterEncoding(String env) throws java.io.UnsupportedEncodingException;覆盖在请求正文中所使用的字符编码的名字。
ServletResponse 接口
- public void flushBuffer() throws IOException;强制把任何在缓存中的内容发送到客户端
- public int getBufferSize();返回实际用于响应的缓存的大小。
- public String getCharacterEncoding();返回在响应中发送的正文所使用的字符编码(MIME 字符集)
- public String getContentType();返回在响应中发送的正文所使用 MIME 类型。
- public ServletOutputStream getOutputStream() throws IOException;返回 ServletOutputStream 对象,用于在响应中写入二进制数据。
- public PrintWriter getWriter() throws IOException;返回 PrintWriter 对象,用于发送字符文本到客户端。PrintWriter对象使用getCharacterEncoding()方法返回的字符编码。如果没有指定响应的字符编码方式,默认将使用ISO-8859-1。
- public boolean isCommitted();指示是否已经提交了响应。
- public void reset();清楚在缓存中的任何数据,包括状态码和消息报头。
- public void resetBuffer();清楚缓存中的响应内容,保留状态码和消息报头。
- public void setBufferSize(int size);设置响应正文的首选缓冲区大小。 servlet 容器将使用至少与请求大小一样大的缓冲区。 使用的实际缓冲区大小可以使用getBufferSize找到。
更大的缓冲区允许在实际发送任何内容之前写入更多内容,从而为 servlet 提供更多时间来设置适当的状态代码和标题。 较小的缓冲区减少了服务器内存负载并允许客户端更快地开始接收数据。
必须在写入任何响应正文内容之前调用此方法; 如果已写入内容或已提交响应对象,则此方法将引发IllegalStateException 。
- public void setCharacterEncoding(String charset);设置发送到客户端的响应的字符编码,例如 ,UTF-8
- public void setContentLength(int len);在响应中,设置 内容正文的长度,这个方法设置 HTTP Content-Length 实际报头
- public void setContentType(String type);设置要发送到客户端的响应的内容类型,此时响应应该还没有提交。给出的内容类型可以包括字符编码说明,例如:text/html;charset=UTF-8。如果这个方法在getWriter()方法被调用之前调用,那么响应的字符编码将仅从给出的内容类型中设置。这个方法如果在getWriter()方法被调用之后或者在响应被提交之后调用,将不会设置响应的字符编码。在使用HTTP协议的情况中,这个方法设置Content-Type实体报头。
这些方法都没有必要记,列出来就是为了有个宏观的认识。
ServletConfig
Servlet 容器使用 ServletConfig 对象在 Servlet 初始化期间向他传递配置信息,一个 Servlet 只有 一个 ServletConfig 对象。
- public String getInitParameter(String name);返回名字为 name 的初始化参数的值。初始化参数在 web.xml 配置文件中进行配置。
- public Enumeration getInitParameterNames();返回 Servlet 所有初始化参数的名字的枚举类集合。
- public ServletContext getServletContext();返回上下文引用对象。
- public String getServletName();返回 Servlet 实例的名字。这个名字是在 Web 应用程序的部署描述符中指定的。如果是一个没有注册的 Servlet 实例,这个方法返回将是 Servlet 的类名。
结构
Servlet是Web应用程序中的一个组件。一个Web应用程序是由一组Servlet、HTML页面、类,以及其他的资源组成的运行在Web服务器上的完整的应用程序,以一种结构化的有层次的目录形式存在。
组成Web应用程序的这些资源文件要部署在相应的目录层次中,根目录代表了整个Web应用程序的根。我们通常是将Web应用程序的目录放到%CATALINA_HOME%\webapps目录下,在webapps目录下的每一个子目录都是一个独立的Web应用程序,子目录的名字就是Web应用程序的名字,也称为Web应用程序的上下文根。用户通过Web应用程序的上下文根来访问Web应用程序中的资源
WEB-INF目录下的classes和lib目录都可以存放Java的类文件,在Servlet容器运行时,Web应用程序的类加载器将首先加载classes目录下的,其次才是lib目录下的类。如果这两个目录下存在同名的类,起作用的将是classes目录下的类。
可以看到一个特殊的目录 WEB-INF 。因为这个目录不属于 Web应用程序可以访问的一部分,对客户端来说,这个目录是不可见的。如果将 index.html 放到 WEB-INF 下,客户端无法通过以下方式访问:
http://localhost:8080/ech2/WEB-INF/index.html
不过,WEB-INF 下的慕容对于 Servlet 代码是可见的,在 Servlet 中可以通过调用 ServletContext 对象中的 getResource 或者 getResourceAsStream 方法来访问 WEB-INF 下的资源,也可以使用 RequestDispatcher 调用 将WEB-INF 下的内容呈现给客户端。
Web 应用的配置和部署
web 应用程序的配置和部署是通过 web.xml 文件来完成的。 web.xml 文件被称为 Web 应用程序的部署描述符,他可以包含如下的配置和部署信息。
- ServletContext的初始化参数
- Session的配置
- Servlet/JSP的定义和映射
- 应用程序生命周期监听器类
- 过滤器定义和过滤器映射
- MIME类型映射
- 欢迎文件列表
- 错误页面
· 语言环境和编码映射 - 声明式安全配置
- JSP配置
下一节:编写 Servlet