zoukankan      html  css  js  c++  java
  • 贯通tomcat --- 电子书

    http://www.educity.cn/jiaocheng/j10865.html  

    第1章 认识Tomcat

      【本章导读】

      Tomcat服务器是一个免费的开放源代码的Web应用服务器。它是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中及时地得到体现,Tomcat 6支持最新的Servlet 2.5和JSP 2.1规范。因为Tomcat技术先进、性能稳定且免费,所以深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。

      本章作为本书的第1章,简要回顾了Java Web应用的历史、技术发展概况,以及Tomcat如何融入到这个技术发展过程中。通过本章的学习,读者能够了解Tomcat的体系结构、Tomcat新的版本特征,以及Tomcat与其他Web服务器、应用服务器的区别。

      本章主要内容包括动态页面技术的基本知识、Tomcat有哪些新的特性、Tomcat的体系结构,以及如何区分Tomcat与Web服务器、应用服务器的关系。

      1.1 Java Web应用简介

      在Sun的Java Servlet规范中,对Java Web应用做了这样的定义:"Java Web应用由一组Servlet、HTML页面、类,以及其他可以被绑定的资源构成。它可以在第三方供应商提供的实现Servlet规范的Web应用容器中运行。"Java Web应用的主要特征之一就是与ServletContext的关联。每个Web应用都有且只有一个ServletContext.当Java Web应用运行时,Servlet容器为每个Web应用创建唯一的ServletContext对象,使得它能被同一个Web应用中的所有组件共享。Servlet容器(例如Tomcat)控制这种关联,并且保证在ServletContext中存储对象时,不会发生冲突。在Java Web应用中可以包含如下内容:

      Servlet

      JSP

      实用类

      静态文档,如HTML、图片等

      客户端类

      描述Web应用的信息(Web.xml)

      在生成一个Web应用时,第一步要做的工作就是生成Web应用的目录结构。表1-1中通过一个名为example的例子,描述了Web应用应该包含的目录结构。这些目录都应该放在Servlet容器的<SERVER_ROOT>目录下,比如在Tomcat中就是%CATALINA_HOME%/webapps.

    表1-1Web应用目录结构

      从目录结构中可以看到,对于一个Web应用来说,classes既可以放置在/WEB-INF/classes目录下,也可以放置在/WEB-INF/lib目录下。对于类加载器来说,将首先从/classes目录里加载类,然后再从/lib目录加载。如果在这两个目录中放置了同样的类文件,则/classes目录里面的类被加载使用。

      所有Web应用的核心就是它的部署描述符。部署描述符是一个XML文件,命名为web.xml,存放在/<SERVER-ROOT>/applicationname/WEB-INF/目录下。它描述整个Web应用的配置信息。针对上面的案例来说,web.xml存放在/<SERVER-ROOT>/example/WEB-INF目录下。部署描述符主要包含以下描述信息:

      ServletContext初始化参数

      本地目录

      会话配置

      Servlet/JSP定义

      Servlet/JSP映射

      MIME类型映射

      欢迎文件列表

      错误页面

      安全

     
     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Java API

     

      1.1.1  Java API

      Tomcat作为Servlet容器,是Java 2企业版平台(J2EE)中的关键组件。

    J2EE定义了一组基于Java的API,满足生成企业级的Web应用。

    无论企业的大小,都可以使用J2EE技术,但是J2EE的目标是为了解决大的软件系统带来的问题。

    J2EE建立在Java 2标准版之上(J2SE),J2SE包含了Java二进制代码(例如JVM和字节码编译器),以及核心的Java代码库。

    J2EE依赖J2SE的功能。J2EE和J2SE都包含在http://Java.sun.com,且都作为应用程序能够基于的平台选择种类。

      正如上面所述,J2EE是Java API的标准集合。应用程序接口(API)用于软件开发人员描述服务商所提供的服务接口。在Java中,API用于描述Java虚拟机(JVM)及其代码库所能提供的服务接口。Java中的API都由Java标准制定组织Java Community Process(JCP)来维护。JCP是一个开放的国际组织,主要由Java开发者,以及被授权者组成,职能是发展和更新Java技术规范、参考实现(RI)、技术兼容包(TCK)。Java技术和JCP两者的原创者都是Sun计算机公司。然而,JCP已经由Sun于1995年创造Java的非正式程序,演进到如今有数百名来自世界各地Java代表成员一同监督Java发展的正式程序。

      JCP维护的规范包括J2ME,J2SE,JavaEE,XML,OSS和JAIN等。组织成员可以提交JCR(Java Specification Requests),通过特定程序以后,进入到下一版本的规范里面。

      所有声称符合JavaEE规范的JavaEE类产品(应用服务器、应用软件、开发工具等),必须通过该组织提供的TCK兼容性测试(需要购买测试包),通过该测试后,需要缴纳JavaEE商标使用费。完成了前述的两项工作即是通过了JavaEE认证(Authorized Java Licensees of JavaEE)。

     

     

     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    J2EE API

     

      1.1.2 J2EE API

      1.J2EE 1.4简介

      J2EE 1.4平台包含了众多的API,Servlet和JSP API仅仅是其中的两个。表1-2中描述了其他的J2EE API。

    表1-2 J2EE 包含的其他API

      除了J2EE制定的API,J2EE应用也在很大程度上依赖J2SE API.近年来,J2EE API有多个已经移植到J2SE平台。一个是Java命名目录接口(JNDI),另外一个是XML处理Java API(JAXP)。J2EE和J2SE构成了企业软件开发的平台。近年来,虽然微软的。NET平台声称作为J2EE平台的替代品,然而对于。NET来说未来的路还很遥远。

     

      2.J2EE 5简介

      J2EE 5不是间接地由J2EE改名而来的,Sun对其做了重大修改,算是一种新的技术。从提交公开审查的规范草案J2EE 5来看,J2EE 5的关注重点是简化应用开发,尤其是大量采用元数据标注(annotation)和POJO(普通Java对象)驱动的开发方式,对平台进行了重新定义。对比此前的J2EE规范,J2EE 5最重要的新增特性就是Java持久化API(即EJB 3 entity bean)、JSF、JSTL等。

      从整个EJB规法的角度来说,EJB 3相对于EJB 2.0的最大变更在于Entity Bean持久化API上。在EJB 3中,Entity Bean持久化已经单独作为一个Persistence API规范和其他的EJB部分分离开来。 EJB 2.0模型存在一些缺陷:

      (1)EJB 2.0模型要求创建多个组件接口,并实现多个不必要的回调方法。

      (2)组件接口要求实现EJBObject或EJBLocalObject,以及处理许多不必要的异常。

      (3)基于XML的EJB 2.0部署描述符比较复杂且容易出错。

      (4)基于EJB模型的容器管理持久性在开发和管理方面过于复杂,并且失去了几个基本特性--如使用数据库序列定义主键的标准方法。

      (5)EJBQL语法非常有限,而且是静态的,无法做到运行期间的动态查询。

      (6)EJB 2.0组件并非是真正面向对象的,因为它们在继承和多态性方面有使用限制。

      (7)查找和调用EJB 2.0是一项复杂的任务,即使是在应用程序中使用最基本的EJB也需要对JNDI有一个详细的了解。

      (8)对容器的依赖使得EJB 2.0只能用于服务器组件的开发,无法实现一次编写,来进行四处运行的面向构件的开发。

      所有这些复杂性和缺陷,都导致EJB 2.0的采用无法真正简化开发并提高生产力。EJB3.0旨在解决以往EJB2.0模型的复杂性和提高灵活性,具体体现在:

      (1)去除了不必要的接口Remote,Home,EJB,以及回调方法实现。

      (2)实体Bean采用了POJO模型,一个简单的Java bean就可以是一个Entity Bean.无需依赖容器运行和测试。

      (3)全面采用O/R Mapping技术来实现数据库操作。

      (4)实体Bean可以运行在所有需要持久化的应用,不管是客户端还是服务器端。从而真正实现面向构件的开发。

      (5)实体Bean现在支持继承和多态性。

      (6)灵活丰富的EJB3查询语言。

      (7)SQL支持。

      (8)使用元数据批注代替部署描述符,减少复杂性。

      Java EE5作为J2EE平台诞生6年后的第4代规范,重点关注的是目前Java开发的几个热点:开发效率、运行效率和企业应用整合。目标也是让J2EE开发简单、简单再简单。J2EE 5作为新一代Java架构的规范,已经越来越受到开发者的重视。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    CGI

     

      1.1.3  CGI

      Web页面并不仅仅只由静态页面组成,显示同样的页面给每个用户。许多页面内容的产生依赖于不同的浏览者。静态页面在Web应用中占有重要的位置,但是如果没有动态页面参与,很多重要的页面站点将不能良好的运行,来满足其功能需求。

      通用网关接口(Common Gateway Interface CGI)是最初的动态内容机制,它在Web服务器上执行,允许网站管理员定制他们的页面。CGI模型描述如下:

      (1)客户端发送请求给服务端,比如超文本链接标示语言(HTML)页面;

      (2)服务器接受用户请求并交给CGI程序处理;

      (3)CGI程序将处理结果传送给服务器;

      (4)服务器将结果作为HTTP响应返回给用户。

      CGI可以使用多种编程语言来实现,例如Perl.但是CGI不是非常有高效,每次服务端接受到请求,它都必须启动新的CGI进程来处理。在用户量不大的情况下,这个问题还不至于太明显。但是如果用户请求量较大,每次都启动新的CGI进程处理,相对服务器资源代价就会较高。

      由于CGI本身的缺陷,因此许多替代方案应运而生。一般来说,在这些方案中如果提供环境存在于已经存在的服务器中或者作为服务器的功能组件的话,它将获得更大的成功。由于Apache良好的模块应用程序接口(API),许多CGI的替代品都建立在Apache服务器(www.apache.org)之上。开发者可以通过API扩展Apache的功能,而不用更改服务器本身代码。对于程序员来说,生成动态内容,不失为一个好的策略。当Apache开始传输HTTP请求给模块时,Apache加载模块到它的内存;然后只要模块处理完请求,Apache把响应返回给客户端。由于模块已经加载在服务端的内存中,因此加载解释器的开销几乎可以忽略不计,使得脚本(Scipts)执行得更快。

      目前很少有开发者有能力开发类似的模块,因此许多第三方模块提供了其基本的功能,甚至比通常的CGI更加强大。以下是一些例子:

      Mod_perl:内嵌在服务器中的Perl解释器,减少了每次请求加载Perl解释器的开销。

      Mod_php4:与上面mod_perl一样,提高PHP的执行效率。

      Mod_fastcgi:驻留在内存,提高CGI的响应速度。

      微软也提供了Internet信息服务(IIS)Web服务器接口,称为Internet服务应用程序接口(ISAPI)。由于IIS作为Windows操作系统的组成部分,因此IIS目前被广泛地使用。在第19章中,将会详细讲述Tomcat与IIS如何集成,如何整合利用它们最好的性能特征。

      微软也开发了动态服务器主页(ASP)技术,使得用户能够嵌入Scripts脚本,比如嵌入VBScript到标准的HTML页面中。事实证明这个技术非常有效,而且对于Java Web技术起到了推进作用。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Servlet

     

      1.1.4  Servlet

      Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序相同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。

      现将Java Servlet与Applet技术做如下的比较:

      1.相似之处

      它们都不是独立的应用程序,没有main()方法。

      它们都不是由用户或程序员调用,而是由另外一个应用程序(容器)调用。

      它们都有一个生存周期,包含init()和destroy()方法。

      2.不同之处

      Applet具有很好的图形界面(AWT),与浏览器一起,在客户端运行。

      Servlet 则没有图形界面,运行在服务器端。

      与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。在未来的技术发展过程中,Servlet有可能彻底取代CGI,这是因为Java Servlet相对CGI具有如下的优点:

      (1)高效

      在传统的CGI中,每个请求都要启动一个新的进程。如果CGI程序本身的执行时间较短,那么启动进程所需要的时间很可能超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。

      在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中就会重新装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。

      (2)方便

      Servlet提供了大量的实用工具例程,例如,自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。

      (3)功能强大

      在Servlet中,许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如,Servlet能够直接和Web服务器交互。而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据,使得数据库链接池之类的功能很容易实现。

      (4)可移植性好

      Servlet用Java编写,Servlet API具有完善的标准。因此,为IPlanet Enterprise Server写的Servlet无须任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar,几乎所有主流服务器都直接或通过插件支持Servlet.

      (5)节省投资

      不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用,而且对于现有的服务器,如果它不支持Servlet的话,要加上这部分功能也往往是免费的(或只需要极少的投资)。

      Java Server Pages(JSP)是一种实现普通静态HTML和动态HTML混合编码的技术,JSP并没有增加任何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便,不必再用println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。

      如果对于写过Applet程序的人来说,相信写Servlet程序并不难,甚至更为简单。因为Servlet没有图形界面,写起来与传统的文字界面程序一样简单。与Applet一样,在Servlet中一样定义了一个生命周期:

      (6)初始化时期

      与Applet相似,在Servlet中,也有一个Init()方法

      Public void init(ServletConfig config) throws ServletException

      {

      Super.init();//做一些初始化动作

      }

      当Servlet被Servlet引擎加载后,接下来就会执行init()方法,因此我们可以重载init()方法,用于完成一些所需要的初始化动作。比如打开文件,读取设定的默认值,以及建立一个链接池(Connection Pool)等。但是不要忘记,自己的Init()执行完后,要记得调用super.init(),以免有些系统的初始化被不小心省略掉了。

      (7)执行时期

      提供了一些与HTTP协议对应的有关方法。因为它是抽象类别,所以必须继承它,然后重载该方法。执行时期分为数类,分别是对应HTTP方法中的Get,Post等方法,例如doGet()对应到Get或doPost()对应到Post方法。以doGet()为例,如果浏览器传过来的是Get请求模式,那么就会执行doGet()方法。同样地,doPost()方法也就是在HTML Form传过来的Post请求时执行。如果对HTTP协议不是很了解,那么请参阅相关书籍和资料。

      (8)结束时期

      在Init()方法中,开启了某些资源。当网页服务器系统要重新启动,或是要回收资源时,就会调用destroy()这个方法,执行这个最后的部分。但是同样也要记得调用super.destroy()方法。

      (9)执行架构

      Servlet属多线程执行方式,同一时间会有多个线程处理对应的客户端的请求,因此它的service()方法会被同时调用。从图1-1中可以看到,其中的Init()与destroy()方法永远只会执行一次,因为即使是多线程方式执行,Servlet的实体还是只有一个,故初始化与结束仅需一次即可。这是Servlet引擎管理的,Servlet引擎会保证这样的执行结果。

    图1-1 Servlet执行架构

      2005年9月26日,Sun公司和JSR154的专家组发布了Servlet API的一个新的版本。在一般情况下,一个JSR的新版本仅仅就是对以前少数有名无实的规范进行去除更新。但这次,新版本中增加了新的特征,它们对Servlets的产生了重要影响,使得Servlet的版本升到了2.5.

      Servlet 2.5的一些变化,包括它基于最新的J2SE 5.0开发的;支持annotations;Web.xml中的配置更加方便;去除了少数的限制;优化了一些实例等等。

      从一开始,Servlet 2.5 规范就列出J2SE 5.0(JDK 1.5)作为它最小的平台要求。它使得Servlet 2.5只能适用基于J2SE 5.0开发的平台,这个变动意味着所有J2SE5.0的新特性都可以保证对Servlet 2.5程序员有用。

      在传统意义上,Servlet和J2EE版本一直与JDK的版本保持同步发展。但是,这次Servlet的版本跳过了1.4版本。专家组认为版本的加速增长是正常的,因为J2SE 5.0提出了一个引人注目的、Servlet和JEE规范都要利用的特征--Annotations.

      Annotations是作为JSR175的一部分(一种为Java语言设计提供便利的Metadata)提出的一种新的语言特色。它是利用Metadata为Java编码结构(类、方法、域等)装饰的一种机制。它不能像代码那样执行,但是可以用于标记代码。这个过程是基于Metadata信息的代码处理机,通过更新它们的事件行为来实现的。

      Annotations可以凭借不同的技巧来注释类和方法,例如连续地标记接口或者是@deprecated Javadoc评论。这种新式的Metadata可以便利地提供一种标准的机制来实现注释功能,以及通过库来创建用户自己的注释类型的变量。

      下面是一个简单的Web service 注释例子:

      import Javax.jws.WebService;

      import Javax.jws.WebMethod;

      @WebService

      public class HelloWorldService {

      @WebMethod

      public String helloWorld() {

      return "Hello World!";

      }

      }

      @WebService和@WebMethod这两个注释类型,在JSR181(为Java平台提供的Web ServicesMetadata)有详细说明,可以像类一样的引用,标记这个类作为一个Web service并且标记它的helloWorld()方法作为一个Web service方法。对于它们本身来说,注释只是写在那里并没有什么作用,好像在岗位上做记录一样。但是,一个容器一旦加载这个类并对那些注释进行二进制编码,就可以把这个类连到Web service上。

      注释可以接受属性/值这些参数。它保存着参数的信息并且可以利用这些参数来更改被请求的事件行为。例如下面更高级的注释例子:

      @WebService(

      name = "PingService",

      targetNamespace=http://acme.com/ping

      )

      @SOAPBinding(

      style=SOAPBinding.Style.RPC,

      use=SOAPBinding.Use.LITERAL

      )

      public class Ping {

      @WebMethod(operationName = "Foo")

      public void foo() { }

      }

      一旦加载了这个类,一个正确配置的容器就会识别出注释及其参数,并将此作为一个PingService,然后将它通过利用remote-procedure-call/literal的编码方式与一个Foo operation相连。实际上,注释就是指明了类和类的容器之间的联系。

      不论使用注释与否,即使在不使用时--它对于理解服务器上程序的执行依然有着重要意义。为了让服务器识别类中的注释,它必须加载这些类,这就意味着服务器必须是启动着的。服务器通过WEB-INF/classes目录下和WEB-INF/lib目录下的所有类文件来查找注释。(在任何规范下,服务器都只需查找这两个目录。)可以通过下面的方法指明<Web-app>根的属性而不必使用任何注释:

      <Web-app xmlns=http://Java.sun.com/xml/ns/Javaee

      version="2.5" full="true">

      </Web-app>

      Servlet 2.5还为Web.xml引入了几个小的变动,使得它更加方便。

      首先,当写<filter-mapping>,可以在<Servlet-name>标签中使用*号来代表所有的Servlets.而以前,必须一次把一个Servlet绑定到过滤器上,像这样:

      <filter-mapping>

      <filter-name>Image Filter</filter-name>

      <Servlet-name>ImageServlet</Servlet-name>

      </filter-mapping>

      现在就可以一次绑定所有的Servlets:

      <filter-mapping>

      <filter-name>Image Filter</filter-name>

      <Servlet-name>*</Servlet-name>??<!-- 新特征 -->

      </filter-mapping>

      这有很大的用途,例如:

      <filter-mapping>

      <filter-name>Dispatch Filter</filter-name>

      <Servlet-name>*</Servlet-name>

      <dispatcher>FORWARD</dispatcher>

      </filter-mapping>

      其次,当写<Servlet-mapping> 或者 <filter-mapping>时,可以在同一标签中采用复合匹配的标准。以前一个<Servlet-mapping>只支持一个<url-pattern>元素,现在它可以支持更多个元素,例如:

      <Servlet-mapping>

      <Servlet-name>color</Servlet-name>

      <url-pattern>/color/*</url-pattern>

      <url-pattern>/colour/*</url-pattern>

      </Servlet-mapping>

      同样地,以前<filter-mapping>也是只支持一个<url-pattern> 或者一个 <Servlet-name>,现在它都可以支持任意多个元素:

      <filter-mapping>

      <filter-name>Multipe Mappings Filter</filter-name>

      <url-pattern>/foo/*</url-pattern>

      <Servlet-name>Servlet1</Servlet-name>

      <Servlet-name>Servlet2</Servlet-name>

      <url-pattern>/bar/*</url-pattern>

      </filter-mapping>

      Servlet 2.5还可以将合法的HTTP/1.1方法名放进<http-method>元素中。当使用这些方法时,<http-method>将指明<security-constraint>标记里的方法应该被应用。从以前来看,它仅限于HTTP/1.1的7个标准方法:GET,POST,PUT,DELETE,HEAD,OPTIONS和TRACE.现在,HTTP/1.1允许对方法进行扩展,WebDAV(Web-based Distributed Authoring and Versioning)就是用于这种扩展的普遍技术。在Servlet 2.5中,你可以安全地约束任何可能的HTTP方法名、标准及扩展,包括WebDAV方法,例如LOCK,UNLOCK,COPY及MOVE.

      当需要写一个WebDAV的Servlet时,不再必须使用doLock()和doCopy()方法,而只需写自己的service()方法及分派request.getMethod()方法。正是由于这种变化,工作人员不必再考虑系统的安全性。

      Servlet 2.5去除了关于错误处理和回话跟踪的一些限制。对于错误处理,在Servlet 2.5之前,配置在<error-page>中的错误处理页面不能通过调用setStatus()方法来修改触发它们的错误代码。这一规范是基于这样的观点,即错误页面的工作是指出每个错误而不是修改错误。但是,在实际使用中,错误页面不能只是用于指出错误,而是还能做更多的事情,甚至可以代替在线帮助来帮助用户解决问题。于是,Servlet 2.5减弱了这一规范,这一规范也将不再限制错误页面所产生的反馈信息。

      对于会话跟踪,在Servlet 2.5之前,调用RequestDispatcher.include()的Servlet不能设置响应的标题头,而又是Servlet 2.5减弱了这一规范。原规范的目的是使内部的Servlets限制在自己的页面空间中,不可以影响外部的页面。现在这个规范已经被减弱,就允许在内部的Servlet中使用request.getSession()命令,这样这个命令就可以悄悄地创建一个会话跟踪Cookie的标题头。虽然在逻辑上要求限制内部的资源,但在逻辑上也要求这些限制不应该取消其启动Session的功能。这个变动对于Portlet规范来说显得尤其重要。其作用是:如果响应已经有效,则getSession()命令就会抛出一个IllegalStateException9(异常)。而在此之前,就没有这个功能。

      Servlet 2.4规范规定响应在这几种情况下应该是有效的,在响应的setContentLength方法中内容已经明确说明,以及内容已经写进了响应中。这种情况只有您的代码像下面这样才可以使响应重新定向:

      response.setHeader("Host", "localhost");

      response.setHeader("Pragma", "no-cache");

      response.setHeader("Content-Length", "0");

      response.setHeader("Location", "http://www.apache.org");

      Servlet技术忽略特定区域的标题头,因为内容满足0字节长度,响应就会立即生效。而在它开始之前,响应就已失效了!Servlet容器通常拒绝执行这种行为,而Servlet 2.5版本增加了"长度必须大于0"的这个原则。

      Servlet 2.4规范规定必须在调用request.getReader()方法之前调用request.setCharacterEncoding()方法。但是,如果你忽略这个原则而在其之后去调用request.setCharacterEncoding()方法,那么会产生什么样的后果,这个问题在规范里并没有说明。为了简便起见,现在排除这种情况!

      Cross-context sessions(不同上下文目录间的会话)

      最近,关于Cross-context会话处理的规则已经明确说明。当Servlets指派从一个上下文到其他上下文的请求时,这个规则就发挥了作用--在目标调用过程中,包括哪些会话。这个版本的出现使得一个上下文目录主页里的Portlets可以通过几种内部的命令来对别的上下文目录里的Portlets起作用。Servlet 2.5明确指出一个上下文目录里的资源可以访问其他上下文目录的Session(会话),而不用考虑这个请求从哪里开始的。这意味着Portlets可以脱离主页的范围而在自己的范围里运行,而且这个规范还会应用在不兼容的Serlvet容器中。

      由于Servlet 2.5版本保持了一些原来的性质,几个大的概念不得不延后到下一个阶段。它们包括:

      新的输入/输出(NIO)支持:使Servlets进行客户端通信成为可能。

      过滤器wrap-under或wrap-over语义:有时用过滤器包装请求,或者响应对象去修改方法行为或者启用新的方法。当把这种包装和服务器对请求和响应的包装结合起来时,又应该怎么包装在一起呢?

      用于欢迎的Servlets文件:作为索引应该充当欢迎作用的文件吗?在此之前,这个回答是肯定的。但是规范没有明确地说明如何使用这个功能,尤其在没有索引的情况下。

      用于欢迎的文件的分派规则:如何分派欢迎文件,这个细节并没有完全说明,而是遗留了一些开放的缺口来应对不兼容问题。

      登录后选择默认页面:如果用户通过他们的书签访问Servlet的登录页面,那么在成功登录后页面应该转向哪里呢?这个问题至今尚未明确说明。

      用户的主题日志:在通过网站正确地注册之后,不通过传统地登录方式没有办法使Servlet信任用户。

      如果抛开注释来看Servlet 2.5的变化,可见在配置文件Web.xml中去除了一些限制,同时又优化了实例行为,使其更适合、更便于开发Web系统(网页)。

      Servlet 2.5中注释的作用也有所变化。Servlets本身并不能声明注释类型的变量,甚至性能弱的Servlet容器都不支持注释。然而在J2EE5环境下的Servlets编写者可以看到,通过公共的注释及EJB3.0和JAX-WS2.0规范而引入的注释类型会对代码产生很大变化,并且这也将对Servlet如何管理外部资源、对象的持久化及EJB的构成产生重大影响。

      Servlet尽管在性能和服务端负载方面超越了CGI,但是它仍然有自己的缺点:

      在复杂的HTML网页中加入动态部分,如果用Servlet来处理的话,编写代码的工作量将相当之大。

      由于在程序中的硬编码,使得应用程序维护性极差。因为如果在HTML中修改文本内容,则Servlet必须重新编译。

      Servlet要求页面设计人员必须对Java有足够的了解。

      正是由于Servlet存在上面的问题,才导致了JSP技术的出现。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    JSP

     

      1.1.5  JSP

      JSP (Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准,实现了普通静态HTML和动态HTML混合编码的技术。JSP是在服务器端建立的动态网页,更明确地说,JSP是能在Web服务器端整个Java语言至HTML网页的环境中,利用HTML网页内含的Java程序代码取代原有的CGI、ISAPI或者IDC的程序,以便执行原有CGI/WinCGI、ISAPI的功能。许多由CGI程序生成的页面大部分仍旧是静态HTML,动态内容只在页面中有限的几个部分出现。但是包括Servlet在内的大多数CGI技术及其变种,总是通过程序生成整个页面,JSP技术可以分别创建这两个部分。

      现将JSP与ASP、PHP技术相比较,应会发现有如下的优点。

      将内容的生成和显示进行分离

      使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使用JSP标识或者小脚本来生成页面上的动态内容,其生成的内容的逻辑被封装在标识和JavaBeans组件中,并且捆绑在小脚本中,所有的脚本在服务器端运行。因为核心逻辑被封装在标识和Beans中,所以其他人,如Web管理人员和页面设计者,能够编辑和使用JSP页面,而不影响内容的生成。在服务器端,JSP引擎解释JSP标识和小脚本,生成所请求的内容(例如:通过访问JavaBeans组件、使用JDBC技术访问数据库等),并且将结果以HTML(或者XML)页面的形式发送至浏览器。这有助于开发者既保护自己的代码,又保证任何基于HTML的Web浏览器的完全可用性。

      强调可重用的组件

      绝大多数的JSP页面依赖于可重用的、跨平台的组件(JavaBeans或者Enterprise JavaBean组件)来执行应用程序所要求的更为复杂的操作。开发人员能够共享和交换执行普通操作的组件,使得这些组件为更多的使用者或者客户团体所使用。基于组件的方法加速了总体开发过程,使得各种组织在他们现有的技能和优化结果的开发努力中得到平衡。

      采用标签简化页面开发

      Web页面开发人员不会都是熟悉脚本语言的编程人员。JSP技术封装了许多功能,这些功能是在生成易用的、与JSP相关的XML标识的动态内容时所需要的。标准的JSP标识能够访问和实例化JavaBeans组件、设置或者检索组件属性、下载Applet,以及执行用其他方法更难于编码和耗时的功能。

      通过开发定制标签库,JSP技术是可以扩展的。今后第三方开发人员和其他人员可以为常用功能创建自己的标签库。这使得Web页面开发人员能够使用如同标签一样的工具来执行特定功能。

      健壮性与安全性

      由于JSP页面的内置脚本语言是基于Java编程语言的,而且所有的JSP页面都被编译为Java Servlet,JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。

      良好的移植性

      作为Java平台的一部分,JSP拥有Java编程语言"一次编写,各处运行"的特点。随着越来越多的供应商将JSP支持添加到他们的产品中,可以使用自己所选择的服务器和工具,而且更改工具和服务器并不影响当前的应用。

      企业级的扩展性和性能

      当与Java 2平台、企业版(J2EE)和Enterprise JavaBeans技术整合时,JSP页面将具有更好的扩展性和性能。

      JSP并没有增加任何本质上不能用Servlet实现的功能。但是,在JSP中编写静态HTML更加方便,不必再用Println语句来输出每一行HTML代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开。比如,由页面设计专家进行HTML设计,同时留出供Servlet程序员插入动态内容的空间。

      SSI是一种受到广泛支持的在静态HTML中引入外部代码的技术。JSP在这方面的支持更为完善,因为它可以用Servlet而不是独立的程序来生成动态内容。另外,SSI实际上只用于简单的包含,而不是面向那些能够处理表单数据、访问数据库的"真正的"程序。

      JavaScript能够在客户端动态地生成HTML.虽然JavaScript很有用,但它只能处理以客户端环境为基础的动态信息。除了Cookie之外,HTTP状态和表单提交数据对JavaScript来说都是不可用的。另外,由于是在客户端运行,JavaScript不能访问服务器端资源,比如数据库、目录信息等。

      2006年Sun发布了JSP和JSF新技术规范,其中最重要的一点是两者将表达式语言(Expression Language,EL)部分合二为一。在不久的将来,这两种技术有可能更进一步地彼此融合,成为一种统一的表现层技术。JSP 2.1把Expression Language(EL)输出到它自己各自分离的文档中,在技术上,这些文档是JSP规范的子文档。这些统一的EL规范定义了一个更高层的Java 包--Javax.el.这个包与使用它的技术之间完全独立,并且允许此技术将自身插入EL处理过程。更改的JSP规范遵从使用标准化EL的规范。对于前面提到的JSR-252,这个规范并没什么新特性。Faces 1.2支持新的标准化EL,还包含一些Bug修复的相关规范。

      Faces和JSP在JSRs下的结盟带来了一些新功能,也为将来的发展打下了坚实的基础。例如,在同时使用Faces和JSP的Web应用中,网页仅使用JSP(不包含任何Faces内容)来访问Managed Beans成为可能。在JSP规范的附录E中和Faces规范的前言中都可以看到更改内容的细节。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    JSP标签库

     

      1.1.6  JSP标签库

      JSP技术中,actions是一系列元素的集合,包括生成、访问程序语言对象,影响输出流。JSP规范中定义了6个标准actions,除了这些标准actions,JSP技术也支持可重用组件,称为自定义actions.在JSP页面中,actions通过自定义标签来触发。一个标签库是自定义标签的集合,是一种通过JavaBean生成基于XML的脚本的方法。从概念上讲,标签就是很简单而且可重用的代码结构。下面的JSP文件是引入了标签库后的代码:

      <% @ page language ="Java " %>

      <html>

      <head>

      <title>Hello World</title>

      </head>

      <body>

      <app: HelloWorld/>

      </body>

      </html>

      相对于没有采用标签库的JSP文件代码:

      <% @ page language ="Java " %>

      <html>

      <head>

      <title>Hello World</title>

      </head>

      <body>

      <%

      String message = request.getAttribute("message");

      if (message == null || message.equals (""))

      {

      message = "Hello World";

      }

      %><%=message%>

      </body>

      </html>

      可以看到一些改进。一个类似HTML标签封装了整个功能。实际上,越复杂的应用程序,采用JSP标签越能提高程序的可读性。每个标签都有一个相对应的包含代码的Java类。标签都是成对出现,一个开始标签紧接着就是一个结束标签。例如:

      <aTag> Something here </aTag>

      标签生命周期包含:当遇到开始标签时,称为doStartTag()方法和一个doEngTag()方法,以及一个为下一次请求做准备,重设所有状态的方法。

      自定义标签库封装了可重用的任务,因此它们在多个应用中被使用。精通Java语言的开发者生成JSP标签库,Web应用设计人员使用标签库,专注于表示层的显示,而不需要关注具体的细节。

      标签库的特征如下:

      能通过调用的页面传递的属性来定制。

      能访问JSP页面中所允许的所有对象。

      能修改调用页面的响应。

      能相互通信。

      能相互嵌套,支持复杂的JSP页面交互。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    JSP EL

     

      1.1.7  JSP EL

      JSP EL(Exression Language)表达式语言,是包含在JSTL(JavaServer Page Standard Library)1.0的一个简单的资料存取与运算的语言。自从JSP2.0后,则纳入了JSP正式标准,称为JSP所支持的特性之一。JSP Exression Language定义了变量存取、运算、函数等内容,配合JSTL其他标签或流程控制标签,就可以实现更好的逻辑视图分离之目的。例如:下面是一个JSP网页利用Exression Language来计算使用者所请求的两个数字相加结果:

      <html>

      <head><title>EL Test</title>

      </head>

      <body>

      简单的EL运算

      <H1>${param.a}+${param.b}=${param.a+param.b}</H1>

      </body>

      </html>

      如果使用表单或直接在网址上传入a与b的值,例如:http://localhost:8080/myjsp/elTest.jsp?a=10&b =14则会取得下面的结果:

      <html>

      <head><title>EL Test</title></head>

      <body>

      简单的EL运算:

      <H1> 10 + 14 = 24 </H2>

      </body>

      </html>

      在这个简单的例子中,可以看到Expression Language是使用 ${ 与 } 来包括所要存取的隐含对象、变量与其进行运算,param是Expression Language的隐含对象,表示使用者的请求参数,param.a表示取得使用者请求参数a的值。大致而言,Expression Language中的每一个隐含对象,其访问的数据与作用范围对应于JSP隐含对象。至于+则是Expression Language中定义的操作符,EL操作符同一般的程式语言一样,提供有算术运算、逻辑运算、关系运算等运算符。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Servlet容器介绍

     

      1.1.8  Servlet容器介绍

      Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。Servlet容器在Servlet的生命周期内包容和管理Servlet.

      根据Servlet容器工作模式的不同,可以将Servlet容器分为以下3类。

      (1)独立的Servlet容器

      当使用基于Java技术的Web服务器时,Servlet容器作为构成Web服务器的一部分而存在。然而大多数的Web服务器并非基于Java,因此,就有了下面两种容器的工作模式。

      (2)进程内的Servlet容器

      Servlet容器由Web服务器插件和Java容器两部分的实现组成。Web服务器插件在某个Web服务器内部地址空间中打开一个JVM(Java虚拟机),使得Java容器可以在此JVM中加载并运行Servlet.如有客户端调用Servlet的请求到来,插件取得对此请求的控制并将它传递(使用JNI技术)给Java容器,然后由Java容器将此请求交由Servlet进行处理。进程内的Servlet容器对于单进程、多线程的服务器非常适合,提供了较高的运行速度,但伸缩性有所不足。

      (3)进程外的Servlet容器

      Servlet容器运行于Web服务器之外的地址空间,它也是由Web服务器插件和Java容器两部分的实现组成的。Web服务器插件和Java容器(在外部JVM中运行)使用IPC机制(通常是TCP/IP)进行通信。当一个调用Servlet的请求到达时,插件取得对此请求的控制并将其传递(使用IPC机制)给Java容器。进程外Servlet容器对客户请求的响应速度不如进程内的Servlet容器,但进程外容器具有更好的伸缩性和稳定性。

      Tomcat作为一个免费的开源Web服务器,它是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和JSP规范总是能在Tomcat中得到及时地体现。因为Tomcat技术先进、性能稳定,并且免费,所以深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web服务器。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    选用合适的Web技术

     

      1.1.9 选用合适的Web技术

      JSP作为J2EE的一部分,既可以用于开发小型的Web站点,也可以用来开发大型的、企业级的应用程序。到底如何选用合适的Web技术来开发自己的站点,本节着重讲述对于不同规模的Web系统,使用JSP进行开发的不同方式。

      1.直接使用JSP

      对于最小型的Web站点来说,可以直接使用JSP来构建动态网页。这种站点最为简单,所需要的也是简单的留言板、动态日期等基本的功能。对于这种开发模式,一般可以将所有的动态处理部分都放置在JSP的Scriptlet中。

      这种结构的优点就是编程简单,成本很低。允许页面的设计者根据资源的状态、动态来生成页面的内容。但是当系统规模增大的时候,这样的结构不适合多个客户同时访问资源,因为同时会有大量的请求需要服务端来处理。每个请求都会建立一个链接,消耗一定的资源。这样,就需要让这些链接共享一些资源。其中最明显的例子就是用JDBC链接数据库中用到的链接池(Connection pools)。另外,该结构也会导致JSP中出现大量的JAVA代码。这虽然对Java程序设计人员来说不会有什么问题,可是大量的代码分散在JSP中,不利于维护和修改。

      2.JSP+JavaBeans(Model 1)

      中型站点面对的是数据库查询、用户管理和小量的商业业务逻辑。对于这种站点,不能将所有的东西全部交给JSP页面来处理。在单纯的JSP中加入JavaBeans技术,将有助于这种中型网站的开发。利用JavaBeans将很容易完成如数据库链接、用户登录与注销、商业业务逻辑封装的任务。例如:将常用的数据库链接写成一个JavaBeans,既方便了使用,又可以使JSP文件简单而清晰。通过封装,还可以防止一般开发人员直接获得访问数据库的权限。

      3.JSP+JavaBeans+Servlet

      无论用ASP还是PHP开发动态网站,长期以来都有一个比较重要的问题,就是网站的逻辑关系和网站的显示页面不容易分开。这使得代码的可读性和可维护性不高。另一方面,动态Web的开发人员也在抱怨,将网站美工设计的静态页面和动态程序合并过程是一个异常痛苦的过程。

      如何解决这个问题呢?JSP问世后,有些人认为Servlet已经完全可以被JSP代替。然而,事实是在Servlet不再担负动态页面生成的任务以后,开始担负起决定整个网站逻辑流程的任务。在逻辑关系异常复杂的网站中,借助于Servlet与JSP良好的交互关系和JavaBeans的协助,完全可以将网站的整个逻辑结构放在Servlet中,而将动态页面的输入放在JSP页面中来完成。在这种开发方式中,一个网站可以有一个或几个核心的Servlet来处理网站的逻辑,通过调用JSP页面来完成客户端的请求。读者在后面将可以看到,在J2EE模型中,Servlet的这项功能可以被EJB等取代。

      4.MVC开发模型

      在MVC开发模型中,整个系统可以分为三个主要的部分:

      (1)视图

      视图就是用户界面部分,在Web应用程序中也就是HTML、XML、JSP页面。这个部分主要处理用户能看到的东西,动态的JSP部分处理了用户可以看见的动态网页,而静态网页则由HTML、XML输出。

      (2)控制器

      控制器负责网站的整个逻辑。它用于管理用户与视图发生的交互。读者可以将控制器想象成处在视图和数据之间,对视图与模型交互进行管理的部分。通过使视图完全独立于控制器和模型,就可以轻松替换前端客户程序,也就是说,网页制作人员可以独立自由改变Web页面而不用担心影响这个基于Web应用程序的功能。

      在J2EE中,控制器的功能一般是由Servlet、JavaBeans、Enterprise JavaBeans中的SessionBeans来担当。

    图1-2 MVC体系结构

      MVC的优点表现在以下几个方面:

      可以为一个模型在运行时同时建立和使用多个视图。变化-传播机制可以确保所有相关的视图得到及时的模型数据变化,从而使所有关联的视图和控制器做到行为同步。

      视图与控制器的可接插性,允许更换视图和控制器对象,而且可以根据需求动态地打开或关闭、甚至在运行期间进行对象替换。

      模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。

      潜在的框架结构。可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。

      MVC的不足之处表现在以下几个方面:

      增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

      视图与控制器间的过于紧密的链接。视图与控制器是相互分离,但确实联系紧密的部件。视图没有控制器的存在,其应用是很有限的,反之亦然。这样就妨碍了它们的独立重用。

      视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Tomcat体系结构介绍

     

      1.2  Tomcat体系结构介绍

      Tomcat目前最新的版本是6.0,支持Servlet 2.5和JSP2.1规范。它由一系列嵌套的组件组成。

      顶层组件:位于整个配置文件的顶层。

      链接器:链接代表了介于客户与服务之间的通信接口,负责将客户的请求发送给服务器,并将服务器的响应结果传递给客户。

      容器组件:包含了其他组件的集合。

      嵌套组件:可以加入到容器中的组件,但不能包含其他组件。

      图1-3描述了Tomcat配置的结构。

    图1-3 Tomcat配置体系结构图

      当配置Tomcat时,可以移除一些不需要的对象,但并不会影响服务。一般来说,如果使用Web服务器集成的话,如Apache,则引擎和主机组件是不必要的。Tomcat的组件都是可以在server.xml文件中进行配置的,每个Tomcat组件在Server.xml文件中对应一种配置元素。在第三章中,将会详细讲述Servel.xml文件配置,现在主要对Tomcat的基本组件进行介绍。

      1.顶层组件

      顶层组件包含Server组件和Service组件。Server组件是Tomcat服务器的实例,可以在Java虚拟机(JVM)中生成唯一的服务器实例。它还可以在一个服务器中,为不同的端口设置单独的服务配置。这样,既方便单独地重启应用程序,又可以在某特定的JVM崩溃时,确保其他实例上的应用程序是安全的。Service组件用来访问请求,把请求转发给合适的Web应用程序,然后返回请求的处理结果;与它的链接器组成引擎组件。引擎也就是Servlet引擎,是请求处理的组件。引擎检查HTTP头,然后决定传送给哪个主机或者应用程序。每个Service都被命名,方便管理员能够通过日志记录每个Service的信息。

      2.链接器组件

      链接器链接Web应用程序和客户端,代表和客户端实际交互的组件。它负责接受来自客户端的请求,以及向客户返回响应结果。Tomcat的默认端口是8080,为了避免与其他的Web服务器标准端口(80)相冲突。比较常见的链接器是HTTP connector和Apache JServ Protocl(AJP)connector.

      3.容器组件

      容器组件负责接受来自顶层组件的请求,然后处理这些请求,并把处理结果返回给上层组件。容器组件包括引擎组件(Engine Component)、主机组件(Host Component)和上下文组件(Context Component)。引擎组件负责接受和处理来自它所属的Service中的所有Connector的请求。每个Service组件只能包含一个引擎组件。主机组件定义了一个虚拟主机,它允许在同一台物理机器上,配置多个Web应用;多个主机组件可以包含在引擎组件中。上下文组件是使用最为频繁的组件,每个上下文组件代表了允许在虚拟主机上的每个Web应用。一个虚拟主机能够运行多个Context,它们通过各自的Context Path进行相互区分。

      4.嵌套组件

      嵌套组件嵌套在容器内,为管理人员提供管理服务。包括全局资源组件(The Global Resources Component)、加载器组件(Loader Component)、日志组件(Logger Component)、管理器组件(Manager Component)、域组件(Realm Component)、资源组件(Resources Component)和阀组件(Valve Component)。

      全局资源组件只能嵌套在Server组件中,用于配置server中其他组件所用到的全局JNDI资源。加载器组件只能嵌套在上下文组件中,用于指定一个Web应用程序的类加载器,并将该应用程序的类和资源加载到内存中。一般来说,Tomcat中默认的类加载器就能满足大部分的需求,因此开发人员没有必要定制自己的类加载器。日志组件能借助Log4J来实现记录日志。

      管理器组件也只能在Context中有效。管理器组件是会话管理器,负责会话的创建和维护。域组件是一个包含用户名、密码和用户角色的数据库。角色与Unix的group类似。域的不同实现允许将Catalina集成到认证信息已经被创建和维护的环境中,然后利用这些信息来实现容器管理的安全性。在任何组件中(如引擎、主机或者上下文组件)都可以嵌套域组件。另外,引擎或者主机的域会自动被低层次的容器集成,除非被明确覆盖。资源组件只在上下文组件中支持,它代表的是Web应用程序中的静态资源,以及它们被允许存放的格式,例如压缩文件等。

      阀组件用于在请求在被到达目的之前,截取该请求,并处理它。有点类似于Servlet规范中定义的过滤器。它是Tomcat专有的、目前还不能用于其他的Servlet/JS容器。阀组件可以嵌入到其他组件中,如引擎、主机和上下文组件。阀组件通常用于记录请求、客户端IP地址,以及服务器端利用率信息,这种技术被称为请求转储(Request Dumping)。一个请求转储阀记录HTTP头的信息和Cookies信息。响应转储阀记录响应HTTP头和Cookies信息。阀是可重用的组件,能按照用户的需求增删。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Tomcat与应用服务器

     

      1.3  Tomcat与应用Web服务器

      1.3.1  Tomcat与应用服务器

      到目前为止,Tomcat一直被认为是Servlet/JSP API的执行器,也就所谓的Servlet容器。然而,Tomcat并不仅仅如此,它还提供了JNDI和JMX API的实现机制。尽管如此,Tomcat仍然还不能算是应用服务器,因为它不提供大多数J2EE API的支持。

      很有意思的是,目前许多的应用服务器通常把Tomcat作为它们Servlet和JSP API的容器。由于Tomcat允许开发者只需通过加入一行致谢,就可以把Tomcat嵌入到它们的应用中。遗憾的是,许多商业应用服务器并没有遵守此规则。

      对于开发者来说,如果是为了寻找利用Servlet、JSP、JNDI和JMX技术来生成Java Web应用的话,选择Tomcat是一个优秀的解决方案;但是为了寻找支持其他的J2EE API,那么寻找一个应用服务器或者把Tomcat作为应用服务器的辅助,将是一个不错的解决方案;第三种方式是找到独立的J2EE API实现,然后把它们跟Tomcat结合起来使用。虽然整合会带来相关的问题,但是这种方式是最为有效的。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Tomcat与Web服务器

     

      1.3.2 Tomcat与Web服务器

      Tomcat是提供一个支持Servlet和JSP运行的容器。Servlet和JSP能根据实时需要,产生动态网页内容。而对于Web服务器来说, Apache仅仅支持静态网页,对于支持动态网页就会显得无能为力;Tomcat则既能为动态网页服务,同时也能为静态网页提供支持。尽管它没有通常的Web服务器快、功能也不如Web服务器丰富,但是Tomcat逐渐为支持静态内容不断扩充。大多数的Web服务器都是用底层语言编写如C,利用了相应平台的特征,因此用纯Java编写的Tomcat执行速度不可能与它们相提并论。

      一般来说,大的站点都是将Tomcat与Apache的结合,Apache负责接受所有来自客户端的HTTP请求,然后将Servlets和JSP的请求转发给Tomcat来处理。Tomcat完成处理后,将响应传回给Apache,最后Apache将响应返回给客户端。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    Tomcat 6新特征

     

      1.3.3 Tomcat 6新特征

      Tomcat 6有着许多的新特征,例如支持Java 5的泛型(Generic)。相对于Tomcat 5来说,Tomcat 6支持最新的JSP 2.1规范(JSR 245)和Java Servlet 2.5规范(JSR 154)。除了支持JSP2.1外,Tomcat 6完全支持统一表达式语言(Unified EL)2.1.同时,Tomcat 6也是最先支持Java Server Faces 1.2规范的Web服务器。此外,Tomcat 6优化了内存使用,提升了IO能力,重构了集群。

     
     
     
     

    第 1 章:认识Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    小结

     

      1.4 小结

      本章简要地回顾了Java Web的历史、技术发展状况,介绍了动态Web页面的各种类型。对于不同规模的Web系统来说,有多个开发框架可供选择:直接使用JSP、JSP+JavaBeans+Servlet、MVC模型等开发方式。

      Tomcat 6作为Tomcat目前的最新版本,支持最新的Servlet 2.5和JSP 2.1规范。Tomcat由于仅仅只提供了Servlet/Jsp支持,因此它不能称为应用服务器;Tomcat既能提供静态网页支持,也能为动态网页服务,但是处理静态页面的效率没有其他的Web服务器快、功能完善。因此通常的解决方案是将Tomcat与其他J2EE应用服务器或其他的Web服务器结合起来使用。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月11日

     

    安装JDK

     

      第2章 安装Tomcat

      【本章导读】

      在本章中,读者将学会如何在不同操作系统上进行Tomcat的安装,以及Tomcat源码安装。同时,通过本章的学习,读者将能掌握Tomcat的安装目录结构,以及Web应用程序的目录结构。

      本章主要内容有:如何在Windows和Linux中安装Tomcat,如何安装JDK,Tomcat的安装目录结构,以及Tomcat安装过程出现的问题和解决的办法。

      2.1 安装JDK

      Tomcat跟其他基于Java的应用程序一样,都需要Java虚拟机(JVM)的支持。Sun公司发布了免费的、针对Windows、Linux和Solaris的不同JVM版本。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    在Windows上安装JDK

     

      2.1.1 在Windows上安装JDK

      从Sun公司的网站(http://java.sun.com/javase/downloads/index.jsp)上下载最新的版本Tomcat 6.Tomcat 6虽然需要运行在JSE5.0或更高版本之上,但是它仅需要Java运行环境就可,不再像以前的版本需要完全的Java开发包。目前JDK的最新版本为JDK 6,因此下载最新的JDK 6 Update3就可以了。JDK 6 Update 3包含了Java运行环境和命令行开发工具。如图2-1所示。

    图2-1  SunJDK下载页面

      【例2-1】在Windows上安装JDK

      在Windows上Java安装包是一个标准的Windows安装包,操作简单方便。双击jdk-6u3-windows-i586-p.exe,出现对话框,如图2-2所示。

      选择【接受(A)】按钮,就会出现自定义安装对话框,如图2-3所示。

    图2-2 JDK安装许可证界面           图2-3 JDK自定义安装界面

      选择Java安装的目录,本书将Java安装目录改为:C:JDK1.6.修改完后,单击【下一步】按钮,出现安装进度条,进入安装过程,安装完后会提示JDK安装完毕。然后出现JRE自定义安装对话框,如图2-4所示。

      同样更改安装目录为c:JRE1.6,当然用户可以根据自己的需要更改安装目录。单击【下一步】按钮,出现安装进度条,进入安装过程,安装完后会提示JRE安装完毕。如图2-5所示。

    图2-4  JRE自定义安装           图2-5  JRE安装完成

      此时Java安装完毕,下一步设置环境变量。选择Windows开始菜单栏上"开始→设置→控制面板",然后选择"系统"选项。如图2-6所示。

      选择"高级"标签,单击【环境变量】按钮。这时出现如图2-7所示。

    图2-6  系统属性             图2-7  环境变量

      单击系统变量【新建】按钮,输入JAVA_HOME作为变量名,然后输入Java刚刚安装的目录路径。如图2-8所示。

      然后修改%PATH%变量,增加%JAVA_HOME%in路径。增加该路径,是为了使得Java能够在命令行中可以执行。如图2-9所示。

    图2-8  添加JAVA_HOME新的环境变量       图2-9  修改PATH环境变量

      验证变量是否修改成功,可以打开命令行,输入:

      > java –version

      应该可以看到结果,如图2-10所示。

    图2-10 Java版本显示结果

      至此,在Windows上Java安装完成。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    在Linux上安装JDK

     

      2.1.2  在Linux上安装JDK

      从Sun网站下载合适的Linux版本,如图2-11所示。

    图2-11 Sun下载Linux版本页面

      Sun提供Linux平台上JDK的两个版本Linux RPM in self-extracting file和Linux self-extracting file.这两个版本的区别在于:前者把RPM安装包封装在压缩包的二进制格式,适合低级用户安装;后者则适合高级用户,相当于一个"绿色"的zip版本JDK,没有安装程序,安装完后可能需要做一些链接。

      【例2-2】在Linux上安装JDK

      使用self-extracting binary安装Java,首先必须设置它的执行权限,在命令行中输入如下命令:

      # chmod +x jdk-6u3-linux-i586.bin

      【提示】

      用self-extracting binary在Linux上安装Java时,不必设置成Root权限,因为该二进制包不会覆盖任何系统文件。

      然后改变目录到需要安装的目录下(本书安装目录是/usr/java/jdk1.6),执行二进制文件,输入如下命令:

      # ./ jdk-6u3-linux-i586.bin

      之后会出现licence对话框,单击【agree】按钮,开始Java安装。跟Windows安装一样,必须设置$JAVA_HOME环境变量,指明JDK的安装目录。一种是修改用户所对应的~/.bashrc文件,在该文件中增加:

      JAVA_HOME=/usr/java/jdk1.6/

      export CLASSPATH=.

      export PATH = $JAVA_HOME/bin:$PATH

      另外一种是设置Linux的全局环境变量(这个需要Root权限),在/etc/profile文件增加如下几行:

      JAVA_HOME=/usr/java/jdk1.6/

      export JAVA_HOME

      PATH=$JAVA_HOME/bin:$PATH

      CLASSPATH=.:$JAVA_HOME/lin/tools.jar:$JAVA_HOME/lib/dt.jar

      export PATH JAVA_HOME CLASSPATH

      然后保存文件,注销当前用户。重新登录后,在控制台下输入java –version,如果出现版本信息,表明安装成功。

      使用RPM包安装Java.首先必须确定是Root用户,然后在命令行中输入如下命令:

      # chmod a+x jdk-6u3-linux-i586-rpm.bin

      # ./ jdk-6u3-linux-i586-rpm.bin

      # rpm –iv jdk-6u3-linux-i586-rpm.bin

      之后,按照之前所述的修改系统环境变量,测试安装是否成功。

      2.2 安装Tomcat

      前面讲述了JDK的安装,现在可以开始Tomcat的安装了。本节先讲述Windows下的Tomcat安装,然后是Linux下的Tomcat安装。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    在Windows上安装Tomcat

     

      2.2.1 在Windows上安装Tomcat

      从Apache网站上(http://Tomcat.apache.org/download-60.cgi)下载最新的Tomcat版本,目前Apache发布的最新Tomcat版本是6.014.如图2-12所示。

    图2-12  Apache网站Tomcat下载页面

      在"Binary Distribution"栏的Core子栏下提供了三种Tomcat 6的方式:zip、tar.gz、Windows Service Installer.zip方式下载后得到的是一个zip文件,无须安装,解压缩后即可使用。tar.gz方式下载后得到一个tar.gz文件,是在GNU操作系统(一种类似于Unix的操作系统,其源码是可以被复制、修改和重新发布的)中用tar命令打包而成的,因此必须在与GNU相兼容的操作系统中解包,Solaris和Mac OS X操作系统中不能使用。"Windows Service Installer"方式下载后得到的是一个exe文件(如图2-12所示的版本为apache-Tomcat-6.0.14.exe)。Tomcat 6是在Windows操作系统下的安装程序,这种方式安装的Tomcat 6可以通过Windows的服务来控制启动、停止。

      【例2-3】在Windows上安装Tomcat

      双击下载apache-Tomcat-6.0.14.exe文件,出现安装Licence Agreement对话框,如图2-13所示。

    图2-13  Tomcat安装页面License对话框

      单击【I Agree】按钮,进入到Choose Component对话框,如图2-14所示。

    图2-14  Tomcat自定义安装对话框

      一般默认Normal即可,单击【Next】按钮进入到选择安装路径选项,如图2-15所示。

      修改安装的目录,本书Tomcat的安装目录为C:Tomcat 6.单击选择【Next】按钮,进入到配置对话框,如图2-16所示。

    图2-15  Tomcat安装目录修改     图2-16  Tomcat安装配置对话框

      可以修改Connector端口和管理员用户名、密码。本书使用的默认值为8080端口,管理员用户名是admin,密码为空。单击【Next】按钮,进入JVM路径选择对话框,如图2-17所示。

    图2-17  Tomcat安装选择JRE安装目录

      选择JDK安装的路径后,单击【Install】按钮,开始Tomcat安装,完成后会提示安装完成。

      接下来设置环境变量。同JDK设置环境变量一样,在系统变量中增加一项为%CATALINA_HOME%,它表明Tomcat在本机上安装的路径。修改后如图2-18所示。

    图2-18  Tomcat环境变量设置

      为了测试Tomcat安装是否成功,必须运行Tomcat服务器,选择"开始→Apache Tomcat 6.0→Monitor Tomcat",出现Tomat控制台,如图2-19所示。

    图2-19  Tomcat控制台对话框

      单击【Start】按钮,开始Tomcat服务。成功启动后,控制台服务状态会变成Started,如图2-20所示。

    图2-20  Tomcat启动成功后对话框

      Tomcat启动后,打开浏览器,输入http://localhost:8080,如果能够看到Tomcat的默认页面(如图2-21所示),则表明安装成功。

    2-21 Tomcat默认页面

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    在Linux或Mac OS上安装Tomcat

     

      2.2.2 在Linux或Mac OS上安装Tomcat

      在Linux或者Mac系统上安装Tomcat也是非常简便的。基本流程为:

      从Apache网站上(http://Tomcat.apache.org/download-60.cgi)下载Tomcat的zip格式或者gzip tar格式文件。

      解压文件到硬盘,例如/usr/java/Tomcat 6.

      输出$CATALINA_HOME变量,使用下列Shell命令

      # CATALINA_HOME=/usr/java/Tomcat 6

      # export CATALINA_HOME

      类似与JDK的安装,可以把这些命令加到~/.bashrc或者/etc/profiles文件里面。

      最后使用上面Shell命令启动Tomcat.

      打开浏览器,输入http://localhost:8080/,查看Tomcat是否安装成功。也可以选择Tomcat中左边菜单栏的JSP例子,运行其中一个,确保Tomcat运行没有任何错误信息。

      至此,Tomcat在Linux或者MAC系统上安装完毕。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    Tomcat端口配置

     

      2.2.3  Tomcat端口配置

      Tomcat一般用8080端口作为默认端口。如果用户需要修改Tomcat的端口配置,打开%CATALINA_HOME%conf目录下的server.xml文件,找到下面文本:

      <!-- A "Connector" represents an endpoint by which requests are received

      and responses are returned. Documentation at :

      Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)

      Java AJP  Connector: /docs/config/ajp.html

      APR (HTTP/AJP) Connector: /docs/apr.html

      Define a non-SSL HTTP/1.1 Connector on port 8080

      -->

      <Connector port="8080" protocol="HTTP/1.1"

      connectionTimeout="20000"

      redirectPort="8443" />

      可以看到端口一项写的是8080,修改这个设置为用户定制的端口。比如将端口修改为port="80",那么重新启动Tomcat后,打开浏览器,只需输入http://localhost就可看到Tomcat的默认页面,不再像以前后面还需加上冒号和端口号。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    安装Ant

     

      2.2.4  安装Ant

      Ant工具是Apache的一个开源项目,它是一个优秀的软件工程管理工具。Ant类似于Make工具,但克服了传统的Make工具的缺点。传统的Make往往只能在某一平台上使用,Ant本身用Java语言实现,并且使用XML格式的配置文件来构建成,可以很方便地实现多平台编译,非常适合管理大型工程。

      从Ant官方网站(http://ant.apache.org/bindownload.cgi)下载最新的二进制版本。目前最新的版本为1.7.0,如图2-22所示。

    图2-22  Ant下载页面

      【例2-4】安装Ant

      将下载的apache-ant-1.7.0-bin.zip文件解压,设置如下环境变量:

      ANT_HOME ant的安装目录(本书默认安装目录为C:ant1.7)如图2-23所示。

    图2-23  Ant安装目录变量设置

      PATH把%ANT_HOME%/bin目录添加到PATH变量中,便于命令行能直接运行Ant.如图2-24所示。

    图2-24  Path变量设置

      测试Ant是否安装成功,打开命令行,输入ant –version,如果能看到Ant信息,如图2-25所示,则表明Ant安装成功。

    图2-25 Ant版本信息

      至此,Ant安装完毕。下一节讲述如何使用Ant来安装Tomcat。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    安装Tomcat源码

     

      2.2.5 安装Tomcat源码

      从Apache网站上(http://Tomcat.apache.org/download-60.cgi)下载最新的Tomcat源码版本,目前最新的版本为apache-Tomcat-6.0.14-src.然后执行下面操作:

      进入到Tomcat解压目录(本书默认为c: apache-Tomcat-6.0.14-src)。

      确定JDK和ANT已经安装。

      在源码目录下新建一个build.properties文件,输入以下代码:

      # ----- Proxy setup -----

      # Uncomment if using a proxy server

      #proxy.host=proxy.domain

      #proxy.port=8080

      #proxy.use=on

      # ----- Default Base Path for Dependent Packages -----

      # Replace this path with the directory path where dependencies binaries

      # should be downloaded

      base.path=/usr/share/java

      在命令行输入命令Ant.

      构建的过程大概会持续几分钟,最后构建好的项目存放在${Tomcat.source}outputuild目录下。当然也可以在用户指定的目录下新建目录,将编译好的Tomcat二进制代码移植过来,环境变量的设置同上。

      如果用户想更新源码,并重新编译,需输入以下命令:

      > ant checkout

      > ant build

      至此,Tomcat源码安装完毕。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    Tomcat安装目录

     

      2.3 Tomcat安装目录

      前面介绍了Tomcat在不同平台上的安装流程,包括使用二进制版本和源码版本。现在介绍一下Tomcat的安装目录。在本节中,可以了解到Tomcat的主要配置文件,以及目录结构。Tomcat安装目录结构如图2-26所示。

    图2-26  Tomcat安装目录结构

      1.Bin目录

      Bin目录存放着Windows平台,以及Linux平台上启动和关闭Tomcat的脚本文件。Tomcat的早期版本,有多个不同的启动和关闭脚本。Tomcat 6将这些统一到下列执行脚本中:

      Tomcat 6 Windows可执行文件

      如果Tomcat安装作为NT服务的话,可以使用Tomcat 6.exe可执行文件启动服务器。

      Tomcat 6w Windows可执行文件

      如果Tomcat安装作为服务的话,可以使用Tomcat 6w.exe可执行文件来启动服务器。它将调用Tomcat的控制台,可以手动启动或关闭Tomcat服务。在上节Tomcat安装中有详细介绍。

      2.Conf目录

      Conf目录存放在Tomcat服务器的各种配置文件,其中包括:

      Catalina.policy:为Catalina运行在安全管理的上下文中,设置必要的权限。

      Catalina.properties:设置不同类加载器目录的位置。默认的是Common目录和它的子目录。设置的目的是为了区分哪些类可以被Tomcat使用,哪些类可以被Web应用使用。

      Context.xml:设置默认的Web应用上下文。

      Logging.properties:管理默认的日志等级。

      Server.xml:是Tomcat的最为主要的配置文件。可以配置任何元素,包括日志、过滤器、端口、主机等,详细的讨论在第三章。

      Tomcat-user.xml:默认的用户数据库,用于容器认证管理。

      Web.xml:默认的Web应用程序部署描述符。

      3.Logs目录

      ogs目录是Tomcat的日志文件默认的存放位置。

      4.Lib目录

      ib目录存放Tomcat服务器所需的各种JAR文件。

      5.Temp目录

      Temp目录存放Tomcat使用的临时文件。

      6.Webapps目录

      Webapps目录是当发布Web应用时,在默认情况下把Web应用文件放于此目录下。

      7.Work目录

      Work目录是Tomcat把由JSP生成的Servlet的文件存放的位置。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    Web应用目录结构介绍

     

      2.4  Web应用目录结构介绍

      Web应用程序是一些Web资源的集合,包括JSP页面、HTML页面、Servlets和配置文件。它们按照Servlet规范中所描述的那样,分层次地组织起来(表2-1)。它们可以通过两种途径构建Web应用程序:一是打包,另外一个是不打包。打包的被称为Web档案(War)文件,未打包的是存放文件系统的目录结构。

      未打包的格式对于Web应用开发人员来说非常便利,可以允许他们在开发和调试期中,随时、方便地更新单独的文件。然后在部署环境中,提供一个单独的文件自动部署,可能更为便利。这是因为减少了部署过程中放置文件和设置系统变量的步骤。

      表2-1  Web应用程序描述

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    Web应用上下文

     

      2.4.1  Web应用上下文

      从上一章Tomcat的体系结构介绍可以知道,上下文组件表示的每个Web的应用。因此每个Web应用对应于一个上下文组件,它可以为每个Web应用分配一个上下文路径。默认的上下文组件是Root,可以通过输入http://localhost:8080地址,访问到默认的应用程序。用户通过向服务器请求一个Web应用的上下文,可以访问到该Web应用程序。例如,用户可以输入URL:http://localhost:8080/manager来访问Tomcat的Web管理应用程序。

      如果把Web应用程序放置在Webapps目录下,那么访问该Web应用的URL为:http://localhost:8080/xxx(xxx为Web应用目录名称)。例如Tomcat的Webapps中默认自带了jsp例子,它放置在Webapps的目录名称为example,这样通过输入http://localhost:8080/examples/jsp/来访问该应用程序,如图2-27所示。

    图2-27 JSP例子

      如果在ROOT目录下放置的子目录与Web应用程序的目录名一致,则会出现混淆,例如:

      webapps/

      ROOT/

      shop/

      index.html

      shop/

      index.html

      从上面的目录结构中可以看出,在ROOT目录里面放置了跟Shop同名的目录和文件,通过http://localhost:8080/shop可能映射到ROOT目录和Webapps下Shop目录里的文件,这样就造成了混淆。当然Tomcat的处理机制是它会忽视ROOT目录里与Web应用重名的文件,直接显示来自Shop应用程序里面的文件。如果开发人员的出发点是想用户访问Root目录里的Web应用程序,那么就必须特别注意了。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    WEB-INF目录

     

      2.4.2  WEB-INF目录

      Servlet规范里面陈述了Web应用中公用和私用区域的划分。存放私用资源的目录称为WEB-INF,它处于Web应用的根目录下。在WEB-INF目录中可以存放所有的Web应用的配置文件、应用类文件等。用户要访问的话,只能通过间接的方式访问。例如通过Servlet映射。

      WEB-INF包含许多特别的子目录,例如标签文件和标签库描述符(TLDs)。下面是一个Web应用的例子:

      WebAppX/

      WEB-INF/

      classes/

      lib/

      tags/

      WEB-INF详细配置见第4章。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    META-INF目录

     

      2.4.3 META-INF目录

      META-INF放置在Web应用程序的根目录下,作为WAR文件部署。在META-INF目录下存放TLDs和标签文件,通过URI来访问。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    常见问题与解决办法

     

      2.5 常见问题与解决办法

      1.Tomcat窗口消失

      有时,启动Tomcat后,Tomcat窗口显示了一下,然后就会立刻消失。这个问题主要是由于某些错误造成了Tomcat的崩溃。错误信息本身是可以显示的,但是由于窗口消失得太快,以至于错误信息不能被用户看到。可按以下方式解决。

      在Linux输入:

      # $CATALINA_HOME/bin/catalina.sh run

      或者在Windows里面输入:

      > %CATALINA_HOME/bin/catalina run

      输入上述命令后,将使得Tomcat正常启动,任何错误信息都将被显示。错误信息也可以通过stdout.log文件看到。

      2.端口被占用

      可能会出现选定的端口被占用的情况,类似于下面的错误信息:

      LifecycleException: Protocol handler initialization failed:

      Java.net.BindException: Address already in use: JVM_Bind:8080

      Tomcat默认使用8080端口,在Windows或Linux中,可以通过输入netstat命令来查看谁使用了那个端口,可以看到谁跟Tomcat引起了冲突。解决该问题的方式有两种:一是关闭占用Tomcat端口的进程,一个是改变Tomcat的默认端口配置。

      3.类版本错误

      Tomcat 6需要Java SE 5或后期更为高级的版本,如果使用了早期Tomcat版本,在Tomcat启动时,将会出现下列错误:

      Exception in thread "main"

      java.lang.UnsupportedClassVersionError:

      org/apache/catalina/startup/Bootstrap (Unsupported major.minor version 49.0)

      解决方法:检查JAVA_HOME环境变量设置是否指向了Java SE 5的安装目录。

     
     
     
     

    第 2 章:安装Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    小结

     

      2.6 小结

      本章讲述了Java、Tomcat和Ant在不同平台上、不同形式的安装,包括Binary和源码。同时,本章还重点讲述了Tomcat安装目录结构,以及Web应用目录结构。读者通过本章学习,需要掌握以下几点:

      在大多数情况下,Tomcat的安装是非常简单、直接的过程,主要是因为Tomcat的二进制安装文件可以在通用的平台下运行。

      Tomcat的安装目录结构主要包括7个重要的目录。

      安装过程中可能出现的问题,例如端口占用、类版本错误等等,读者需要通过实际安装,来逐步掌握处理这些问题的方法。

     
     
     
     

    第 3 章:配置Tomcat作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月12日

     

    Tomcat 6配置元素

     

      第3章 配置Tomcat

      【本章导读】

      在本章中,通过查看CATALINA_HOME/conf目录下的文件,主要介绍Tomcat的基本配置。在启动时,Tomcat默认安装使用这些文件配置服务器,它们对于用户了解默认的配置将做些什么和用户能够修改什么有至关重要的作用。

      本章还介绍了主要的配置文件--server.xml和Tomcat的其他配置文件。在第一章中,曾经看到Tomcat使用基于组件、层次似的结构。该模型在很大程度上简化了复杂的服务器配置。最后还讲述了Tomcat的认证配置和Web应用配置,用户可以根据自己的需要加以修改。

      3.1  Tomcat 6配置元素

      Tomcat 6服务器启动后,读取一系列的XML配置文件。为了配置Tomcat 6,用户必须修改这些XML文件。Tomcat的配置文件位于CATALINA_HOME/conf目录下,它包含以下配置文件:

    表3-1 Tomcat基本配置元素

      Tomcat 6在指定的配置目录中搜寻这些配置文件。配置目录由环境变量指定。Tomcat 6首先检查$CATALINA_BASE(%CATALINA_BASE%在Windows)环境变量,如果这个环境变量已经定义了,则Tomcat 6搜寻该环境变量指定目录下的conf子目录。对于在同一台机器上配置多个并发的Tomcat也非常直接和方便,分别为每个Tomcat实例设置不同的$CATALINA_BASE目录即可,也可以使用不同的shell脚本和batch文件来设置$CATALINA_BASE变量和启动各自实例。

      如果$CATALINA_BASE没有被指定,则Tomcat使用$CATALINA_HOME(%CATALINA_HOME%在Windows)环境变量来代替。$CATALINA_HOME环境变量指定了Tomcat 6的安装目录。Tomcat 6会在$CATALINA_HOME指定的conf子目录中搜寻配置文件。在后续的章节中,会重点讲述配置文件的基本配置。

      第16章 集成Tomcat与Eclipse

      【本章导读】

      Eclipse是一个开放源代码的项目,是非常优秀的开发Java程序的集成开发环境(IDE)。Eclipse可以通过开发新的插件来扩展现有的插件功能,而且有着统一的外观、操作和系统资源管理界面。比如:在现有Eclipse的Java开发环境中加入Tomcat服务器插件。Tomcat提供了JSP/Servlet容器,是目前应用最为广泛的服务器之一。把Tomcat与Eclipse集成,可以很方便地在Eclipse的IDE环境中进行Tomcat Web应用项目的开发和调试。为快捷方便地开发Tomcat Web应用项目提供了具有实用意义的模式。

      本章主要内容包括Eclipse的简介、Eclipse的安装和配置、Tomcat与Eclipse的集成、Tomcat与Eclipse集成开发应用。

      16.1  Eclipse简介

      Eclipse是一个开放源代码的项目。Eclipse 是替代IBM Visual Age for Java(简称IVJ)的下一代IDE开发环境,但它未来的目标不仅仅是成为专门开发Java程序的IDE环境。根据Eclipse的体系结构,通过开发插件,它能扩展到任何语言的开发,甚至能成为图片绘制的工具。下面对Eclipse的各种特性作简单介绍:

      Eclipse开发环境

      Eclipse开发环境被称为Workbench,它主要由三个部分组成:视图(Perspective),编辑窗口(Editor)和观察窗口(View)。编辑窗口包含所有文件的显示和编辑,用指定的编辑器可以打开和编辑相应的文件。观察窗口主要是配合编辑窗口,并提供多种相关信息和浏览方式。一个视图包括一个或多个编辑窗口和观察窗口。视图是Eclipse中最灵活的部分,可以自定义每个视图中所包含的观察窗口种类,也可以自定义一个新视图。

      Eclipse版本管理

      Eclipse的版本管理分为个人(或称为本地)版本管理和团队版本管理两种。Eclipse提供了强大的个人版本管理机制,每一次被保存的更改都可以得到恢复,而且可以精确到每一个方法的版本恢复。强大的个人版本管理功能为程序员提供了更多的信心--只管编写下去,任何不小心的错误都可以恢复。Eclipse默认为版本管理工具CVS提供了接口,可以非常方便的连接到CVS服务器上。通过CVS版本管理,Eclipse为团队开发提供了良好的环境。

      Eclipse插件扩展

      使用插件可以丰富Eclipse的功能。可以通过开发新的插件扩展现有插件的功能,而且有着统一的外观、操作和系统资源管理界面,这也正是Eclipse的潜力所在。比如在现有的Java开发环境中加入Tomcat服务器插件。插件扩展使得Eclipse非常易于拓展,更重要的是Eclipse平台提供了一个非常好的方式,使得各个插件能协同工作,以至新的特性可以简单而无缝的融入平台。

      Eclipse体系结构

      Eclipse的体系结构,除了小巧的Eclipse平台核心运行时之外,Eclipse平台仅由工作台(WorkBench)、工作空间(Workspace)、帮助(Help)和小组组件(Team Compenent)四部分构成,其他的工具以插件的形式集成进框架以创建应用程序。

      Eclipse 多国语言包

      Eclipse的多国语言包中不仅有Eclipse的中文翻译,同时也包含了其他几种主要语言的翻译。Eclipse能够自动根据Windows操作系统的语言环境来选择使用语言包中的哪一种语言,极具智能化的特点。

      Eclipse语言和平台中立

      尽管Eclipse是以Java 语言编写的,并且通常是作为Java IDE来使用的,但它却是语言中立的。Java开发是由一个插件组件来支持的,如上所述,可以添加其他的插件来支持其他语言开发,例如:C/C++,Cobol和C#.Eclipse并不只是一个Java IDE,同时它是一个可拓展的、开放的开发工具平台。例如,它可以作为其他语言的IDE。

     
     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    Eclipse的安装和配置

     

      16.2  Eclipse的安装和配置

      Eclipse的安装和配置都很简单,安装前需要先下载Eclipse开发包。可以从Eclipse的官方网站(http://www. eclipse.org)免费下载。目前Eclipse的最新版本是Eclipse-SDK-3.3.0,Eclipse版本不断更新,请密切关注Eclipse的官方网站。一般Eclipse提供以下几个下载版本:Release,Stable Build,Integration Build和Nightly Build,建议下载Release或Stable版本。此文所用的是Release版本的Eclipse 3.3.0。

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    安装Eclipse

     

      16.2.1  安装Eclipse

      Eclipse本身是用Java语言编写的,所以Eclipse需要运用在Java环境下。如果机器上还没有安装Java运行环境(JRE),则需要先安装JRE.最新的JDK可以从Sun官方网站(http://www. sun.org)免费下载。同时Eclipse3.0以上的版本,需要JDK 1.4以上版本。

      【例16-1】安装Eclipse

      Eclipse的安装非常简单,只需要将下载的软件压缩包直接解压即可。假如解压到C盘的根目录下,进入C盘,就可以看到解压后的Eclipse目录。打开Eclipse目录,可以看到如图16-1所示的Eclipse文件或目录。

    图16-1 Eclipse解压后的目录界面

      其中:

      /configuration:Eclipse配置文件的目录

      /features:存在功能部件的目录

      /plugins:存在插件的目录

      /readme:Eclipse描述文件的目录

      eclipse.exe:Eclipse启动程序

      ……

      【提示】

      如果在机器里有Eclipse的老版本,应先删除老版本,不可用新版本解压到老版本的目录下直接覆盖老版本。

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    启动Eclipse程序

     

      16.2.2  启动Eclipse程序

      Eclipse安装完成后,进入Eclipse目录,双击"Eclipse.exe",运行程序。启动后进入选择工作空间界面,如图16-2所示。

    图16-2 Eclipse选择工作空间界面

      可以使用默认的工作空间目录,单击【OK】按钮,就可以看到Eclipse的欢迎界面,如图16-3所示。

    图16-3  Eclipse欢迎界面

      关闭Eclipse的欢迎界面,则看到了Eclipse的默认界面IDE(Java EE透视图),如图16-4所示。

    图16-4  Eclipse默认界面IDE(Java EE透视图)

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    Eclipse多国语言包

     

      16.2.3  Eclipse多国语言包

      之前安装的Eclipse程序,IDE界面都是英文界面。如果想要显示熟悉的中文界面,则可以安装Eclipse多国语言包来实现。Eclipse支持多国语言,可以让界面变成不同语言的界面。Eclipse多国语言包同样可以从Eclipse的官方网站(http://www. eclipse.org)免费下载,一般下载与当前安装的Eclipse版本相对应的多国语言包。

      【例16-2】安装Eclipse多国语言包

      Eclipse多国语言包的安装与Eclipse的安装一样简单,可以按照以下步骤完成安装:

      如果Eclipse正在运行使用,需要先关闭Eclipse应用。

      把Eclipse多国语言包解压到本地某一个硬盘,假如D盘。解压后,可以看到2个文件夹features和plugins,如图16-5所示。

    图16-5  Eclipse多国语言包解压后目录界面

      分别把features和plugins文件夹下的所有文件拷贝覆盖到Eclipse安装目录对应的features和plugins文件夹下。

      重新运行Eclipse.exe程序,则可以看到Eclipse的默认界面变成了中文界面,如图16-6所示。

    图16-6 Eclipse中文默认界面

      【提示】

      如果重新运行Eclipse.exe程序后,Eclipse的默认界面没有变成中文界。原因可能是Eclipse多国语言包版本过低或版本不一致所造成。需要检查Eclipse多国语言包是否是对应的Eclipse版本,可以下载更高版本的多国语言包,最好是对应版本的多国语言包。

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    Eclipse和Tomcat的集成

     

      16.3  Eclipse和Tomcat的集成

      通常可以通过Tomcat安装目录下bin文件夹里的startup.bat来启动Tomcat服务器及其控制台的,但在实际项目开发的时候通常显得有些麻烦。而在Eclipse中安装Tomcat插件,可以从Eclipse中直接启动Tomcat服务器及其控制台,免去了启动和查看错误时来回切换的麻烦。Eclipse是一个非常优秀的Java开发环境,把Tomcat与Eclipse集成,可以方便快捷地在EclipseIDE环境中进行Tomcat Web应用项目的开发和调试。

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    Tomcat插件安装和初始化配置

     

      16.3.1  Tomcat插件安装和初始化配置

      Eclipse的Tomcat插件可以从Sysdeo网站(http://www.sysdeo.com/eclipse/)或是(http://www.eclipsetotale.com/tomcatPlugin.html)免费下载。目前最新版本为3.2.0.

      【例16-3】在Eclipse中安装和初始化Tomcat插件

      Tomcat插件安装

      下载了Eclipse的Tomcat插件后,把Tomcat插件解压到本地硬盘,假如D盘。解压后可以在D盘目录下看到com.sysdeo.eclipse.tomcat_3.2.0文件夹,把整个com.sysdeo.eclipse.tomcat_3.2.0文件夹拷贝到Eclipse主目录下的plugins文件夹里面即可。

      Tomcat插件初始化配置

      Eclipse的Tomcat插件安装成功后,并不是就马上可以在Eclipse中使用Tomcat插件。为了能够在Eclipse中使用Tomcat插件,还需要在Eclipse中对Tomcat插件进行一定的初始化配置。Tomcat插件的初始化配置,可以按照以下的步骤完成:

      重新启动Eclipse。

      单击菜单栏的"Window",在下拉菜单中选择"Preferences".如图16-7所示。

      在弹出的"Preferences"窗口中,选择左边目录树里的"Tomcat"项目。正确选择机器中所安装的Tomcat版本,指定Tomcat home的安装目录,指定Tomcat的server.xml配置文件和配置文件的目录。其配置之后的界面如图16-8所示。

      展开"Tomcat",选择下面的"JVM Setting",选择JRE为机器所安装的JDK,即"jre 1.6.0",确认无误后按【OK】关闭窗口即可。如图16-9所示。

    图16-7 Eclipse "Window/ Preferences"菜单界面

    图16-8 Eclipse"Preferences"窗口下"Tomcat"项目配置后界面

    图16-9 Eclipse "Preferences"窗口下"JVM Setting"界面

      单击菜单栏的"Window",在下拉菜单中选择"Customize Perspective…".如图16-10所示。

    图16-10 Eclipse"Window Customize Perspective…"菜单界面

      在弹出的"Customize Perspective"窗口中,选择左边的"Commands"标签。在左边的"Available commands groups"组中,下拉选框可以看到Tomcat选项,在Tomcat选项中打上钩选中,按【OK】关闭窗口。如图16-11所示。

    图16-11 Eclipse 选择Tomcat选项界面

      这时在IDE的工具栏中就看到Tomcat小猫图标,同时在菜单栏中也可以看到添加了"Tomcat"菜单。工具栏与"Tomcat"菜单中包含了"Start Tomcat","Stop Tomcat"和"Restart Tomcat".如图16-12所示。

      到此,Tomcat插件初始化配置的工作都完成了。可以从工具栏或是"Tomcat"菜单中启动Tomcat,在控制台Console显示区就可以看到Tomcat启动信息(如图16-13所示)。为了测试配置是否成功,可以打开浏览器,在地址栏键入"http://localhost:8080".如果可以看到Tomcat的欢迎页面则说明配置成功。

    图16-12 Eclipse中添加了Tomcat菜单的界面

    图16-13 Eclipse中Tomcat启动信息界面

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    Eclipse和Tomcat集成开发实例

     

      16.3.2  Eclipse和Tomcat集成开发实例

      Eclipse和Tomcat集成配置成功后,就可以方便快捷的在Eclipse IDE环境里开发、调试Tomcat项目。下面以一个简单的例子来描述在Eclipse和Tomcat集成环境下开发调试Web应用的一般方法。开发一个Tomcat项目,一般需要先创建一个Tomcat工程,然后在已经创建的Tomcat工程里进行开发应用,最后就是调试发布。

      【例16-4】Eclipse和Tomcat集成开发实例

      新建一个Tomcat工程

      新建一个Tomcat工程,可以按照下面的步骤来完成:

      单击菜单栏的"File/New",在右边菜单中选择"Project…".如图16-14所示。

    图16-14 "File/New/Project…"菜单界面

      在"New Project/Select a wizard"窗口中,选择"Java/Tomcat Project"创建Tomcat工程,然后按【Next】进行下一步骤。如图16-15所示。

    图16-15 选择创建Tomcat工程界面

      在"New Tomcat Project/Java Project Settings"窗口中,需要填写Tomcat工程的名称。为了便于理解,应该填写一个能够体现项目内容的Tomcat工程名称。这里假如为"TomcatProject".还有需要选择工作目录,可以使用默认的工作目录,也可以另外选择工作目录,然后按【Next】进行下一步骤。如图16-16所示。

      在"New Tomcat Project/ Tomcat Project Settings"窗口中,需要设置Tomcat Context的名称,一般采用默认的Context Name.同时需要选择是否自动更新server.xml.为简单起见,一般都选择自动更新server.xml文件,这样当服务配置改变的时候,server.xml文件也会跟着改变。在"是否自动更新server.xml"方框里打勾选中,然后按【Finish】完成。如图16-17所示。

      到此,一个Tomcat工程就创建完成了。在左边的"Packa"观察窗口里,可以看到已经创建好的Tomcat工程。其工程结构如图16-18所示。

    图16-16 填写Tomcat工程名称和选择工作目录界面

    图16-17 Tomcat 设置Tomcat工程界面

    图16-18 Tomcat工程结构界面

      创建一个JSP文件

      单击菜单栏的"File/New",在右边菜单中选择"Other".在弹出的"New/Select a wizard"窗口,选择"Web/Jsp",然后按【Next】按钮。在弹出的"New JavaServer Page/JavaServer Page"窗口,需要选择JSP的创建目录,这里为"/WEB-INF"目录下。JSP的名称为index.jsp,然后按【Next】按钮进行下一步。如图16-19所示。

    图16-19 创建JSP界面

      在弹出的"New JavaServer Page/Select JSP Template"窗口,可以选择使用JSP模板,也可以不选择使用。为了方便,一般选择使用JSP模板,然后按【Finish】完成。如图16-20所示。

    图16-20 选择JSP模板界面

      下面要在index.jsp页面显示"Hello Tomcat!"和当前的时间。index.jsp的代码如下所示:

      <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>

      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

      <html>

      <head>

      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

      <title>Insert title here</title>

      </head>

      <body>

      Hello Tomcat!<p>

      <%java.util.Date d = new java.util.Date();%>

      Now Is:<%= d.toLocaleString()%>

      </body>

      </html>

      启动Tomcat插件进行测试

      要启动Tomcat 服务器,只需简单的单击工具条中的【Start Tomcat】按钮,或是在主菜单中选择Tomcat 菜单,然后再选择"Start Tomcat"即可。

      当Tomcat服务器启动的时候,在控制台Console显示区就可以看到Tomcat服务器启动信息。可以通过查看Tomcat服务器启动信息来检查Tomcat服务器在启动中的问题和结果。同时还可以查看访问Tomcat服务器的信息。

      当Tomcat服务器已经启动之后,可以打开系统的Web 浏览器,也可以启动Eclipse IDE里自带的Web 浏览器,在地址栏键入:"http://localhost:8080/TomcatProject".则可以看到运行index.jsp的页面。在Eclipse IDE的Web浏览器里的运行页面如图16-21所示。

    图16-21 在Eclipse的Web浏览器里的运行index.jsp页面

     
     
     
     

    第 16 章:集成Tomcat与Eclipse作者:钟经伟贺细平周航军等    来源:希赛网    2014年03月13日

     

    小结

     

      16.4 小结

      本章主要介绍了Eclipse的特性,Eclipse IDE和中文包的安装过程,Eclipse和Tomcat的集成步骤方法,以及在Eclipse和Tomcat的集成环境下进行Tomcat Web应用开发的一般步骤方法。

      Eclipse可以通过加入Tomcat插件来扩展现有插件功能,而且有着统一的外观、操作和系统资源管理界面。Eclipse是一个非常优秀的Java开发环境,把Tomcat与Eclipse集成,可以方便快捷地在Eclipse IDE环境中进行Tomcat Web应用项目的开发和调试。Eclipse作为开发调试用的IDE,Tomcat作为Web应用服务器,为方便快捷的开发Tomcat Web应用项目提供了具有实用意义的模式。

     
  • 相关阅读:
    shell实战
    shell基础
    rpm和yum使用
    用户和用户组的管理
    js Date 时间戳 时区等问题总结
    markdown语法 锚链接实现
    js 通过if变量判断时注意事项
    上传图片过程中,关闭了弹框 如何取消上传
    javascript 导入其他文件的的变量 或函数
    在使用resetField 报错Cannot read property 'indexOf' of undefined
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/5643687.html
Copyright © 2011-2022 走看看