Tomcat是jsp/servlet container,對靜態(tài)資源(如HTML文件或圖像文件)的處理速度,以及提供的Web服務器管理功能方面都不如其他專業(yè)的HTTP服務器,如IIS和Apache服務器。
我是以Tomcat5.0.16,apache_2.0.55Http Server,mod_jk-apache-2.0.55.so jk插件進行集成。
一、基本原理
Tomcat的兩個常用連接器,
第一個連接器監(jiān)聽8080端口,負責建立HTTP連接。在通過瀏覽器訪問Tomcat服務器的Web應用時,使用的就是這個連接器。
第二個連接器監(jiān)聽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端口進行監(jiān)聽,如果碰到訪問靜態(tài)的html/圖片文件訪問,直接由http服務器進行處理。如果碰到jsp/servlet等訪問,則通過jk插件,轉發(fā)到tomcat監(jiān)聽的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轉發(fā)到tomcat
JkMount?/*.jsp?worker1
JkMount?/*.page?worker14、新建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=ajp135、配置tomcat
安裝tomcat后,會發(fā)現webapps已經有許多目錄,其中已有一個Root為tomcat默認的"/"context.
將tomcat webapps下的一些不需要的目錄刪去,把Root下的文件刪除,并把你需要配置的網站內容拷貝到此目錄下。
找到conf/Catalina/localhost目錄,刪除一些沒用的xml文件,有些xml文件是tomcat啟動時按照webapps的目錄自動產生的context。
四、開發(fā)時配置
在進行開發(fā)時,如果我們使用的是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,最好把當前開發(fā)的web的context的reloadable設置為true,我們所做的修改tomcat會自動重新加載,不用重啟tomcat就能立即看到新的變化。
3、在eclipse中將網站的源代碼發(fā)布到tomcat中有兩種方法,
一種是采用eclipse自帶的depoly功能,將web發(fā)布到webapps/ROOT目錄,或任一目錄,對應的只是修改conf/Catalina/localhost的xml文件。
另一種方法是采用ant,一個xml文件用于全發(fā)布(clean,compile,java,copy),另一個xml文件則只發(fā)布修改的(compile,copy)。
小項目用第一種方便,每次修改了源代碼,只需刷新一下,eclipse就自動幫你depoly到目的地;
當采用第二種時,每次小修改時,需要運行一次ant,把修改的內容重新拷貝并發(fā)布過去;如果發(fā)布的內容很臟時,有時需全發(fā)布(clean,compile,java,copy)。
配置httpd.conf和workers.properties的詳細內容,請參考:
http://tomcat.apache.org/connectors-doc/
posted @
2006-04-06 19:44 Steven Liu 閱讀(634) |
評論 (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 閱讀(795) |
評論 (2) |
編輯 收藏