什么是Servlet

Servlet是用java编写的运行在web服务器中的程序,因此它可以调用服务器端的类,它也可以被调用,它本身就是一个类。

Servlet的工作原理

servlet由web服务器引擎负责编译执行,当客服端浏览器访问servlet时,服务器将启动一个线程来响应,而并非CGI技术的进程。因此相对CGI方式占用的系统资源(特别是内存)比较少,具有较高的运行效率。

当web服务器中的servlet被请求访问时,次servlet被加载到java虚拟机中,在servlet中要接受http请求并作相应处理。由于servlet是在服务器端运行的,对客户完全透明,因此比java applet具有更好的安全性,当服务器有防火墙的保护时,servlet也受到防火墙的保护。

Servlet的生命周期

servlet是一种在web容器中运行的组件,有一个从创建到销毁的过程,这个过程被称为servlet生命周期,包括5个阶段。

  1. 类加载
    servlet是普通的Java类,编译后存储在web应用的WEB-INF\classes目录或者打包成jar文件存储在WEB-INF\lib目录中。在web应用程序启动或第一次访问时,应用程序的类加载程序将查找Servlet类文件,找到后将字节码加载到内存中。
  2. Servlet实例化
    Servlet加载到内存中后,容器将调用类的默认构造方法创建一个实例,因此编写Servlet类时要么提供一个默认构造方法,要么由编译器提供。
  3. Servlet初始化
    创建Servlet实例后,容器将调用init(ServletConfig)方法对Servlet初始化。然后调用init()方法,之后Servlet就完成了初始化。在Servlet生命周期中,init()方法仅被调用一次。
  4. 为客户提供服务
    在servlet初始化后,它就准备为客户提供服务。当容器受到对Servlet的请求后,容器根据请求的URL找到正确的servlet,容器首先创建两个对象,一个是请求对象,一个是相应对象。然后创建一个新的线程,在该线程中调用service()方法,同时将请求对象和相应对象作为参数传递给该方法。容器调用两个service()方法,一个从GenericServlet,之后调用HttpServlet类的service()方法。接下来service()将检查HTTP请求的类型(GET、POST等)类决定调用Servlet的doGet()方法或者doPost()方法。
  5. Servlet销毁
    当容器决定不再需要Servlet实例时,它将在servlet实例上调用destroy()方法,Servlet在该方法中释放资源,一旦该方法被调用,Servlet实例不能再提供服务。Servlet实例从该状态仅能进入卸载状态。在调用destroy()方法之前,容器会等待其他执行Servlet的service()方法的线程结束。
    一旦Servlet实例被销毁,它将作为垃圾被回收。如果web容器关闭,Servlet也将被销毁和卸载。

部署Servlet

要部署Servlet,首先要编译Servlet。编译Servlet就是执行javac命令,编译源代码文件.java为字节码文件.class。如果使用Eclipse或者其它可视化开发工具,无需使用javac来编译,在Eclipse中保存.java文件即会自动编译为.class字节码,并会按照类的层次结构生成对应的文件夹。

类编译后,把字节码文件复制到当前应用“WEB-INF\classes”目录下,即可使用了。这里注意Servlet如果属于某个包,则在“WEB-INF\classes”相应的目录中。

复制字节码文件后,还需要在web.xml文件中进行配置。在web.xml的<web-app></web-app>之间加入如下的语句:

<servlet>

<servlet-name>Servlet名称</servlet-name>

<servlet-class>Servlet类</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>Servlet名称</servlet-name>

<url-pattern>Servlet名称访问路径</url-pattern>

</servlet-mapping>

其中,<servlet-name>中配置的是Servlet的名称(可以自己随便起,只要不和其他Servlet名称冲突都可以);<servlet-class>中配置的是Servlet指向的类,必须是完整的类名;<url-pattren>中配置的是web方式访问Servlet时相对于当前应用的路径(也可以自行设定,访问的时候用这个路径)。

在Servlet3.0中可以使用@WebServlet注解定义定义Servlet,而不需要在web.xml文件中定义。该注解属于javax.servlet.annotation包,因此在定义Servlet是应该使用导入语句:import javax.servlet.annotation.WebServlet;在定义Servlet类的前一行加上注解@WebServlet(name=“Servlet的名字”,urlPatterns=“访问Servlet的路径”)。

阅读笔记——Servlet的更多相关文章

  1. Hadoop阅读笔记(五)——重返Hadoop目录结构

    常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...

  2. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  3. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  4. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  5. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

  6. uml大战需求分析阅读笔记01

    <<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...

  7. Hadoop阅读笔记(七)——代理模式

    关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...

  8. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

  9. Hadoop阅读笔记(四)——一幅图看透MapReduce机制

    时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...

随机推荐

  1. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递

    本文原创,转载请注明出处:http://blog.csdn.NET/qinjuning 在掌握了JNI函数的使用和相关类型的映射后,以及知晓何利用javah工具生成对应的jni函数以及如何生成动态 链 ...

  2. 分贝(dB)的理解

    分贝(dB,decibels)表达的是功率比(power ratio,P2/P1),而不是一个amount,P2>P1,分贝为正值,否则为负值.分贝是对数形式的,而不是线性形式的,也即 20 d ...

  3. BZOJ 4003 左偏树

    思路: 用到了左偏树合并复杂度是logn的性质 一开始先BFS一遍 打标记的左偏树 //By SiriusRen #include <cstdio> #include <cstrin ...

  4. nginx假死导致的问题回顾

    背景: 网络大致拓扑型 定位到一台Nginx节点于凌晨Timewait异常,等到6K. 进程异常,ngx_http_realtime_request模块错误 错误日志: 2017/02/24 00:0 ...

  5. SQL 2008 还原 SQL2005 备份文件 不成功的解决方法

    解决方法1:不要在数据库名字上点右键选择还原,而要是在根目录“数据库”三个字上点右键选择还原,然后再选择数据库,问题便可以解决,如果不行参照方法2 解决方法2:写sql语句处理: RESTORE DA ...

  6. Python(六) Python 函数

    一.认识函数 help(方法名字)  help(round) 1.功能性 2.隐藏细节 3.避免编写重复的代码 4.组织代码 自定义函数 二.函数的定义及运行特点 # 递归 def sum_num(n ...

  7. 定时器函数SetTimer

    原文链接:http://www.cnblogs.com/zhangpengshou/archive/2009/04/05/1429770.html 一.SetTimer表示的是定义个定时器.根据定义指 ...

  8. vue踩坑-This relative module was not found

    在使用vue.js的日期选择插件 的时候,报错如下 This relative module was not found: * ../calendar.vue in ./node_modules/ba ...

  9. Maven学习总结(20)——Maven pom.xml配置再体会

    Maven的pom.xml配置文件详解 <!--父项目的坐标.如果项目中没有规定某个元素的值,那么父项目中的对应值即为项目的默认值. 坐标包括group ID,artifact ID和 vers ...

  10. 一次失败的PHP扩展开发之旅

    一次失败的PHP扩展开发之旅 By warezhou 2014.11.19 缘起 经过不断的持续迭代.我们部门的协程版网络框架(CoSvrFrame)最终出炉了!这本来是件喜大普奔的事情.可是随着新业 ...