学习jsp
,或多或少会接触到Servlet
,一开始接触Servlet
的时候,觉得它是一个很神奇的东西,就往那里一放,web.xml
里面一配置,它就可以使用了。
随着对它的了解加深,才明白,其实Servlet
就是一个规范,为了统一Web
容器的厂商对JavaWeb
程序的调用而制定出来的一个规范,有了这个规范,程序员可以将精力放在实现功能上。
生命周期
Servlet
的生命周期主要分为三个阶段:
- 初始化阶段:
init()
方法; - 调用阶段:
service()
方法、doGet()
方法、doPost()
方法; - 销毁阶段:
destroy()
方法。
init初始化
init()
方法作为Servlet
的初始化方法,在整个生命周期中只运行一次,默认情况下是第一次有用户调用该Servlet
的时候,也可以由我们来配置为Web
容器启动时加载,之后每当一个用户调用该Servlet
,便会产生一个新的线程。
调用阶段
先来说说service()
方法,这个方法是整个Servlet
的核心,所有请求都要首先到达这个方法。
用户请求到达Web
容器后,由web
容器产生HttpServletRequest
类的实例化对象和HttpServletResponse
类的实例化对象,并将它们传入service()
方法,接着根据GET
/POST
请求,再分别调用doGet()
方法或者doPost()
方法。
doGet()
方法:这个方法是当HTTP
请求为GET
的时候调用的,一般如果不设置请求类型,默认都是GET
。
doPost()
方法:当HTTP
请求为POST
的时候调用这个方法,另外,之所以在doPost()
方法里首先调用doGet()
方法,在我看来只是为了使容错率大一些吧。
destroy销毁
执行destroy()
方法之后,Servlet
便会进入销毁阶段,之后会被标记为垃圾,由jvm
垃圾回收机制进行回收。
通常在这一阶段我们执行关闭数据库、清理线程等一些收尾工作。
配置
在Servlet 3.0
之前,我们需要在web.xml
文件中这么配置:
<!-- servlet 标签必须和 servlet-mapping 标签成对使用,否则将无法使用 -->
<!-- servlet 标签和 servlet-mapping 标签的 servlet-name 必须一致 -->
<!-- servlet-name 可以随便取,但是不能和别的 Servlet 的 servlet-name 重复 -->
<!-- servlet-class 是该 Servlet 的完全限定名 -->
<!-- url-pattern 是该 Servlet 的调用路径,通常都是以 '/' 为开头,少数特殊情况下用 *.xxx 的形式 -->
<servlet>
<servlet-name>Test</servlet-name>
<servlet-class>com.vingyun.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
而在Servlet 3.0
之后,我们只需要在Servlet
的头部加上这样一个注解,便可以完成对该Servlet
的声明:
@WebServlet("/Test") //括号里的为该Servlet的调用路径
public class Test extends HttpServlet {
}
功能实现
Servlet
中功能实现的写法其实和在jsp
中的写法的用法并没多大差别,其中HttpServletRequest
类的实例化对象和HttpServletResponse
类的实例化对象可以等同于jsp
中的内置对象request
和response
。
另外将在后面的文章中总结一下数据库连接(JDBC)。