用Servlet可以创建协议、平台无关
![](/icons/25913de.gif)
Web应用
![](/icons/25913chengxu.gif)
![](/icons/25913dou.gif)
Applet运行于浏览器
![](/icons/25913de.gif)
JRE中
![](/icons/25913dou.gif)
而Servlet则运行于Web应用服务器
![](/icons/25913de.gif)
Servlet容器中
![](/icons/25913dou.gif)
Servlet没有用户图形界面
![](/icons/25913dou.gif)
Servlet和Web应用服务器
![](/icons/25913de.gif)
Servlet容器交互以接收请求返回响应
![](/icons/25913dou2.gif)
请求最先由Web应用服务器
![](/icons/25913de.gif)
Servlet容器处理并传给Servlet
![](/icons/25913dou.gif)
Servlet通过Web应用服务器返回响应给客户端
![](/icons/25913dou2.gif)
客户端
![](/icons/25913chengxu.gif)
可以使用任何可向Web应用服务器发送请求
![](/icons/25913de.gif)
语言开发
![](/icons/25913dou2.gif)
Servlet最大
![](/icons/25913de.gif)
优势在于它
![](/icons/25913de.gif)
高性能
![](/icons/25913dou.gif)
Servlet采用了和CGI截然区别
![](/icons/25913de.gif)
运行方式
![](/icons/25913dou.gif)
首先Servlet在第
![](/icons/25913yi.gif)
次
![](/icons/25913chushi.gif)
化时装载并驻留在内存中
![](/icons/25913dou.gif)
以后直接从内存中运行;其次
![](/icons/25913dou.gif)
在默认情况下Servlet以单例子多线程
![](/icons/25913de.gif)
方式工作
![](/icons/25913dou.gif)
![](/icons/25913yi.gif)
个新请求到达后
![](/icons/25913dou.gif)
Servlet例子开启
![](/icons/25913yi.gif)
个新
![](/icons/25913de.gif)
线程服务这个请求
![](/icons/25913dou2.gif)
Servlet 结构和线程安全
所有
![](/icons/25913de.gif)
Servlet都直接或间接地实现Javax.servlet.Servlet接口
![](/icons/25913dou.gif)
这些接口规定了Servlet如何和Servlet容器进行通讯
![](/icons/25913de.gif)
思路方法
![](/icons/25913dou.gif)
此外还定义了Servlet
![](/icons/25913de.gif)
生命周期
![](/icons/25913dou2.gif)
GenericServlet是和协议无关
![](/icons/25913de.gif)
通用Servlet
![](/icons/25913dou.gif)
HttpServlet是专门针对HTTP协议开发
![](/icons/25913de.gif)
Servlet
![](/icons/25913dou.gif)
Web应用
![](/icons/25913chengxu.gif)
![](/icons/25913de.gif)
Servlet都直接继承HttpServlet
![](/icons/25913dou2.gif)
其类
![](/icons/25913de.gif)
继承体系如下图所示:
![](http://www.crazycoder.cn/WebFiles/20091/3915c46b-b687-4e84-8e19-b5d9a9e92f31.g<img src='/icons/25913if.gif' />)
图 1 Servlet
![](/icons/25913de.gif)
类继承体系
javax.servlet.Servlet接口包括了3个控制Servlet生命周期
![](/icons/25913de.gif)
思路方法
![](/icons/25913dou.gif)
它们分别是:
·init(ServletConfig config)思路方法
当Servlet
![](/icons/25913chushi.gif)
化时
![](/icons/25913dou.gif)
init
![](/icons/25913kh.gif)
思路方法被
![](/icons/25913diaoyong.gif)
执行
![](/icons/25913chushi.gif)
化Servlet
![](/icons/25913de.gif)
工作
![](/icons/25913dou.gif)
init
![](/icons/25913kh.gif)
思路方法只被
![](/icons/25913diaoyong.gif)
![](/icons/25913yi.gif)
次
![](/icons/25913dou2.gif)
Servlet
![](/icons/25913chushi.gif)
化后就进入就绪态
![](/icons/25913dou.gif)
随时准备响应客户端
![](/icons/25913de.gif)
请求
![](/icons/25913dou2.gif)
·service(ServletRequest req, ServletResponse resp)思路方法
Servlet容器
![](/icons/25913diaoyong.gif)
service
![](/icons/25913kh.gif)
思路方法处理请求并返回响应
![](/icons/25913dou2.gif)
ServletRequest和ServletResponse作为入参传给service
![](/icons/25913kh.gif)
![](/icons/25913dou.gif)
ServletRequest封装了请求
![](/icons/25913de.gif)
信息而ServletResponse封装了响应
![](/icons/25913de.gif)
信息
![](/icons/25913dou2.gif)
·destroy
![](/icons/25913kh.gif)
思路方法
Servlet容器可以在任何时候卸载Servlet
![](/icons/25913dou.gif)
此时destory
![](/icons/25913kh.gif)
被
![](/icons/25913diaoyong.gif)
![](/icons/25913dou.gif)
你可以在这儿释放Servlet所占用
![](/icons/25913de.gif)
资源
![](/icons/25913dou2.gif)
而javax.servlet.http包中
![](/icons/25913de.gif)
类用于支持HTTP协议
![](/icons/25913dou.gif)
创建HTML网页
![](/icons/25913dou2.gif)
HTTP协议是基于请求/响应工作模式
![](/icons/25913dou.gif)
这些HTTP
![](/icons/25913de.gif)
请求方式包括:
GET
POST
PUT
DELETE
HEAD
TRACE
CONNECT
OPTIONS
javax.servlet.http.HttpServlet定义了多个服务HTTP协议
![](/icons/25913de.gif)
思路方法
![](/icons/25913dou.gif)
这些思路方法名为doXxx
![](/icons/25913kh.gif)
![](/icons/25913de.gif)
样式命名和HTTP请求方式名相呼应:如HTTP GET请求方式对应doGet
![](/icons/25913kh.gif)
![](/icons/25913dou.gif)
而HTTP POST对应doPost
![](/icons/25913kh.gif)
等
![](/icons/25913dou2.gif)
HttpServlet最初以service(HttpServletRequest req, HttpServletResponse resp)响应客户端请求
![](/icons/25913dou.gif)
并依据HTTP
![](/icons/25913de.gif)
请求方式
![](/icons/25913diaoyong.gif)
相应
![](/icons/25913de.gif)
doXxx
![](/icons/25913kh.gif)
思路方法来处理
![](/icons/25913yi.gif)
般
![](/icons/25913de.gif)
![](/icons/25913dou.gif)
你仅需要覆盖doGet
![](/icons/25913kh.gif)
或doPost
![](/icons/25913kh.gif)
思路方法
![](/icons/25913dou.gif)
如果希望得到更多
![](/icons/25913de.gif)
控制
![](/icons/25913dou.gif)
你也可以覆盖doPut
![](/icons/25913kh.gif)
和doDelete
![](/icons/25913kh.gif)
思路方法
![](/icons/25913dou.gif)
其他
![](/icons/25913de.gif)
思路方法
![](/icons/25913yi.gif)
般很少使用
![](/icons/25913dou2.gif)
如果你使用JBuilder
![](/icons/25913de.gif)
Servlet向导
![](/icons/25913dou.gif)
你可以具体指定创建哪些思路方法
![](/icons/25913dou2.gif)
特别需要指出
![](/icons/25913de.gif)
是Servlet是以多线程
![](/icons/25913de.gif)
方式工作
![](/icons/25913de.gif)
![](/icons/25913dou.gif)
Servlet可以同时处理多个请求
![](/icons/25913dou2.gif)
作为开发人员
![](/icons/25913dou.gif)
需要注意Servlet成员变量
![](/icons/25913de.gif)
线程安全
![](/icons/25913dou.gif)
在doGet
![](/icons/25913kh.gif)
、doPost
![](/icons/25913kh.gif)
中
![](/icons/25913de.gif)
局部域变量是线程安全
![](/icons/25913de.gif)
![](/icons/25913dou.gif)
而Servlet
![](/icons/25913de.gif)
成员变量则有线程安全
![](/icons/25913de.gif)
隐患
![](/icons/25913dou2.gif)
所以除非你有意需要应用这种特性
![](/icons/25913dou.gif)
在
![](/icons/25913yi.gif)
般情况下
![](/icons/25913dou.gif)
不宜将
![](/icons/25913yi.gif)
些可改写
![](/icons/25913de.gif)
变量定义成Servlet
![](/icons/25913de.gif)
成员变量
![](/icons/25913dou.gif)
否则
![](/icons/25913yi.gif)
定要采取线程同步
![](/icons/25913de.gif)
措施确保线程安全
![](/icons/25913dou2.gif)
Servlet
![](/icons/25913de.gif)
特性及适用场合
虽然Servlet也可以用于生成动态网页
![](/icons/25913dou.gif)
但这个功能已经逐渐让位给新锐JSP了
![](/icons/25913dou.gif)
不过Servlet并没有
![](/icons/25913yinwei.gif)
江山代有才人而成为Java历史博物馆
![](/icons/25913de.gif)
古董
![](/icons/25913dou.gif)
它依然身怀绝技笑傲江湖:
·自动启动
![](/icons/25913yi.gif)
般情况下
![](/icons/25913dou.gif)
JSP只有在客户端第
![](/icons/25913yi.gif)
次
![](/icons/25913diaoyong.gif)
后
![](/icons/25913dou.gif)
方才进行编译并
![](/icons/25913chushi.gif)
化
![](/icons/25913dou.gif)
而Servlet则可以通过web.XML
![](/icons/25913de.gif)
<load-on-startup>配置
![](/icons/25913dou.gif)
使其在Web容器启动时自动
![](/icons/25913chushi.gif)
化
![](/icons/25913dou2.gif)
可使用Servlet这个特性完成Web应用
![](/icons/25913chengxu.gif)
![](/icons/25913de.gif)
![](/icons/25913chushi.gif)
化工作:如下载字典表、控制表、
![](/icons/25913chushi.gif)
化配置信息等
![](/icons/25913dou.gif)
启动某个后台进程等
![](/icons/25913dou2.gif)
·路径匹配映射
Servlet可以通过web.xml 中<servlet-mapping>用通配符配置URI映射
![](/icons/25913dou.gif)
对多个匹配
![](/icons/25913de.gif)
URI进行响应
![](/icons/25913dou.gif)
而JSP只能通过
![](/icons/25913yi.gif)
个具体
![](/icons/25913de.gif)
URI
![](/icons/25913diaoyong.gif)
![](/icons/25913dou2.gif)
这个特性可以使你在请求进入某个具体
![](/icons/25913de.gif)
页面前截获并处理它
![](/icons/25913dou.gif)
许多Web应用框架
![](/icons/25913dou.gif)
如Struts、Spring都利用了Servlet
![](/icons/25913de.gif)
这个特性
![](/icons/25913dou.gif)
在此基础上创建构架
![](/icons/25913dou2.gif)
·Servlet过滤器
Servlet过滤器继承于javax.servlet.Servlet并实现javax.servlet.Filter
![](/icons/25913de.gif)
类
![](/icons/25913dou.gif)
在请求到达服务
![](/icons/25913chengxu.gif)
前和响应发往客户端前进行加工处理
![](/icons/25913dou2.gif)
如果有大量
![](/icons/25913de.gif)
页面都需要进行相同
![](/icons/25913de.gif)
处理
![](/icons/25913dou.gif)
则可以使用
![](/icons/25913yi.gif)
个Servlet过滤器对此
![](/icons/25913yi.gif)
并处理
![](/icons/25913dou2.gif)
如你可以用Servlet过滤器进行编码转换、或者为每个页面添加
![](/icons/25913yi.gif)
个统
![](/icons/25913yi.gif)
![](/icons/25913de.gif)
标题头等
![](/icons/25913dou2.gif)
·Servlet监听器
J2EE定义了多个Web事件监听器接口
![](/icons/25913dou.gif)
Servlet监听器是继承javax.servlet.Servlet并实现这些事件监听接口
![](/icons/25913de.gif)
类
![](/icons/25913dou2.gif)
如果Web应用服务器对某个Web容器
![](/icons/25913de.gif)
事件感兴趣
![](/icons/25913dou.gif)
就可以构造
![](/icons/25913yi.gif)
个实现该事件监听接口
![](/icons/25913de.gif)
Servlet
![](/icons/25913dou.gif)
以便在该事件发生时做相应
![](/icons/25913de.gif)
处理
![](/icons/25913dou2.gif)
灵活使用Servlet监听器
![](/icons/25913dou.gif)
可以使
![](/icons/25913yi.gif)
些原来很难实现
![](/icons/25913de.gif)
操作变得易如反掌
![](/icons/25913dou2.gif)
此外
![](/icons/25913dou.gif)
如果
![](/icons/25913yi.gif)
个动态网页
![](/icons/25913de.gif)
页面展现逻辑少
![](/icons/25913dou.gif)
而业务处理逻辑多
![](/icons/25913dou.gif)
如
![](/icons/25913yi.gif)
个计算圆周率并返回结果页面
![](/icons/25913de.gif)
请求
![](/icons/25913dou.gif)
这时使用Servlet比JSP更适合
![](/icons/25913dou2.gif)
所以需要创建
![](/icons/25913yi.gif)
个动态网页
![](/icons/25913dou.gif)
在到底使用Servlet还是JSP
![](/icons/25913de.gif)
问题上举棋不定时
![](/icons/25913dou.gif)
请这记住下面这句经典
![](/icons/25913de.gif)
话:Servlet是包含HTML代码
![](/icons/25913de.gif)
Java
![](/icons/25913chengxu.gif)
![](/icons/25913dou.gif)
而JSP是包含Java代码
![](/icons/25913de.gif)
HTML网页
延伸阅读
最新评论