阅读笔记——Servlet
什么是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个阶段。
- 类加载
servlet是普通的Java类,编译后存储在web应用的WEB-INF\classes目录或者打包成jar文件存储在WEB-INF\lib目录中。在web应用程序启动或第一次访问时,应用程序的类加载程序将查找Servlet类文件,找到后将字节码加载到内存中。 - Servlet实例化
Servlet加载到内存中后,容器将调用类的默认构造方法创建一个实例,因此编写Servlet类时要么提供一个默认构造方法,要么由编译器提供。 - Servlet初始化
创建Servlet实例后,容器将调用init(ServletConfig)方法对Servlet初始化。然后调用init()方法,之后Servlet就完成了初始化。在Servlet生命周期中,init()方法仅被调用一次。 - 为客户提供服务
在servlet初始化后,它就准备为客户提供服务。当容器受到对Servlet的请求后,容器根据请求的URL找到正确的servlet,容器首先创建两个对象,一个是请求对象,一个是相应对象。然后创建一个新的线程,在该线程中调用service()方法,同时将请求对象和相应对象作为参数传递给该方法。容器调用两个service()方法,一个从GenericServlet,之后调用HttpServlet类的service()方法。接下来service()将检查HTTP请求的类型(GET、POST等)类决定调用Servlet的doGet()方法或者doPost()方法。 - 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的更多相关文章
- Hadoop阅读笔记(五)——重返Hadoop目录结构
常言道:男人是视觉动物.我觉得不完全对,我的理解是范围再扩大点,不管男人女人都是视觉动物.某些场合(比如面试.初次见面等),别人没有那么多的闲暇时间听你诉说过往以塑立一个关于你的完整模型.所以,第一眼 ...
- 阅读笔记 1 火球 UML大战需求分析
伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本 <火球 UML大战需求分析>,首先 ...
- [阅读笔记]Software optimization resources
http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++ 7. The efficiency of differe ...
- 《uml大战需求分析》阅读笔记05
<uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...
- <<UML大战需求分析>>阅读笔记(2)
<<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...
- uml大战需求分析阅读笔记01
<<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...
- Hadoop阅读笔记(七)——代理模式
关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...
- Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable
酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...
- Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...
随机推荐
- ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.
项目用到ant 1.去官网下载:http://ant.apache.org/bindownload.cgi 2.解压至安装C盘 3.设置ANT_HOME.PATh.CLASSPATH ANT_HOME ...
- 一张图片让你了解android的事件分发机制
- STL 源代码剖析 算法 stl_algo.h -- search
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie search --------------------------------------- ...
- hbase启动报错:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
输入HBASE_MASTER_OPTS只是为了快速寻找这个选项而已,如果你手工找也可以 刚才那个命令回车后直接跳到这 前面加#就好了 修改后保存.重新启动hbase就好了. 注意:各个节点都要修改哦. ...
- codeforces 710C Magic Odd Square(构造或者n阶幻方)
Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...
- python 多线程学习小记
python对于thread的管理中有两个函数:join和setDaemon setDaemon:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.set ...
- Vuejs2.0构建一个彩票查询WebAPP(1)
说明:本人也是刚接触VUE.js,作为一个学习笔记,旨在与初学者共同学习.其中编程语法错误或者写作水平刺眼,还望轻喷. 使用工具:Visual Studio Code.技术栈为vue2+vuex+ax ...
- 【js基础】判断是否是合法邮箱地址(正则表达式的应用)
2019-01-21 09:11:21 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- JS取出两个数组的不同或相同元素
JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...
- javascript 基础篇 随课笔记
!DOCTYPE HTML><html><head><meta name="content-type" content="text/h ...