一、Servlet简介
用户若想开发一个动态web资源(即开发一个java程序向浏览器输出数据),需要完成两个步骤:
1、编写一个java类,实现Servlet接口;
2、将开发好的java类部署到服务器中。
二、Servlet运行过程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
1)Web服务器首先检查是否已经装载并创建了该Servlet的对象实例,如果是,直接跳转到第4步,否则执行第2步;
2)装载并创建该Servlet的实例对象;
3)调用该Servlet的init方法;
4)创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去;
5)WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
三、Servlet调用图
四、Servlet生命周期
Servlet生命周期可定义为从创建到销毁的整个过程:
- Servlet调用init()方法完成初始化工作;
- Servlet调用service()方法处理客户端请求;
- Servlet通过调用destroy()方法终止;
- 被JVM的垃圾回收器进行回收。
init()方法
init()方法被设计成只被调用一次,在第一次创建Servlet时被调用。init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。
service()方法
service()方法是执行实际任务的主要方法,Servlet容器(即web服务器)调用service()方法来处理客户端的请求,并把格式化的响应返回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。
destroy()方法
destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。可用来让Servlet关闭数据库连接、停止后台线程、把cookie列表或点击计数器写入磁盘,并执行其他类似的清理活动。
在destroy()方法调用后,Servlet 对象被标记为垃圾回收。
五、用Eclipse创建和编写Servlet
5.1 Servlet接口实现类
sun公司定义了两个默认实现Servlet的类:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
5.2 创建和编写Servlet类
右键项目相应的package,New->Servlet,完成Servlet新建,默认继承HttpServlet类,勾选上需要重写的doGet()和doPost()方法。采用默认设置即可,Eclipse将在web.xml文件中为我们完成Servlet的自动配置。
打开web.xml文件,可以看到,此时已有了我们定义的Servlet的<servlet>元素和<servlet-mapping>元素。
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用于注册Servlet,主要包含两个子元素,<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
<servlet-mapping>元素用于映射一个已注册过的Servlet的对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。