谈起servlet,我们在想什么?
当我们谈起servlet,我们在想些什么?service+let,顾名思义它是一个能够提供服务的类,在Java里面,它是怎么定义的呢?Java把它刻画为一个用Java写的服务器端程序。我们要let it在服务器上给我service。那么它能提供什么样的service呢?Java也说了,它主要功能在于交互地浏览和修改数据,生成动态的Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。谈到这里,就顺便看一下servlet的类继承关系什么样的。
Servlet核心API及其继承关系
HttpServlet ——> GenericServlet
由这个表可以看出,我们一般使用的Servlet是来自于HttpServlet生成的,换句话说,这个Servlet类针对http协议进行了封装,使其能够顺利的在此协议下工作。我们来看一下该类下的方法:
1. doDelete() for HTTP DELETE requests
2. doPut() for HTTP PUT requests
这两个方法至今我还不明白有什么现实意义的用法,除了覆盖他们,实现自己的功能。但是扎个在doPost()和doGet()方法里面都能做,所以留作一个未知吧。
3. doOptions()返回当前servlet支持的HTTP方法。
4.doPost和doGet这两种提交表单的方法的讨论已经汗牛充栋了,关于其区别在我的这篇博客里面也有详细的提到。
HttpServlet类各个方法的调用顺序
其实关于怎么调用,你自己写多了就知道熟悉了,这里还是啰嗦两句。
首先调用Service方法,再根据请求信息,调用具体的getGet或doPost等方法。
由于Servlet是运行在多线程的服务器,所有需要特别处理并发共享的资源。为什么?因为Servlet不是线程安全的。所以这也是Tomcat的一个巨大的优点之一。
每个Servlet都需要实现Servlet接口。GenericServlet是一个通用的,不特定于协议(所以你可以针对特定的协议覆盖这个类的方法)Servlet,其实现了Servlet接口,而HttpServlet继承与GenericServlet,实现了域HTTP协议相关的操作,所以我们定义的Servlet只需要直接继承HttpServlet即可。
Servlet的生命周期
当servlet被部署在应用服务器中(应用服务器中用于管理Java组件的部分被抽象成为容器)以后,由容器控制servlet的生命周期。除非特殊指定,否则在容器启动的时候,servlet是不会被加载的,servlet只会在第一次请求的时候被加载和实例化。servlet一旦被加载,一般不会从容器中删除,直至应用服务器关闭或重新启动。但当容器做内存回收动作时,servlet有可能被删除。也正是因为这个原因,第一次访问servlet所用的时间要大大多于以后访问所用的时间。
servlet在服务器的运行生命周期为,在第一次请求(或其实体被内存垃圾回收后再被访问)时被加载并执行一次初始化方法,跟着执行正式运行方法,之后会被常驻并每次被请求时直接执行正式运行方法,直到服务器关闭或被清理时执行一次销毁方法后实体销毁。
补充:可以在这篇博文中进一步巩固一下servlet基础知识。
JSP与Servlet的关系
Java服务器页面(JSP)是HttpServlet的扩展。由于HttpServlet大多是用来响应HTTP请求,并返回Web页面(例如HTML、XML),所以不可避免地,在编写servlet时会涉及大量的HTML内容,这给servlet的书写效率和可读性带来很大障碍,JSP便是在这个基础上产生的。其功能是使用HTML的书写格式,在适当的地方加入Java代码片段,将程序员从复杂的HTML中解放出来,更专注于servlet本身的内容。
JSP在首次被访问的时候被应用服务器转换为servlet,在以后的运行中,容器直接调用这个servlet,而不再访问JSP页面。JSP的实质仍然是servlet。