首先定义tomcat6的安装根目录为 ${CATALINA_HOME}
在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个context.xml文件中。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。我们当然推荐把应用需要的JNDI资源配置在context.xml文件中,而不是server.xml文件中。
由于context元素的可用范围是可以控制的,我们可以根据需要为Context元素定义不同级别的可用范围。
一. 全局可用
全局可用的范围意味着tomcat服务器下面的所有应用都可以使用这个context元素定义的资源。
全局可用范围的context元素在文件 ${CATALINA_HOME}/conf/context.xml 文件中描述。这个文件在tomcat刚刚被安装的时候,是没有定义任何资源的。我们可以看到,这个文件的内容:
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
Context>
其中的 <watchedresource></watchedresource>WEB-INF/web.xml表示服务器会监视应用的WEB-INF/web.xml 文件来知道那个应用会引用在此处定义的资源。
二. 指定的虚拟主机可用
指定的虚拟主机可用就是说,在tomcat服务器配置的虚拟主机中,只有指定的那个虚拟主机上跑的应用才能使用。要配置一个虚拟主机可用的context资源,可以在${CATALINA_HOME}/conf/目录下的文件 ${enginename}/${hostname}/context.xml.default 中表述。
比如,一般一个tomcat服务器安装好了以后,都有一个默认的叫做 Catalina 的引擎,在这个引擎下有一个叫做 localhost 的虚拟主机。我们的应用一般都放在这个虚拟主机下。那么,如果我们想要配置一个在 Catalina/localhost 虚拟主机下都可以使用的资源,我们需要在目录 ${CATALINA_HOME}/conf 下建立路径 Catalina/localhost,在这个路径下创建文件 context.xml.default。全路径是 ${CATALINA_HOME}/conf/Catalina/localhost/context.xml.default
三. 指定的应用可用
顾名思义,一个指定的应用可用的context元素,意味着这是一个只有指定的引擎,指定的虚拟主机,指定的应用才可以使用的context元素。
如果我们用appname来代表这个指定的这个指定的应用的名字,那么元素的定义应该被放置在 ${CATALINA_HOME}/conf/${enginename}/${hostname}/${appname}.xml文件中。
例如,假设在localhost下我们有一个web应用叫做webtest,那么我们应该创建文件 ${CATALINA_HOME}/conf/Catalina/localhost/webtest.xml。
Tomcat6.0数据源配置
方法一:
1.配置tomcat下的conf下的context.xml文件,在之间添加连接池配置:
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:mydb"
username="bmgis"
password="bmgis"
maxActive="100"
maxIdle="30"
maxWait="10000" />
2.配置你的应用下的web.xml中的之间加入:
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mydb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
在以往的tomcat当中还需要在web.xml指定相应的resource,在tomcat 5.5以后的版本不写也可以,但建议还是配置。
3.把连接数据库的第三方驱动放到${CATALINA_HOME}/lib下面就ok了
4.测试程序test.jsp如下:
<%@ page import="javax.naming.*"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
conn.close();
%>
方法二:
我们只需要在WebRoot目录下,新建一个META-INF的目录(假如不存在,注意目录名称大写),
在该目录下创建一个context.xml文件,并且在context.xml文件当添加以下的配置信息:
<Context>
<Resource name="jdbc/mydb"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:mydb"
username="bmgis"
password="bmgis"
maxActive="100"
maxIdle="30"
maxWait="10000"
logAbandoned="true" />
</Context>
其中:
name 表示指定的jndi名称
auth 表示认证方式,一般为Container
type 表示数据源床型,使用标准的javax.sql.DataSource
maxActive 表示连接池当中最大的数据库连接
maxIdle 表示最大的空闲连接数
maxWait 当池的数据库连接已经被占用的时候,最大等待时间
logAbandoned 表示被丢弃的数据库连接是否做记录,以便跟踪
username 表示数据库用户名
password 表示数据库用户的密码
driverClassName 表示JDBC DRIVER
url 表示数据库URL地址
此方法二一样适用Tomcat5.5
Tomcat5.5x数据源配置
方式一、全局数据库连接池
1、通过管理界面配置连接池,或者直接在${CATALINA_HOME}/conf/server.xml的GlobalNamingResources中增加
<Resource name="jdbc/mydb" type="javax.sql.DataSource"
username="bmgis" password="bmgis"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:mydb"
maxIdle="2" maxWait="5000" maxActive="4"/>
2、在${CATALINA_HOME}/webapps/myapp/META-INF/context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
这样就可以了。
方式二、全局数据库连接池
1、同上
2、在${CATALINA_HOME}/conf/context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
方式三、局部数据库连接池
只需在${CATALINA_HOME}/webapps/myapps/META-INF/context.xml的Context中增加:
<Resource name="jdbc/mydb" type="javax.sql.DataSource"
username="bmgis" password="bmgis"
url="jdbc:oracle:thin:@localhost:1521:mydb"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
maxIdle="2" maxWait="5000" maxActive="4"/>
扩展 Tomcat虚拟主机的配置
虚拟主机是使用特殊的软硬件技术,把一台计算机主机分成一台台“虚拟“的主机,每一台虚拟主机都具有独立的域名和IP 地址(或共享的 IP 地址)有完整的 Internet 服务器(WWW、FTP、Email等)功能。利用“虚拟主机”技术,每一台虚拟主机和一*立的主机完全一样,每一台虚拟主机都具有独立的域名,具有完整 Internet 服务器功能。
Tomcat 支持虚拟主机技术,不需要额外的插件,而且配置简单。
一 准备
我们将配置两台虚拟主机,假设域名分别为
www.sentom1.net
www.sentom2.net
为了测试方便,请在客户机的:
Win2K:\\WINNT\system32\drivers\etc\hosts
Linux:/etc/hosts
文件中增加下面内容,然后检查一下这两个域名是否解析正确。
192.168.0.1 www.sentom1.net
192.168.0.1 www.sentom2.net
当然,在生产环境中这样做是不行的,需要的在 DNS 上做相应的域名解析。
二 Tomcat安装
Tomcat的安装不在本文的讨论范围。请确保Tomcat安装正确,不然请不要继续进行下面的配置步骤。
将 tomcat 目录下的 webapps 目录在同一目录复制一份,目录名分为 webapps2 ,然后将 webapps 目录改名为 webapps1 。最后 tomcat 的目录结构大致如下:
tomcat
|--bin
|--common
|--conf
|--logs
|--server
|--shared ......
|--webpapps1
|--webpapps2
|--work
最后,写一个简单 html 文件用于测试,文件名为 test.html ,文件内容如下:“你现在访问的是 www.sentom1.net”。
将 test.html 文件分别在 tomcat/webapps1/ROOT、tomcat/webapps2/ROOT 目录放置一份,然后将 tomcat/webapps2/ROOT/test.html 文件内容中“www.sentom1.net”改为“www.sentom2.net”。
至此,前期的准备工作做完了。
三 配置虚拟主机
前面提到了独立 IP 和共享的 IP。本文介绍的是共享的 IP 模式,这种模式就是所有的虚拟主机都使用同一IP 。目前国内IDC 提供的虚拟主机都是这种模式。这种模式的优点是节约数量有限的IP ,缺点就是虚拟主机只能通过域名访问而不能通过IP 访问(其实也不算是缺点,只对邮件系统中用户的访问方式有一点点影响 )。而另外一种独立 IP 模式主要应用在邮件服务中,这里就不做介绍了。
配置 www.sentom1.net 虚拟主机
打开 tomcat/conf/server.xml 文件,将 Host 元素之间的内容全部删掉,然后把下面内容加如到 Host 元素原来的位置。
name="www.sentom1.net“ debug=“0“ appBase=“webapps1“ unpackWARs=“true“ autoDeploy=“true“〉
配置 www.sentom2.net 虚拟主机
将下面内容追加到 Host 元素后面,注意 Host 元素中 name 属性和 appBase 属性的值的变化。
name="www.sentom2.net“ debug=“0“ appBase=“webapps2“ unpackWARs=“true“ autoDeploy=“true“〉
现在可以启动 Tomcat 了,分别访问 http://www.sentom1.net:8080/test.html,http://www.sentom2.net:8080/test.html
如果访问得到的页面内容分别是下面的内容,那表明虚拟主机已经配置成功了。否则,请检查你的配置过程并重新按照文档配置。
一、网站系统的组成
只要在一台计算机上安装了WEB服务器软件,从功能上讲,这台计算机就可以称为WEB服务器。一个网站的规模可大可小,功能可多可少,最简单的网站只需要一台Web服务器即可对外提供网页浏览服务。复杂的网站包括多台WEB服务器组成的群集系统、负载均衡设备、具有缓存功能的代理服务器(可以有多级,甚至包括放置在服务器端的缓存系统)、数据库系统等,如图所示。
www.sina.com网站系统采用的基本上就是图2.2所示的架构,不同地区的人们在访问www.sina.com站点时,浏览器实际上所访问的服务器是不一样的,例如,吉林省的用户访问的服务器实际是sina放在吉林地区的代理服务器,湖北省的用户访问的服务器实际是sina放在湖北地区的代理服务器。各地区的浏览器访问www.sina.com站点的过程如下图所示。
为了能够让浏览器透明地访问到WEB站点,让用户感觉不到是在访问区域代理服务器,在DNS系统中需要将www.sina.com主机名指向所有的区域代理服务器的IP地址。在浏览器访问www.sina.com站点中的页面而向DNS服务器请求解析www.sina.com主机名时,DNS服务器根据访问者的地理位置信息返回他附近的区域代理服务器的IP地址,这样,浏览器的访问请求将发送给该区域代理服务器。只有当区域代理服务器中没有浏览器要访问的页面时,区域代理服务器才去从真正的www.sina.com站点服务器上获取该页面并进行缓存,以后该区域的其他浏览器就都可以就近从区域代理服务器中访问到该页面了,从而大大提高了访问效率和减少了网络流量。
WEB浏览器与WEB服务器建立连接后,除了将请求URL中的资源路径发送给WEB服务器外,还会将URL中的主机名部分作为HTTP请求消息的Host头发送给WEB服务器。例如,在浏览器地址栏中输入http://www.it315.org,浏览器发送给www.it315.org主机上的WEB服务器的请求消息内容如下:
GET / HTTP/1.1<回车>
Host: www.it315.org<回车>
<回车>
WEB服务器接收到浏览器的访问请求消息后,根据Host头字段中所设置的主机名,就知道该选择哪个WEB站点来进行响应,因此,可以使用不同的主机名来作为区分同一个WEB服务器上的不同站点的标识信息。
Tomcat的Server.xml配置文件中有一个<Host>元素,一个<Host>元素用于建立一个WEB站点,使用多个<Host>元素则可以建立多个WEB站点。<Host>元素的父级元素为<Engine>元素,嵌套在同一个<Engine>元素中的多个<Host>元素的name属性不能相同,<Host>元素的name属性指定WEB站点所对应的主机名称。Tomcat的Server.xml配置文件中初始设置的<Host>元素内容如下:
<Host appBase="webapps" …>
…
</Host>
<Host>元素中的appBase属性指定了一个路径,该路径将作为嵌套在它里面的<Context>元素的docBase属性中设置的相对路径的基准路径。
当Tomcat接收到访问请求时,将比较请求消息中的Host头字段的值与<Host>元素的name属性值,并以匹配的<Host>元素所创建的WEB站点来响应。如果Server.xml文件中没有与请求消息的Host头字段匹配的<Host>元素,Tomcat将以默认的WEB站点来响应。只要<Engine>元素的defaultHost属性设置为嵌套在它里面的某个<Host>元素的name属性值,该<Host>元素所创建的WEB站点就成了该引擎的默认WEB站点。例如,Tomcat的Server.xml文件中的<Engine>元素的默认设置如下:
<Engine defaultHost="localhost" debug="0">
…
<Host name="localhost" appBase="webapps" …>
…
</Host>
…
</Engine>
上面的这段配置信息说明,该引擎的默认WEB站点为嵌套在<Engine>元素中的name属性为“localhost”的<Host>元素所创建的WEB站点。
在同一台计算机上建立了多个基于主机名的虚拟主机后,WEB浏览器要访问其中的某个虚拟主机的资源时,在访问URL中必须采用主机名,而不能采用IP地址。这是因为WEB浏览器要将URL中的主机名部分作为HTTP请求消息的Host头发送给WEB服务器,如果URL中的主机名部分使用的是IP地址,那么,浏览器发出的请求消息中的Host头字段的值就是这个IP地址,而在同一台计算机上建立的多个基于主机名的虚拟主机共享同一个IP地址,在Host头字段使用IP地址根本就无法区分不同的站点。
即使在URL中指定的是主机名时,WEB浏览器还是要先获得该主机名所对应的IP地址,然后再使用这个IP去连接WEB服务器。所以,在建立基于主机名的虚拟主机时,除了要在Tomcat的server.xml文件中进行设置外,还需要在整个网络系统中建立主机名与IP地址的映射关系,即必须将主机名添加到名称解析系统,以便WEB浏览器能够从名称解析系统中查询出主机名所对应的IP地址。建立主机名与IP地址的映射关系的惯用方式有两种:一是使用客户机本地的Hosts文件,二是使用DNS(Domain Name System,域名系统)服务器。Hosts文件和DNS的作用都是允许用户使用“友好”的、文本格式的主机名称,而不是数字格式的IP地址来访问网络中的计算机。Hosts文件可用于小型的Intranet(企业内部网),网络中的所有计算机上都需要使用Hosts文件。DNS通常用于大型的网络,特别是Internet上对外提供服务的计算机都是通过DNS来建立其主机名与IP地址的映射关系。客户机首先在本地的Hosts文件中查找主机名称所映射的IP地址,如果没有找到,再去查询DNS服务器。为了简单起见,这里仅介绍一下Hosts文件。对于Windows 2000系统,Hosts文件位于操作系统根目录(取决操作系统所在的分区,通常是c:\winnt)下的System32\Drivers\Etc子目录中,默认情况下,该文件中有如下一行内容:
127.0.0.1 localhost
这行文本的作用就是将IP地址(127.0.0.1)映射成主机名(localhost),这也就是在IE浏览器地址栏中可以使用localhost访问本地WEB服务器的原因。如果要增加更多的主机名与IP地址的映射,可以在Hosts文件中增加更多的行,然后参照上面这行内容的格式在每行中填写IP地址和相应的主机名。
:动手体验:使用Tomcat建立基于主机名的虚拟主机
(1)用UltraEdit打开<Tomcat主目录>/conf目录下的Server.xml文件,使用“查找”菜单查找内容为“</Host>”的行,紧接该行下面增加一对<Host></Host>标签。参照前面的<Host>标签的属性设置情况,设置新增的<Host>标签的属性,并在它里面嵌套一个设置该WEB站点根目录的<Context>元素,最终的内容如下:
<Host name="site1" debug="0" appBase="d:\VirtualHost1">
<Context path="" docBase="." debug="0"/>
</Host>
这样,将创建一个新的WEB站点。上面的<Context>元素的docBase属性值被设置为一个点(.),即表示使用<Host>元素的appBase属性中所设置的路径作为这个<Context>所映射的目录。
(2)在上面新增的<Host></Host>标签对下面再增加一对<Host></Host>标签,并将它设置为如下形式:
<Host name="site2" debug="0" appBase="d:\VirtualHost2">
<Context path="" docBase="." debug="0"/>
</Host>
这又创建了一个新的WEB站点,该站点的主机名称为site2,根目录对应的本地文件系统目录为d:\VirtualHost2。
(3)在d:盘下创建名称为VirtualHost1和VirtualHost2两个目录,并在这两个目录中分别创建一个名为test.html的文件,在d:\VirtualHost1\test.html文件中写入如下一行内容:
这是d:\VirtualHost1目录中的test.html文件
在d:\VirtualHost2\test.html文件中写入如下一行内容:
这是d:\VirtualHost2目录中的test.html文件
(4)保存修改后的Server.xml文件,重新启动Tomcat WEB服务器程序。打开一个新的命令行窗口中,并在这个命令行窗口中执行如下命令:
telnet 127.0.0.1 8080
接着在连接成功的telnet程序命令窗口中,输入如下内容:
GET /test.html HTTP/1.1<回车>
Host:<空格>site1<回车>
<回车>
这时在telnet程序窗口中可以看到,WEB服务器返回内容的正文部分为d:\VirtualHost1\test.html文件中的内容。接着WEB服务器返回内容的下边,输入如下内容:
GET /test.html HTTP/1.1<回车>
Host:<空格>site2<回车>
<回车>
在telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分为d:\VirtualHost2\test.html文件中的内容。接着WEB服务器返回内容的下边,输入如下内容:
GET /test.html HTTP/1.1<回车>
Host:<空格><回车>
<回车>
在telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分为d:\test\test.html文件中的内容。接着WEB服务器返回内容的下边,再次输入如下内容:
GET /test.html HTTP/1.1<回车>
Host:<空格>xxx<回车>
<回车>
在telnet程序窗口中又可以看到,WEB服务器这次返回内容的正文部分仍然为d:\test\test.html文件中的内容。
上面的整个交互过程如图2.34所示,Tomcat根据第1次和第2次请求中所指定Host头的值,查找Server.xml文件中与之相匹配的<Host>元素的name属性值,并以匹配的<Host>元素所设置的WEB站点来响应;在第3次和第4次请求中所指定Host头的值,在Server.xml文件中没有与之对应的<Host>元素的name属性值,Tomcat将以默认的WEB站点来响应。