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方法完成一些全局性的初始化工作。