一、什么是Servlet
API上给了下面的解释:
A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.
根据上面的解释,我们可以这样描述Servlet的工作流程:
1、客户端向服务端发送请求;
2、服务端将请求信息发送给Servlet;
3、Servlet处理请求信息并生成响应,再传给服务器;
4、服务器向客户端发送响应。
二、Servlet是如何工作的
在下面,首先给出下面一张图(图1):
首先,请先不要吐槽这张图难看。。。
图中,需要特别注意的是这几个类和接口,注意他们都继承了谁,实现了谁:
接口:Servlet、ServletRequest(Response)、HttpServletRequest(Response);
类:HttpServlet
下面逐一介绍这几个类和接口:
1、 Servlet接口
Servlet接口的主要方法有:
- void:destroy();
- ServletConfin:getServletConfig();
- java.lang.String:getServletInfo();
- void:init(ServletConfig);
- void:service(ServletRequest, ServletResponse);
一个Servlet类必须要实现这个接口(图里面GenericServlet实现了Servlet接口,基本实现了Servlet的方法,而GenericServlet的子类需要实现service方法),同时,观察这个接口的方法,通过init(ServletConfig)、service(ServletRequest, ServletResponse)、destroy()这几个主要方法,我们可以看到Servlet类的生命周期:
1、调用构造方法实例化Servlet类;
2、Servlet容器调用init方法,根据ServletConfig初始化Servlet实例;
3、Servlet容器调用service方法处理ServletRequest对象和ServletResponse对象;(这是Servlet实例的核心业务处理,至于ServletRequest对象和ServletResponse对象到底有什么用,在后文继续讨论,这里从对象的名字也可以猜出一二了,一个是Request,一个是Response)
4、Servlet容器调用destroy方法,销毁Servlet实例。
2、ServletRequest和ServletResponse接口
对于这两个接口,我主要是分析一下它们的方法,因此它们的介绍我决定直接把API中的介绍搬到这里:
ServletRequest:Defines an object to provide client request information to a servlet. The servlet container creates a ServletRequest object and passes it as an argument to the servlet’s service method.
ServletResponse:Defines an object to assist a servlet in sending a response to the client. The servlet container creates a ServletResponse object and passes it as an argument to the servlet’s service method.
- ServletRequest:
对照ServletRequest的把请求信息封装的作用来看,ServletRequest接口的方法主要是用来获取信息的getter和is类型的方法。- Attribute信息:getAttribute、getAttributeNames、removeAttribute、setAttribute
- Character信息:getCharacterEncoding、setCharacterEncoding
- Content信息:getContentLength、getContentType
- Local信息:getLocalAddr、getLocalPort、getLocalName
- Parameter信息:getParameter、getParameterNames、getParameterValues
- Remote信息:getRemoteHost、getRemotePort
- 其他信息:getRequestDispatcher、getServerName、getServerPort
这里主要注意的Attribute和Parameter的区别,请参看:《参数(parameter)和属性(Attribute)的区别》
- ServletResponse:
如同上面描述一样,ServletResponse是提供响应的,因此,它应该定义一系列和响应相关的方法,如: setCharacterEncoding、setContentLength、setContentType等;
(上面的几个属于协议无关的,只要继承他们并实现Http协议,那么就可以处理基于HTTP协议的请求和返回响应结果了)
3、HttpServlet类
这个类继承了GenericServlet类,因此这个类的service方法实现了对HTTP协议的支持,这个类的主要功能是接受从浏览器发送过来的HTTP请求,并返回HTTP响应。
它的service方法是这样的:service(HttpServletRequest req, HttpServletResponse resp);
4、HttpServletRequest和HttpServletResponse接口
由于这两个接口是继承ServletRequest和HttpServletResponse接口
而来的,它们是基于HTTP协议来封装请求和响应的,因此这个两个接口定义的方法一定是根据HTTP协议里的信息来写的,参照这篇文章:《Http详解》然后对比一下这两个接口定义的方法就能明了了。
最后:
Servlet的原理说起来真的很简单,重要的是如何应用这些方法。我觉得一边学HTTP协议一边用这些方法是个不错的选择。