Servlet总结

Author Avatar
stormjie 8月 03, 2018
  • 在其它设备中阅读本文章

这几天忙着玩忙着睡都没有更博,不过也稍微计划了下大概要写些什么,具体就不说了,我不画大饼,没做到尴尬。。

写技术博客也不是想给谁看,就是个人总结和复习,也当做笔记,以后忘了什么知识点可以来看看,仅此而已。行了,废话也不说了,来说说我们的Servlet。

一、什么是Servlet

Servlet是什么?”狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。“这是百度上说的,以我的理解,Servlet就是一个Java接口,是一套处理网络请求的规范 ,我们平时写的Servlet必须实现刚刚那个接口,按它的规范完成我们的编写,这样完成的Java类我们管它叫自己的Servlet。

好的,Servelt既然是一个接口,那具体是怎样的接口呢,下图详细地解释了Servlet体系与各自的方法。

每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet()方法,如为Post请求,则调用doPost()方法。所以我们在编写Servlet时,通常只需要覆写doGet()或doPost()方法。

二、Servlet生命周期

说到Servlet不提它的生命周期显然是不行的,要掌握Servlet这个是重点,那么Servlet工作流程分为以下几个阶段:

1.加载和实例化

当检测到需要Servlet的第一个请求时,读取xml文件找到要加载的servlet类,创建Servlet实例。 加载一般是在运行Servlet容器时来完成,将servlet类加载到tomcat中,或者是客户端发来请求时也可以。

2.初始化

初始化信息一般是读取配置信息、读取初始化参数等,对于每一个servlet实例,init()方法值被调用一次。

3.请求处理

调用Servlet的service()方法对请求进行处理,在调用该方法之前,init()方法必须先成功执行。根据请求的到来,service()方法决定请求的请求,常用的是doGet()或doPost()。

4.销毁

销毁一般是Servlet的卸载是由容器本身定义和实现,在destroy()方法调用后,容器释放对应的Servlet请求。实例随后会被Java的垃圾收集器所回收,整个Servlet的生命周期结束。一般tomcat关闭,servlet就会被销毁。

Servlet没有main方法,所有行为由Servlet容器控制,我们最常见的Servlet容器就是Tomcat了。整个流程如下图:

(图来自《Head First Servlets & JSP》,逸夫有,是本入门经典 ,推荐! )

三、servlet配置及其含义

servlet配置在项目的web.xml下,这里其实最想说的是配置中各节点的含义:

<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
    <!-- servlet的内部名称,自定义。尽量有意义 -->
    <servlet-name>ServletDemo</servlet-name>
    <!-- servlet的类全名: 包名+简单类名 -->
    <servlet-class>lm.practice.ServletDemo</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
    <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
    <servlet-name>ServletDemo</servlet-name>
    <!-- servlet的映射路径(访问servlet的名称) -->
    <url-pattern>/servlet</url-pattern>
</servlet-mapping>

可以看到,在配置Servlet时,有两个地方需要配置,一个是<servlet>,另一个是<servlet-Mapping>,这两个一个是配置Servlet,一个是配置其映射信息,其中<servlet>中的<servlet-name>可以随意指定,但要有一定的意义,一般取为类的名称,例如我的类名为ServletDemo,这里取名为ServletDemo,下面的<servlet-class>是类的全路径 ,一定要是全路径!

<servlet-Mapping>是映射信息,它也有一个<servlet-name>,里面的名字是对应的Servlet名,也就是我们上面配置的Servlet名字,这里是ServletDemo,下面的是映射路径,也就是访问Servlet的名称,这里也是以方便和有意义为前提的,是我们在访问Servlet在浏览器地址栏后面输入的那个信息。

注意:这里的映射路径一定不是丢掉/,否则就会出错了,一定要写成/servlet,不能是servlet。

行了,关于Servlet的知识点目前就想到这么多,其实还有九大内置对象,四个作用域什么的,大家想了解可以参考这个帖子,了解一下。以后如果想到什么重要的还会添加的,如果有什么疑惑或者错误欢迎联系我。