Web 应用程序是服务器方应用程序. 它的开发的最基本要求如下:编程模型和 API, 服务器方运行时支持, 实施(deployment)支持. 实施是指在服务器上安装应用程序的过程. 这一过程还包括配置应用程序组件, 如指定初始化参数和指定任何数据库.

Web 容器实际上是一个 Java 运行时(Runtime), 提供了 Java Servlet API 的一个实现, 并且简化了 JSP 网页. Web 容器负责初始化, 调用以及管理 Java Servlet 和 JavaServer Page 的存活期. Web 容器的例子有: Tomcat, Resin, Weblogic、WebSphere、JBoss等, 没有它们, Web 应用程序就无法和真正的网络服务连接起来.

我们知道 Servlet API 的源码都是一些接口, 而 JSP 网页则是首先编译成 Servlet, 然后才投入运行. 当 JSP 网页更新以后, 由 Web 容器决定重新编译并更新这个 Servlet. 可以明白, 这些接口本身并没有任何的实现代码, 而这些接口的实现则是由 Web 容器来完成. 就像我们按下了电视机的遥控器, 而实际的电视的播放是由遥控器这个操作接口请求电视这个功能的实现来完成, 而不是由遥控器来完成的一样, 它的作用, 只是一个抽象, 功能的抽象.

一个容器可以同时运行多个 Web 应用程序, 它们一般通过不同的 URI 来进行区分和访问. 每个 Web 应用一般都会包含下列部分: JSP, Servlet, 静态资源, 以及实施描述符. 就 Tomcat 而言, 每个 $TOMCAT_HOME/webapps/ 下的子目录(如果这个目录包含一个 /WEB-INF/web.xml 文件的话)就是一个单独的 Web 应用程序. Web 容器保证了它们之间的数据不会互相冲突, 也就是每个应用的 session, application 等服务器变量具有自己的内存空间, 不会互相影响, 被分离开来.

实施描述符(deployment descriptors)是 J2EE Web 应用程序不可分割的一部分(也就是说是它的最小部分, 必不可缺的一部分). 它们在应用程序实施之后帮助管理 Web 应用程序的配置. 对于 Web 容器而言, 实施描述符是一个名为 web.xml 的 XML 文件, 存储在 Web 应用程序的 /WEB-INF 目录下. Java Servlet 技术为实施描述符提供了一个文档定义类型(DTD), 可以从网址 http://java.sun.com/dtd/web-app_2_3.dtd 查到.

实施描述符有多种用途:
为 Servlet 和 Web 应用程序提供初始化参数   这使我们的 Web 应用程序中的硬性编写的代码的初始化值更少. 例如常见的 , 标记, 就可以为 Servlet 提供参数, 这个参数可以在 init() 方法中加载. Struts 的 ActionServlet 也是通过这种方式来找到它们需要的配置文件 struts-config.xml 的位置, 从而加载并分析它, 来初始化 Struts 框架用到的各种 FromBean, Action, Forward 等.
Servlet/JSP 定义   可以为 Web 应用程序中的每个 Servlet 或者预编译的 JSP 网页提供定义. 包括 Servlet/JSP 的名字, Servlet/JSP 的类以及一个可选的描述.
Servlet/JSP 映射   Web 容器使用这些信息把进入请求映射到 servlet 和 JSP 网页.
MIME 类型   由于每个Web应用程序可以包含多种内容类型, 因此我们可以在实施描述符中为每一种类型指定MIME类型.
安全性      我们可以使用实施描述符来管理应用程序的访问控制. 例如, 可以指定我们的 Web 应用程序是否需要登录, 如果需要的话, 应该使用什么登录页面, 以及用户会作为何种角色.
实施描述符还可以用来自定义其他元素, 包括欢迎网页, 出错网页, 会话配置.   Web 应用程序的结构
Web 应用程序有四个部分:
一个公开目录
一个 WEB-INF/web.xml 文件
一个 WEB-INF/classes 目录
一个 WEB-INF/lib 目录
公开目录存放所有可以被用户的访问的资源, 包括 .html, .jsp, .gif, .jpg, .css, .js, .swf 等等.
WEB-INF目录是一个专用区域, 容器不能把此目录中的内容提供给用户. 这个目录下的文件只供容器使用, 里面包含不应该由客户直接下载的资源, 例如: Servlet(这些组件包括应用程序逻辑以及对其他资源如数据库的可能访问), Web 应用程序中 servlet 可直接访问的其他任何文件, 在服务器方运行或者使用的资源(如 Java 类文件和供 servlet 使用的 JAR 文件), 由您的应用程序生成的临时文件, 实施描述符以及其它任何配置文件. 这些资源是专用的, 因此只能由它们自己的 Web 应用程序及容器访问. 特别地, JSP/Servlet 程序文件也能通过 ServletContext 访问到这个目录下的文件, 例如 JSP 中可以通过 application.getRealPath("/WEB-INF/web.xml") 访问到实施描述符文件的路径. Web 容器要求在你的应用程序中必须由 WEB-INF 目录. 如果你的 Web 应用程序中没有包含这个目录, 它将不能工作. WEB-INF 中包含着实施描述符, 一个 classes 目录和一个 lib 目录, 以及其它内容. classes 目录用于存储编译过的 servlet 及其它程序类, 例如 JavaBean. 如果一个程序有打包的 JAR 文件(例如一个第三方 API 打包成了一个 JAR 文件, 如 Struts 框架的类库 struts.jar, MySQL 的数据库 JDBC 驱动程序文件 mm.mysql.jar 等), 那么它们可以被复制到 lib 目录中(如果解压缩这些压缩包的话, 请将它们复制到 classes 目录中). Web 容器使用这两个目录来查找 servlet 及其他相关类, 也就是说, 容器的类装入器会自动查看 classes 目录, 以及 lib 目录下的 JAR 文件. 这就意味着你不需要明确的把这些类和 JAR 文件添加到 CLASSPATH 中. Web 容器自动将这两个目录中的文件加入 Web 应用的类路径中.
以 Tomcat 的默认安装后的 ROOT 目录为例, 它包含下列文件:

1ROOT   Web应用程序根目录
│ /index.jsp   默认的JSP欢迎页面
│ /jakarta-banner.gif   资源文件
│ /tomcat-power.gif   资源文件
│ /tomcat.gif      资源文件

└─1WEB-INF   Web应用实施配置信息目录
/web.xml   Web应用实施描述符
那么一个 Web 应用程序的最小的文件要求是什么呢? 答案是需要一个 WEB-INF 目录和这个目录下的 web.xml. 而这个 web.xml 的最少内容则是:


PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
web-app>

让我们看看 Tomcat 示例目录下 web.xml 的内容:


PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>Welcome to Tomcatdisplay-name>
<description>
Welcome to Tomcat
description>
web-app>

实施描述符的第一行是一个 XML 声明, 指出了 XML 的版本号和使用的编码:
  
这些语句后跟随的是文档类型声明, 指定了此应用程序的 DTD 要使用的 URI:
   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
在 Web 应用程序中, DTD 是 J2EE 关于 Web 应用程序技术规范的一部分, 也是我们所有 Web 应用程序的标准, 请注意这里的版本号是 2.3. web-app 标记则定义了一个 Web 应用, 这里仅仅定义了这个 Web 应用的显示名称(display-name) 和描述信息(description), 如果使用一个可视化的 Web 应用实施描述符编辑器, 就可以看到这些信息. 其他的类似于 URL 映射, Servlet 定义, 出错页面等等都在这个标记下做为子标记进行扩充和配置.

最后, 这些内容在实践中有何用途呢? 结合 Tomcat 聊一下这个问题.
首先, 关于类路径的问题, 开发的 Java 类文件可以通过两种方式发布到 Web 应用中, 可以直接复制到 WEB-INF/classes 下(注意保持包的目录结构不变), 如果没有 classes 目录, 可以创建这个目录. 也可以打包成 JAR 文件(JAR 文件的格式就是 ZIP 文件的, 可以通过 WinZip, WinRAR 等程序创建一个包含类文件的 ZIP 文件, 然后将其文件扩展名修改为 .jar 即可), 然后将这个 JAR 文件放置到 WEB-INF/lib 目录下. 注意对这两个目录中文件内容的修改, 可能需要重新启动 Web 服务器才能生效, 即 Tomcat. 如果应用程序使用了配置文件, 例如典型的 Struts 的配置文件 Application.properties, 只能放置在 WEB-INF/classes 目录下.
其次, 如果要配置多个 Web 应用, 则可以在 %TOMCAT_HOME%/webapps/ 目录下建立一个最少包含 WEB-INF/web.xml 的目录, 假设该目录名为 webapp1, 那么其访问 URI 为 http://hostname:port/webapp1, 可以添加 WEB-INF/classes 目录和 WEB-INF/lib 目录. 可以创建多个这样的 Web 应用, 例如需要运行两个 Struts 应用程序, 则可以创建两个同样内容但是根目录名称不同的目录做为两个单独的 Web 应用程序. 每次创建新的 Web 应用后可能需要重启 Tomcat 服务器.

关于 Web 应用, WAR 文件, Web 实施描述符, Web 应用标记等的详细信息, 可以通过阅读<<J2EE 编程指南(1.3版, 或者 1.4版)>>(中文版由电子工业出版社出版, 1143 页, 定价106.00元, 英文书名为 Professional Java Server Programming J2EE 1.3 Edition, 由 Wrox 出版社出版)的第5章(Web 容器介绍)和第9章(Web 实施,验证和打包)来了解, 也可以通过网上资源来了解

---------------------------------------------------------------------------------------------

容器就是放你jsp页面和servlet还有其他资源的那个环境。就象ASP的IIS一样的。主要作用么无非就是把客户端发来的HTTP请求   打造成request对象,然后根据所请求的JSP或者servlet,将其结果用reponse这个对象以HTTP的格式发到客户端。让你的浏览器解释发来的HTML等格式的字符串(或2进制)。  
当然,这个只是最基本的操作,还有很多其他的,如线程管理啊什么的~~~

posted on 2010-06-09 14:43  GT_Andy  阅读(6470)  评论(0编辑  收藏  举报