1. servlet概述
1.1.servlet是什么
Servlet是sun公司提供的一门用于开发动态web资源的技术。
按照这套规范写出来的Servlet可以放置到web应用中在Servlet容器中运行。
1.2.开发Servlet步骤
(1)写一个类, 实现Servlet接口, 并实现其中的方法
(2)在web.xml中为servlet配置对外访问路径。
2.使用myeclipse开发servlet
使用myeclipse开发Servlet程序时, 可以新建一个Servlet, 默认继承HttpServlet, 在Servlet内部会覆盖doGet和doPost方法, 分别来处理GET和POST请求。
2.1.新建项目
新建一个Web Project,给一个项目名称,其他保持默认即可,然后finish,弹出的对话框选择yes即可。
2.2.新建一个servlet
新建一个servlet,如果new中找不到servlet,注意视图是否切换到MyEclipse中,给一个包名和类名,下面对勾只留doGet()和doPost(),其他去掉,下一步

这里将最后两行删掉,是一些xml中的提示,其他地方一般保持默认即可,也可以修改对外访问路径,其中name和URL会自动配置到xml中。最后finish。

将servlet中的注释以及方法中的默认实现全部删掉。
为什么要继承HttpServlet?
因为这是一个继承了GenericServlet的类,已经提供doGet()和doPost()方法,可以方便我们开发web项目。
而GenericServlet是一个基础的实现,如果要用此类,需要自己写doGet()和doPost()方法,并且需要在service方法中对请求进行判断,会比较麻烦。
HttpServlet底层又是如何实现的?
可以打开HttpServlet源码,发现HttpServlet也是继承自GenericServlet,同时,HttpServlet会写各种方法,比如doGet()和doPost(),然后在service方法中进行判断,不同的请求调用不同的方法。
注意:复制一个servlet,web.xml中是不会自动生成配置信息的,所以一般不要复制,而是要新建!
2.3.将web应用发布到自己的tomcat中
这里注意项目名称是否是自己要发布的项目,然后finish,最后ok。

也可以修改发布的项目名称,参见/resource/在myeclipse中修改web应用发布到Tomcat中的应用的名称.pdf
在MyEclipse中启动tomcat

启动后,可以通过浏览器访问servlet,比如:
http://localhost/day09/servlet/SecondServlet
可以查看servers中tomcat如果是debug模式,则可以修改方法中的代码而无需重启服务器,但是若要新建一个servlet,则需要重启服务器。
3. Servlet的继承结构
Servlet接口 – 提供了一个Servlet应该具有的最基本的功能
|
|-- GenericServlet类, 实现了Servlet接口, 并实现了其中大部分的方法, 但是service方法没有实现, 这个方法需要开发人员自己去实现
|
|-- HttpServlet类, 继承了GenericServlet, 并实现了service方法, 在service方法中是根据不同的请求方式, 调用不同的doXxx方法, 因 此 我们在开发中, 只需要写一个类, 继承HttpServlet, 并覆盖 doGet()和 doPost()方法分别来处理Get请求和POST请求即可!!
4.修改servlet模版
方式一:
将\resource\修改Servlet模板\com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar文件拷贝到:
[Myeclipse安装目录]\Common\plugins目录下,会提示是否替换文件,确定替换即可,如果未出现提示,则看是否进对目录,或者是其他版本的MyEclipse
方式二:
(1)在[Myeclipse安装目录]\Common\plugins目录下找到文件:com.genuitec.eclipse.wizards.xxx.jar,在此文件中的Templates目录下可以看到Servlet.java源代码。
(2)打开源代码,将doGet()和doPost()两个方法的注释和方法中的内容删掉,在doPost()中调用doGet()方法即可。
(3)修改之后保存
(4)重新启动Myeclipse即可以使用新的模板代码了
5.Servlet调用过程
5.1.调用过程

5.2.Servlet生命周期
Servlet实例在第一次被访问时创建, 创建之后服务器会立即调用init方法进行初始化的操作, 从此以后该实例会一直驻留在服务器的内存中, 为后续的请求服务, 只要有请求访问servlet, 服务器就会调用service方法来处理这个请求, 直到服务器关闭或者是web应用被移出容器时为止, 随着web应用的销毁, servlet实例也会跟着销毁, 在销毁之前, 服务器就调用destroy方法进行善后的处理.
6.servlet虚拟路径的配置
在web.xml中的servlet对外访问的虚拟路径的配置, 可以直接写一个路径, 或者通过 * 号匹配符写一个路径.
方式一:直接写一个路径: /servlet/SecondServlet
方式二:通过*号匹配符写一个路径:
(1)以 / 开头, 以 /* 结尾, 如: /servlet/* /a/* /*
(2)以 *.后缀 的形式, 如: *.html *.servlet *.do *.action
使用*号匹配符写路径, 路径的配置变得更加灵活, 但是也可能会造成, 一个url会被多个servlet Mapping所匹配
Url:http://localhost/day09/servlet/SecondServlet.do
Servlet1:Test1: /servlet/*
Servlet2:Test2: *.do
匹配规则:
*.后缀的优先级永远最低!!
哪一个更接近哪一个起作用!!
示例:
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应
Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
ServletRequest继承结构