<!-- 这些指令组件关闭JMX MBeans支持 -->
<!-- 你也可以通过包含你自己的mbean描述文件配置自定义的组件,然后设置
      “descriptors”属性为以“;”为分隔的文件名列表严将它添加到默认列表
      中,例如:descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"。
-->
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0" />
<!-- Global JNDI resources -->
<!-- 全局JNDI资源 -->
<GlobalNamingResources>
      <!-- 出于示例目的的测试入口 -->
      <Environment name="simpleValue" type="java.lang.Integer" value="30" />
      <!-- 可编辑的,用来通过UserDatabaseRealm认证用户的用户数据库 -->
      <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved">
      </Resource>
      <ResourceParams name="UserDatabase">
       <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
       </parameter>
       <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
       </parameter>
      </ResourceParams>
</GlobalNamingResources>
<!-- 一个“Service”是一个或多个共用一个单独“Container”(容器)的“Connectors”
      组合(因此,应用程序在容器中可见)。通常,这个容器是一个“Engine”
      (引擎),但这不是必须的。
      注意:一个“Service”自身不是一个容器,因此,在这个级别上你不可定义
      诸如“Valves”或“Loggers”子组件。
-->
<!-- 定义Tomcat的标准独立服务 -->
<Service name="Catalina">
      <!-- 一个“Connector”(连接器)代表一个请求被接收和应答所需要的端点。每个连
       接器通过相关的“Container”(容器)处理请求。
       默认情况下,一个非SSL的HTTP/1.1的连接器被绑定在端口8080。你也可以通过
       根据后面的使用说明并取消第二个连接器入口的注释,在端口8443上建立一个
       SSL HTTP/1.1的连接器。开放SSL支持需要下面几步(参见Tomcat 5文档中怎样
       配置SSL的说明以取得更多的详细信息):
       * 如果你的JDK是1.3或1.3以前的版本,下载安装JSSE 1.0.2或以后版本,并放
       置JAR文件到“$JAVA_HOME/jre/lib/ext”目录下。
       * 带一个“changeit”的口令值执行:
       %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
       $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)
       来生成它自己的证书私钥。
       默认情况下,当一个web应用程序调用请求时,DNS查询是可行的。这将对性能造
       成一些不利的影响,因此,你可以将“enableLookups”设置为“false”来关闭DNS
       查询。当DNS查询被关闭时,request.getRemoteHost()将返回包含远程客户IP地
       址的字符串。
      -->
      <!-- 在8080端口上定义一个非SSL的HTTP/1.1连接器 -->
      <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
       enableLookups="false" redirectPort="8443" acceptCount="100"
       debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
      <!-- 注意,要关闭连接超时,将connectionTimeout设置为0 -->
      <!-- 注意:要使用gzip压缩需要设置如下属性:
       compression="on"
       compressionMinSize="2048"
       noCompressionUserAgents="gozilla,traviata"
       compressableMimeType="text/html,text/xml"
      -->
      <!-- 在端口8443上定义一个SSL的HTTP/1.1的连接器 -->
      <!--
       <Connector port="8443"
       maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
       enableLookups="false" disableUploadTimeout="true"
       acceptCount="100" debug="0" scheme="https" secure="true"
       clientAuth="false" sslProtocol="TLS" />
      -->
      <!-- 在端口8009上定义一个Coyote/JK2 AJP 1.3连接器 -->
      <Connector port="8009" enableLookups="false" redirectPort="8443"
       debug="0" protocol="AJP/1.3" />
      <!-- 在8082端口上定义一个代理HTTP/1.1连接器 -->
      <!-- 参见代理文档以取得这里使用属性的更多的信息。 -->
      <!--
       <Connector port="8082"
       maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
       enableLookups="false"
       acceptCount="100" debug="0" connectionTimeout="20000"
       proxyPort="80" disableUploadTimeout="true" />
      -->
      <!-- 一个“Engine”(引擎)代表处理每个请求的入口点(在Catalina内)。这个Tomcat
       的标准独立引擎实现分析包含在请求中的HTTP头信息,并将请求传送到适当的主机
       或虚拟主机上。-->
      <!-- 你应该这样设置jvmRoute以便在JK/JK2通道上支持负载平衡:
       <Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1">
      -->
      <!-- 在我们的容器体系中定义最高级别的容器 -->
      <Engine name="Catalina" defaultHost="localhost" debug="0">
       <!-- 请求转储器值转储非常有用的通过Tomcat这个实例接收到的所有请求的,关于
        接收到的请求头和cookies,以及发送出的回应头和cookies的调试信息。如果
        你只在意一个特定的虚拟主机或者一个特定应用程序的请求,在对应的<Host>
        或<Context>入口中套用这个元素。
        对于所有的Servlet(小服务程序)2.4来所,在示例程序中检验
        “RequestDumperFilter”过滤是非常容易的(这个过滤器源代码可以在
        “$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters”下找到。
        请求转储默认情况下是关闭的,如果要使用它,取消下面行的注释符。-->
       <!--
        <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
       -->
       <!-- 全局日志设置,除非在更低的级别上覆盖它的设置 -->
       <Logger className="org.apache.catalina.logger.FileLogger"
        prefix="catalina_log." suffix=".txt" timestamp="true" />
       <!-- 因为这个Realm(区域)在这儿,因此这个实例将被全局共享。 -->
       <!-- 这个Realm(区域)使用在全局JNDI资源下,由“UserDatabase”配置的用户
        数据库。通过使用Realm将使对于这个用户数据库的任何编辑都将会立即可用
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
        debug="0" resourceName="UserDatabase"/>-->
       <!-- 注释掉旧有的Realm以便我们能很快速的恢复旧有配置。 -->
       <!--
        <Realm className="org.apache.catalina.realm.MemoryRealm" />
       -->
       <!-- 下面的属性用于从储存在数据库或从JDBC通道中得到的Realm以取代上面的
        Realm配置。-->
       <!--
        <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
        driverName="oracle.jdbc.driver.OracleDriver"
        connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
        connectionName="scott" connectionPassword="tiger"
        userTable="users" userNameCol="user_name" userCredCol="user_pass"
        userRoleTable="user_roles" roleNameCol="role_name" />
       -->
       <!--
        <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
        driverName="sun.jdbc.odbc.JdbcOdbcDriver"
        connectionURL="jdbc:odbc:CATALINA"
        userTable="users" userNameCol="user_name" userCredCol="user_pass"
        userRoleTable="user_roles" roleNameCol="role_name" />
       -->
       <!-- 定义默认的虚拟主机
        注意:XML模式确认将不能与Xerces 2.2同工作。
       -->
       <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"
        autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        <!--
         为这个结点定义一个群集,通过定义这个元素,意味着每个管理员都将被改变。
         因此,当运行一个群集时,只有确认在必须被聚集和移除其他的地方有你的
         web软件。
         一个群集有下面这些参数:
         className = 这个群集类的全限定名
         name = 你的群集的描述名,可以是任何描述
         debug = 调试级别,更高意味着更多的输出
         mcastAddr = 多播地址,所有的节点都必须有同样的多播地址
         mcastPort = 多播端口,对所有的节点都必须有同样的多播端口
         mcastBindAddr = 绑定多播套接字到一个指定的地址
         mcastTTL = 多播生存期,如果你想要限制你的广播的话
         mcastSoTimeout = 多播读取超时
         mcastFrequency = 发送“I'm alive”(我还活着)信息的间隔毫秒数
         mcastDropTime = 多长时间没有收到“I'm alive”就将这个节点标识为死节点(单位:毫秒)
         tcpThreadCount = 用于处理重复引入请求的线程数,最好是每个节点都有相同的线程数
         tcpListenAddress = 在有多块以太网卡的主机上的监听TCP群集请求的地址(绑定地址),auto意味着地址由InetAddress.getLocalHost().getHostAddress()取得。
         tcpListenPort = tcp监听端口
         tcpSelectorTimeout = 在操作系统中有java.nio唤醒错的情况下,使用Selector.select()的超时
         毫秒数。设为0则没有超时限制
         printToScreen = true意味着管理员的相关信息也将打印输出到std.out
         expireSessionsOnShutdown = true 意味着
         useDirtyFlag = true意味着我们只能在调用setAttribute,removeAttribute后才能复制一个会话;
         false意味着在每个请求后复制会话。
         false意味着复制将以下列代码方式工作:
         <%
         HashMap map = (HashMap)session.getAttribute("map");
         map.put("key","value");
         %>
         replicationMode = 可以是“pooled”、“synchronous”或者“asynchronous”
         * Pooled意味着在多个套接字上同步进行复制。例如,先复制数据,然后请求返回。
         这与“synchronous”相同,除了它使用一个套接字池,因此,它是多线程的。它是
         最快和最高级的设置,使用这个配置也增加了处理复制的tcp线程的域。
         * Synchronous指执行请求的线程,它也是向其他节点复制数据的线程,并且直到
         所有的节点都己经收到信息后才返回。
         * Asynchronous,对每个群集节点而言,这是一个特别的“sender”(发送者)线程,
         因此请求线程将复制请求排队到一个小队列中,然后,返回给用户。
         这个小队列是一个当会话被添加到队列中,而从先前的请求中,同一个会话己经存在
         ,这个会话将被放置在队列中以代替重复的两个请求。这几乎从不会发生,除非存在
         较大的网络延迟。
        -->
        <!-- 当配置群集时,你也添加一个值来捕获所有传入的请求,在请求结束时,这个会话可能被子复制,
         也可能不被复制。一个会话是否复制取决于下列条件是否发生:
         1. useDirtyFlag为真,或者setAttribute或者removeAttribute己经被调用。
         2. 会话己经存在(己经被创建了)。
         3. 请求没有被“filter”属性所捕获。
         这个filter(过滤器)属性用于过滤那些不能修改会话的请求,因此,我们在这个请求结束后不复制
         会主。这个过滤器是消极的,例如,你向过滤器发送了一些东西,然后被过滤出去,在那个匹配的过
         滤器上不会发生复制。
         过滤器属性以分号为分隔,因此你不能换行,即使你想这么做。
         filter=".*\.gif;.*\.js;"意味着在进行以.gif和.js结束的URI请求后不复制会话。
        -->
         <!--
         <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
         managerClassName="org.apache.catalina.cluster.session.DeltaManager"
         expireSessionsOnShutdown="false"
         useDirtyFlag="true">
         <Membership
         className="org.apache.catalina.cluster.mcast.McastService"
         mcastAddr="228.0.0.4"
         mcastPort="45564"
         mcastFrequency="500"
         mcastDropTime="3000"/>
         <Receiver
         className="org.apache.catalina.cluster.tcp.ReplicationListener"
         tcpListenAddress="auto"
         tcpListenPort="4001"
         tcpSelectorTimeout="100"
         tcpThreadCount="6"/>
         <Sender
         className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
         replicationMode="pooled"/>
         <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
         filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
         </Cluster>
        -->
        <!-- 通常,对每一个应用程序,用户必须逐个的认证他们自己。当他们遇到被
         某种安全约束所保护的资源时,如果你想让用户只在第一次被认证,那么,
         取消下面入口行的注释,然后在这个虚拟主机中包含这个用户的,横跨所有
         web应用程序的用户身份识别。-->
        <!--
         <Valve className="org.apache.catalina.authenticator.SingleSignOn"
         debug="0"/>
        -->
        <!-- 这个虚拟主机的所有请求的访问日志过程。默认情况下,日志文件被创建在相对
         于$CATALINA_HOME目录下的logs目录下。通过directory属性,你也可以指定一个
         不同的目录,如果你想的话。可以使用相对路径(相对于$CATALINA_HOME),也
         可以使用绝对路径。-->
        <!--
         <Valve className="org.apache.catalina.valves.AccessLogValve"
         directory="logs" prefix="localhost_access_log." suffix=".txt"
         pattern="common" resolveHosts="false"/>
        -->
        <!-- 与这个虚拟主机有关系所有上下文所共享的日志。默认情况下(使用FileLogger时),
         日志文件被创建在相对于$CATALINA_HOME目录下的logs目录下。如果你希望,你也可
         以给directory指定一个不同的路径。可以使用相对于$CATALINA_HOME的相对路径,也
         可以使用绝对路径。-->
        <Logger className="org.apache.catalina.logger.FileLogger" directory="logs"
        prefix="localhost_log." suffix=".txt" timestamp="true" />
<Context path="web上下文路径" docBase="虚拟目录路径" reloadable="true" debug="0"> </Context>
       </Host>
      </Engine>
</Service>
</Server>

tomcat文件夹的conf\catalina\localhost(对于Tomcat6版本及其以上,需要自己创建catalina和localhost这两个文件夹)
增加project .xml文件(该文件名的project要和下面的“path=“/xxx"”的xxx相同)
文件内容:
<Context path="/project" reloadable="true" docBase="E:\javastudio\oob" workDir="E:\javastudio\oob\work" />
docBase是项目文件夹的web-inf文件夹的上一层目录 workDir是指Tomcat解析Jsp转换为Java文件,并编译为class存放的文件夹,设置在项目文件夹里面,可以避免移植到其他地方首次读取jsp文件需要重新解析 。一般格式:项目文件夹\work reloadable是指可以重新加载,一般设置为true,方便使用,不需要经常重启Tomcat以后启动Tomcat,在浏览器输入http://localhost:8080/project就能访问该项目的welcome文件。

***************
为什么要不修改server.xml呢?在Tomcat6的doc帮助文档中,官方是不提倡修改server.xml来添加虚拟目录的!
       而我认为,以上使用的方法,非常方便于项目的移植,移植后,只有修改docBase和workDir的值就行了,甚至可以去掉workDir这个属性