1、Servlet实现方式
实现Servlet接口
继承GenericServlet抽象类间接实现。
继承HttpServlet抽象类间接实现。HttpServlet位于javax.servlet.http包中,继承GenericServlet抽象类,是Servlet的二级实现。
2、Servlet工作原理
Servlet接口定义了Servlet和Servlet容器之间的契约。这个契约是:Servlet容器将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。在一个应用程序中,每种Servlet类型只能有一个实例。
用户请求致使Servlet容器调用Servlet的service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如Tomcat)封装好的,并且不需要程序员去实现,程序员可以直接使用这两个对象。
ServletRequest中封装了当前Http请求,因此,开发人员不必解析和操作原始的Http数据。ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松发给用户。
对于每一个应用程序,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文的环境详情。每个应用程序只有一个ServletContext。没有Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
3、Servlet的生命周期
init()、service()、destroy()是Servlet生命周期的方法。代表Servlet对象从“出生”到“死亡”的过程。
init()方法,当Servlet第一次被请求时,在Servlet容器初始化Servlet对象时,调用且只调用一次这个方法,并且会传入一个ServletConfig对象。
service()方法,每当请求Servlet时,都会调用这个方法,接收应用程序具体的工作。第一次请求调用init()和service()两个方法,在后续的请求中,只调用service()方法。
destroy()方法,当销毁Servlet时,Servlet容器会调用这个方法。在卸载应用程序或关闭Servlet容器时,会发生销毁Servlet情况。这个方法中写一些清除代码。
getServletInfo()方法,返回Servlet描述的字符串。
getServletConfig()方法,返回由Servlet容器传给init()方法的ServletConfig对象。
例如
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("Servlet正在初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//专门向客服端提供响应的方法
System.out.println("Servlet正在提供服务");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("Servlet正在销毁");
}
}
4、Servlet工作流程(以tomcat为例)
客户端发送http请求到tomcat容器。
tomcat解析请求资源。
将解析的请求资源封装成一个request对象,同时创建一个response对象。
创建Servlet对象,并调用Servlet类的service()方法,将上一步创建的request对象和response对象作为参数传给service()方法。
在service()方法中,获取request对象的参数,根据具体业务要求处理,并返回响应信息,将响应信息写入到response对象的缓冲区。
tomcat内核从response缓存区获取设置的内容,并将获取的内容组装为http响应。
tomcat将http响应返回给客户端。客户端解析http响应和显示页面。