用Servlet可以创建协议、平台无关的Web应用程序,Applet运行于浏览器的JRE中,而Servlet则运行于Web应用服务器的Servlet容器中,Servlet没有用户图形界面,Servlet和Web应用服务器的Servlet容器交互以接收请求返回响应。
请求最先由Web应用服务器的Servlet容器处理并传给Servlet,Servlet通过Web应用服务器返回响应给客户端。客户端程序可以使用任何可向Web应用服务器发送请求的语言开发。
Servlet最大的优势在于它的高性能,Servlet采用了和CGI截然不同的运行方式,首先Servlet在第一次初始化时装载并驻留在内存中,以后直接从内存中运行;其次,在默认情况下Servlet以单实例多线程的方式工作,一个新请求到达后,Servlet实例开启一个新的线程服务这个请求。
Servlet 结构和线程安全
所有的Servlet都直接或间接地实现javax.servlet.Servlet接口,这些接口规定了Servlet如何与Servlet容器进行通讯的方法,此外还定义了Servlet的生命周期。GenericServlet是和协议无关的通用Servlet,HttpServlet是专门针对HTTP协议开发的Servlet,Web应用程序的Servlet都直接继续HttpServlet。其类的继续体系如下图所示:
图 1 Servlet的类继续体系
javax.servlet.Servlet接口包括了3个控制Servlet生命周期的方法,它们分别是:
·init(ServletConfig config)方法
当Servlet初始化时,init()方法被调用执行初始化Servlet的工作,init()方法只被调用一次。Servlet初始化后就进入就绪态,随时预备响应客户端的请求。
·service(ServletRequest req, ServletResponse resp)方法
Servlet容器调用service()方法处理请求并返回响应。ServletRequest和ServletResponse作为入参传给service(),ServletRequest封装了请求的信息而ServletResponse封装了响应的信息。
·destroy()方法
Servlet容器可以在任何时候卸载Servlet,此时destory()被调用,你可以在这儿释放Servlet所占用的资源。
而javax.servlet.http包中的类用于支持HTTP协议,创建Html网页。HTTP协议是基于请求/响应工作模式,这些HTTP的请求方式包括:
GET
POST
PUT
DELETE
HEAD
TRACE
CONNECT
OPTIONS
javax.servlet.http.HttpServlet定义了多个服务HTTP协议的方法,这些方法名为doXxx()的样式命名和HTTP请求方式名相呼应:如HTTP GET请求方式对应doGet(),而HTTP POST对应doPost()等。HttpServlet最初以service(HttpServletRequest req, HttpServletResponse resp)响应客户端请求,并依据HTTP的请求方式调用相应的doXxx()方法来处理。
一般的,你仅需要覆盖doGet()或doPost()方法,假如希望得到更多的控制,你也可以覆盖doPut()和doDelete()方法,其他的方法一般很少使用。假如你使用JBuilder的Servlet向导,你可以具体指定创建哪些方法。
非凡需要指出的是Servlet是以多线程的方式工作的,Servlet可以同时处理多个请求。作为开发人员,需要注重Servlet成员变量的线程安全,在doGet()、doPost()中的局部域变量是线程安全的,而Servlet的成员变量则有线程安全的隐患。所以除非你有意需要应用这种特性,在一般情况下,不宜将一些可改写的变量定义成Servlet的成员变量,否则一定要采取线程同步的措施确保线程安全。