Java Servlet是和平台无关的服务器组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户通信采用“请求/响应”的模式。 Servlet完成的功能: 创建并返回基于客户请求的动态HTML页面。 创建可嵌入到现有HTML页面中的部分HTML页面。 与其他服务器资源进行通信。 一个类要成为Servlet类必须实现javax.servlet.Servlet接口。 GenericServlet是通用的,不特定任何协议的servlet,他实现了Servlet接口,而HttpServlet继承了GenericServlet,因此HttpServlet实现了Servlet接口,所以我们定义的Servlet只需要继承HttpServlet父类即可。 Servlet接口中定义了一个service方法,HttpServlet对该方法进行了实现,实现方式就是将ServletRequest与ServletResponse转换为HttpServletRequest与HttpServletResponse。 转换完毕后,会调用HttpServlet类中自己定义的service方法。 在该service方法中,首先获得请求的方法名,然后根据方法名调用对应的doXX方法,比如说请求方法为Get,那么就去调用doGet方法,请求方法为POST,那么就去调用doPost方法。 在HttpServlet类中所提供的doGet,doPost等方法,都是直接返回错误信息,所以我们需要在自己定义的Servlet类中override这些方法。 Servlet的生命周期: init方法:负责初始化Servlet对象; service方法:负责响应客户的请求: destroy:当Servlet对象退出生命周期时,负责释放占用的资源。 ServletRequest接口中封装了客户请求的信息,如客户的请求方式,参数名,参数值。 Servlet的初始化阶段: Servlet容器启动时自动装载些Servlet; 为了验证是否自动加载Servlet类:我们必须重新配置Servelt: <servlet> <servlet-name>InitServlet</servlet-name> <servlet-class>com.javaweb.servlet.InitServlet</servlet-class> <load-on-startup>9</load-on-startup> </servlet> 在servlet容器启动后,客户首次向Servlet发出请求; Servlet的类文件更新后,重新装载Servlet。 Servlet被装载后,Servlet容器会创建一个servlet实例并且调用Servlet的init()方法进行初始化,在Servlet的整个生命周期中,init方法只会被调用一次。 init()方法实例: package com.javaweb.servlet; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class InitServlet extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { System.out.println("init invoked!!"); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doget invoked!!"); } } Servlet响应客户端的请求(service) 对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息,处理请求,并通过ServletResponse对象向客户返回响应结果。 对于Tomcat来说,它会将客户传递过来的参数放在一个Hashtable中,该Hashtable的定义是: private Hashtable<String ,String[]>paramHashStringArray = new Hashtable<String,String[]>();这是一个String->String的键值映射。 Servlet的终止阶段:当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新加载Servlet的新实例时,Servlet容器会先调用Servlet的dstroy方法。在destroy方法中,可以释放servlet 所占的资源。 某些Servlet在web.xml文件中只有<servlet>元素而没有<servlet-mapping>元素,这样我们就无法通过url地址的方式访问这个Servlet了,这种Servlet通常会在<servelt>元素中配置一个<load-on-start>子元素,让容器在启动时自动加载Servlet并且调用其init方法完成一些全局性的初始化工作。