Tomcat是jsp/servlet container,对静态资源(如HTML文件或图像文件)的处理速度,以及提供的Web服务器管理功能方面都不如其他专业的HTTP服务器,如IIS和Apache服务器。
我是以Tomcat5.0.16,apache_2.0.55Http Server,mod_jk-apache-2.0.55.so jk插件进行集成。
一、基本原理
Tomcat的两个常用连接器,
第一个连接器监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
第二个连接器监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。
查看conf/server.xml文件,
<Service name="Catalina">
<Connector acceptCount="100" connectionTimeout="20000" port="8080" redirectPort="8443" disableUploadTimeout="true">
</Connector>
<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler">
</Connector>
<Engine defaultHost="localhost" name="Catalina">
<Host appBase="webapps" name="localhost">
<Logger className="org.apache.catalina.logger.FileLogger" suffix=".txt" prefix="localhost_log." timestamp="true"/>
</Host>
<Logger className="org.apache.catalina.logger.FileLogger" suffix=".txt" prefix="catalina_log." timestamp="true"/>
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
</Engine>
</Service> 根据以上Service,可以tomcat的安装目录找到conf/Catalina/localhost目录,里面的XML文件为配置该service所有的Context,一个xml文件对应一个context配置。
打开admin.xml,
<Context privileged="true" path="/admin" displayName="Tomcat Administration Application" docBase="../server/webapps/admin">
<Logger className="org.apache.catalina.logger.FileLogger" suffix=".txt" prefix="localhost_admin_log." timestamp="true"/>
</Context> 可以看到,配置了一个/admin的context,其docBase为/server/webapps/admin。
二、集成目标
我们对tomcat和http 服务器进行集成的目标就是:让http服务器在80端口进行监听,如果碰到访问静态的html/图片文件访问,直接由http服务器进行处理。如果碰到jsp/servlet等访问,则通过jk插件,转发到tomcat监听的8009端口,由tomcat处理。
三、实施步骤1、安装apache http server, tomcat. 从略。
2、安装jk插件。
把mod_jk-apache-2.0.55.so拷贝到http server的/modules目录即可。
3、配置apache htpp server,打开conf/httpd.conf文件,
(1)修改Website根目录,
找到DocumentRoot,改为你想放置网站根目录的地方
DocumentRoot "D:/java/Tomcat5.0/webapps/ROOT"
(2)加载jk插件及配置属性
#加载模块
LoadModule jk_module modules/mod_jk-apache-2.0.55.so
#工作属性文件
JkWorkersFile conf/workers.properties
#日志存放
JkLogFile logs/mod_jk2.log
#日志等级
JkLogLevel info
#日期格式
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
#日志格式
JkRequestLogFormat "%w %V %T"
#Url转发到tomcat
JkMount /*.jsp worker1
JkMount /*.page worker1 4、新建conf/workers.properties
#让mod_jk模块知道Tomcat
workers.tomcat_home=D:\java\Tomcat5.0
#让mod_jk模块知道j2sdk
workers.java_home=D:\java\j2se
#所配置的Tomcat列表
worker.list=worker1
#工作端口,若没占用则不用修改
worker.worker1.port=8009
#Tomcat服务器的地址
worker.worker1.host=localhost
#类型
worker.worker1.type=ajp13 5、配置tomcat
安装tomcat后,会发现webapps已经有许多目录,其中已有一个Root为tomcat默认的"/"context.
将tomcat webapps下的一些不需要的目录删去,把Root下的文件删除,并把你需要配置的网站内容拷贝到此目录下。
找到conf/Catalina/localhost目录,删除一些没用的xml文件,有些xml文件是tomcat启动时按照webapps的目录自动产生的context。
四、开发时配置
在进行开发时,如果我们使用的是tomcat,我们可以采用此种方法进行配置。
1、通过
http://localhost:6060/index.jsp与
http://localhost/index.jsp访问效果是一样的,
但
http://localhost/aBigPicture.gif的访问可能比直接访问tomcat要快多了。
2、进入
http://localhost:6060/admin,默认user:admin,password为空,
查看service下面的context,最好把当前开发的web的context的reloadable设置为true,我们所做的修改tomcat会自动重新加载,不用重启tomcat就能立即看到新的变化。
3、在eclipse中将网站的源代码发布到tomcat中有两种方法,
一种是采用eclipse自带的depoly功能,将web发布到webapps/ROOT目录,或任一目录,对应的只是修改conf/Catalina/localhost的xml文件。
另一种方法是采用ant,一个xml文件用于全发布(clean,compile,java,copy),另一个xml文件则只发布修改的(compile,copy)。
小项目用第一种方便,每次修改了源代码,只需刷新一下,eclipse就自动帮你depoly到目的地;
当采用第二种时,每次小修改时,需要运行一次ant,把修改的内容重新拷贝并发布过去;如果发布的内容很脏时,有时需全发布(clean,compile,java,copy)。
配置httpd.conf和workers.properties的详细内容,请参考:
http://tomcat.apache.org/connectors-doc/
posted @
2006-04-06 19:44 Steven Liu 阅读(626) |
评论 (0) |
编辑 收藏
问题描述:
已有如下代码,
<
body
onLoad
="MM_timelinePlay('Timeline1')"
>
</
body
>
即document.body.onload事件已经绑定了一个函数。
现需要onload时激活另外一个函数,如
enetgetMsg(),如何处理?
解决方案:
alert(document.body.onload.toString())
弹出窗口的内容为:
function anonymous()
{
MM_timelinePlay('Timeline1')
}
可见,当对onload绑定一个函数时,javascript自定义了一个函数,在该自定义函数体内调用了该绑定函数。
解决方法一:
重新写一函数,
function bodyOnload(){
MM_timelinePlay('Timeline1');
enetgetMsg();
} <body onLoad="bodyOnload()"> 解决方法二:
利用javascript重定义函数的功能,
newBodyload="enetgetMsg();";
if(document.body.onload)
{
eval(document.body.onload.toString().replace('anonymous()','oldBodyload()'));
document.body.onload=new Function("oldBodyload();"+newBodyload);
}
else document.body.onload=new Function(newBodyload); 显然,第二种方法更好,因为这种方法实现时不必关心以前这个事件绑定了多少个函数,不需修改原先的代码,透明地增加一个函数。(decorate模式:透明地增加功能
)
posted @
2006-04-06 15:59 Steven Liu 阅读(785) |
评论 (2) |
编辑 收藏