没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
31页
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础。因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求。本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请求是如何被分配给指定的 Servlet 的? Servlet 容器如何管理 Servlet 生命周期?你还将了解到最新的 Servlet 的 API 的类层次结构,以及 Servlet 中一些难点问题的分析。
资源推荐
资源详情
资源评论
跳转到主要内容
登录 ( 或注册 )
中文
技术主题
软件下载
社区
技术讲座
developerWorks
技术主题
Java technology
文档库
Servlet 工作原理解析
许 令波 , Java 工程师, 淘宝网
简介:Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java
Web 技术的核心基础。因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技
术开发人员的基本要求。本文将带你认识 Java Web 技术是如何基于 Servlet 工作,
你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在
Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet
?用户的请求是如何被分配给指定的 Servlet 的? Servlet 容器如何管理 Servlet 生命
周期?你还将了解到最新的 Servlet 的 API 的类层次结构,以及 Servlet 中一些难点
问题的分析。
本文的标签: api, base, j2ee, java, javaweb, jsp, servlet, servlets, struts, sturts... 更多标
签
tomcat, 原理, 工作原理解析, 技术, 编码, 配置
标记本文!
发布日期:2011 年 2 月 24 日
级别:高级
访问情况 :47881 次浏览
评论:12(查看|添加评论 - 登录)
总共 244 评分的平均分 (您的评分是 5 星)
从 Servlet 容器说起
要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点
像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此
依存的,但是又相互独立发展,这一切都是为了适应工业化生产的 结果。从技术
角度来说是为了解耦,通过标准化接口来相互协作。既然接口是连接 Servlet 与
Servlet 容器的关键,那我们就从它们的接口说起。
前面说了 Servlet 容器作为一个独立发展的标准化产品,目前它的种类很多,但是
它们都有自己的市场定位,很难说谁优谁劣,各有特点。例如现在比较流行的
Jetty,在定制化和移动领域有不错的发展,我们这里还是以大家最为熟悉 Tomcat
为例来介绍 Servlet 容器如何管理 Servlet。Tomcat 本身也很复杂,我们只从 Servlet
与 Servlet 容器的接口部分开始介绍,关于 Tomcat 的详细介绍可以参考我的另外一
篇文章《 Tomcat 系统架构与模式设计分析》。
Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类
Wrapper,所以 Context 容器如何运行将直接影响 Servlet 的工作方式。
图 1 . Tomcat 容器模型
从上图可以看出 Tomcat 的容器分为四个等级,真正管理 Servlet 的容器是 Context
容器,一个 Context 对应一个 Web 工程,在 Tomcat 的配置文件中可以很容易发现
这一点,如下:
清单 1 Context 配置参数
<Context path="/projectOne " docBase="D:\projects\projectOne"
reloadable="true" />
下面详细介绍一下 Tomcat 解析 Context 容器的过程,包括如何构建 Servlet 的过程。
Servlet 容器的启动过程
Tomcat7 也开始支持嵌入式功能,增加了一个启动类
org.apache.catalina.startup.Tomcat。创建一个实例对象并调用 start 方法就可以很容
易启动 Tomcat,我们还可以通过这个对象来增加和修改 Tomcat 的配置参数,如可
以动态增加 Context、Servlet 等。下面我们就利用这个 Tomcat 类来管理新增的一
个 Context 容器,我们就选择 Tomcat7 自带的 examples Web 工程,并看看它是如
何加到这个 Context 容器中的。
清单 2 . 给 Tomcat 增加一个 Web 工程
Tomcat tomcat = getTomcatInstance();
File appDir = new File(getBuildDirectory(), "webapps/examples");
tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
tomcat.start();
ByteChunk res = getUrl("http://localhost:" + getPort() +
"/examples/servlets/servlet/HelloWorldExample");
assertTrue(res.toString().indexOf("<h1>Hello World!</h1>") > 0);
清单 1 的代码是创建一个 Tomcat 实例并新增一个 Web 应用,然后启动 Tomcat 并
调用其中的一个 HelloWorldExample Servlet,看有没有正确返回预期的数据。
Tomcat 的 addWebapp 方法的代码如下:
清单 3 .Tomcat.addWebapp
public Context addWebapp(Host host, String url, String path) {
silence(url);
Context ctx = new StandardContext();
ctx.setPath( url );
ctx.setDocBase(path);
if (defaultRealm == null) {
initSimpleAuth();
}
ctx.setRealm(defaultRealm);
ctx.addLifecycleListener(new DefaultWebXmlListener());
ContextConfig ctxCfg = new ContextConfig();
ctx.addLifecycleListener(ctxCfg);
ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
if (host == null) {
getHost().addChild(ctx);
} else {
host.addChild(ctx);
}
return ctx;
}
前面已经介绍了一个 Web 应用对应一个 Context 容器,也就是 Servlet 运行时的
Servlet 容器,添加一个 Web 应用时将会创建一个 StandardContext 容器,并且给这
个 Context 容器设置必要的参数,url 和 path 分别代表这个应用在 Tomcat 中的访问
路径和这个应用实际的物理路径,这个两个参数与清单 1 中的两个参数是一致的。
其中最重要的一个配置是 ContextConfig,这个类将会负责整个 Web 应用配置的解
析工作,后面将会详细介绍。最后将这个 Context 容器加到父容器 Host 中。
接下去将会调用 Tomcat 的 start 方法启动 Tomcat,如果你清楚 Tomcat 的系统架构,
你会容易理解 Tomcat 的启动逻辑,Tomcat 的启动逻辑是基于观察者模式设计的,
所有的容器都会继承 Lifecycle 接口,它管理者容器的整个生命周期,所有容器的
的修改和状态的改变都会由它去通知已经注册的观察者(Listener),关于这个设
计模式可以参考《 Tomcat 的系统架构与设计模式,第二部分:设计模式》。
Tomcat 启动的时序图可以用图 2 表示。
图 2. Tomcat 主要类的启动时序图(查看大图)
上图描述了 Tomcat 启动过程中,主要类之间的时序关系,下面我们将会重点关注
添加 examples 应用所对应的 StandardContext 容器的启动过程。
当 Context 容器初始化状态设为 init 时,添加在 Contex 容器的 Listener 将会被调用。
ContextConfig 继承了 LifecycleListener 接口,它是在调用清单 3 时被加入到
StandardContext 容器中。ContextConfig 类会负责整个 Web 应用的配置文件的解析
工作。
ContextConfig 的 init 方法将会主要完成以下工作:
剩余30页未读,继续阅读
资源评论
- yeguangsuixing22012-12-03电脑有点小问题 打不开
- u0110453472014-07-03对于菜鸟初学者,貌似有点高深了,以后慢慢看吧
VictorChen86
- 粉丝: 5
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功