javaGrowing

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks
          <2006年5月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(12)

          隨筆分類(84)

          隨筆檔案(92)

          文章分類(32)

          文章檔案(33)

          相冊

          收藏夾(1)

          ajax

          java

          java專家論壇

          linux

          Oracle

          PHP

          sap

          xml

          其他

          好站鏈接

          英語學(xué)習(xí)

          軟件下載

          電子書

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          編者按:現(xiàn)在開發(fā)Java Web應(yīng)用,建立和部署Web內(nèi)容是一件很簡單的工作。使用Jakarta Tomcat作為Servlet和JSP容器的人已經(jīng)遍及全世界。Tomcat具有免費、跨平臺等諸多特性,并且更新得很快,現(xiàn)在非常的流行。



          你所需要做的就是:按照你的需求配置Tomcat,只要你正確配置,Tomcat一般都能適合你的要求。下面是一系列關(guān)于Tomcat的配置技巧,這些技巧源自于我的書:《Tomcat權(quán)威指南》,希望對你有所幫助。—— Jason Brittain



          1. 配置系統(tǒng)管理(Admin Web Application)

          大多數(shù)商業(yè)化的J2EE服務(wù)器都提供一個功能強(qiáng)大的管理界面,且大都采用易于理解的Web應(yīng)用界面。Tomcat按照自己的方式,同樣提供一個成熟的管理工具,并且絲毫不遜于那些商業(yè)化的競爭對手。Tomcat的Admin Web Application最初在4.1版本時出現(xiàn),當(dāng)時的功能包括管理context、data source、user和group等。當(dāng)然也可以管理像初始化參數(shù),user、group、role的多種數(shù)據(jù)庫管理等。在后續(xù)的版本中,這些功能將得到很大的擴(kuò)展,但現(xiàn)有的功能已經(jīng)非常實用了。



          Admin Web Application被定義在自動部署文件:CATALINA_BASE/webapps/admin.xml 。

          (譯者注:CATALINA_BASE即tomcat安裝目錄下的server目錄)



          你必須編輯這個文件,以確定Context中的docBase參數(shù)是絕對路徑。也就是說,CATALINA_BASE/webapps/admin.xml 的路徑是絕對路徑。作為另外一種選擇,你也可以刪除這個自動部署文件,而在server.xml文件中建立一個Admin Web Application的context,效果是一樣的。你不能管理Admin Web Application這個應(yīng)用,換而言之,除了刪除CATALINA_BASE/webapps/admin.xml ,你可能什么都做不了。



          如果你使用UserDatabaseRealm(默認(rèn)),你將需要添加一個user以及一個role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你編輯這個文件,添加一個名叫“admin”的role 到該文件中,如下:



          <role name="admin"/>



          你同樣需要有一個用戶,并且這個用戶的角色是“admin”。象存在的用戶那樣,添加一個用戶(改變密碼使其更加安全):



          <user name="admin" password="deep_dark_secret" roles="admin"/>



          當(dāng)你完成這些步驟后,請重新啟動Tomcat,訪問http://localhost:8080/admin,你將看到一個登錄界面。Admin Web Application采用基于容器管理的安全機(jī)制,并采用了Jakarta Struts框架。一旦你作為“admin”角色的用戶登錄管理界面,你將能夠使用這個管理界面配置Tomcat。



          2.配置應(yīng)用管理(Manager Web Application)

          Manager Web Application讓你通過一個比Admin Web Application更為簡單的用戶界面,執(zhí)行一些簡單的Web應(yīng)用任務(wù)。



          Manager Web Application被被定義在一個自動部署文件中:



          CATALINA_BASE/webapps/manager.xml 。



          你必須編輯這個文件,以確保context的docBase參數(shù)是絕對路徑,也就是說CATALINA_HOME/server/webapps/manager的絕對路徑。

          (譯者注:CATALINA_HOME即tomcat安裝目錄)



          如果你使用的是UserDatabaseRealm,那么你需要添加一個角色和一個用戶到CATALINA_BASE/conf/tomcat-users.xml文件中。接下來,編輯這個文件,添加一個名為“manager”的角色到該文件中:



          <role name=”manager”>



          你同樣需要有一個角色為“manager”的用戶。像已經(jīng)存在的用戶那樣,添加一個新用戶(改變密碼使其更加安全):



          <user name="manager" password="deep_dark_secret" roles="manager"/>



          然后重新啟動Tomcat,訪問http://localhost/manager/list,將看到一個很樸素的文本型管理界面,或者訪問http://localhost/manager/html/list,將看到一個HMTL的管理界面。不管是哪種方式都說明你的Manager Web Application現(xiàn)在已經(jīng)啟動了。



          Manager application讓你可以在沒有系統(tǒng)管理特權(quán)的基礎(chǔ)上,安裝新的Web應(yīng)用,以用于測試。如果我們有一個新的web應(yīng)用位于/home/user/hello下在,并且想把它安裝到 /hello下,為了測試這個應(yīng)用,我們可以這么做,在第一個文件框中輸入“/hello”(作為訪問時的path),在第二個文本框中輸入“file:/home/user/hello”(作為Config URL)。



          Manager application還允許你停止、重新啟動、移除以及重新部署一個web應(yīng)用。停止一個應(yīng)用使其無法被訪問,當(dāng)有用戶嘗試訪問這個被停止的應(yīng)用時,將看到一個503的錯誤——“503 - This application is not currently available”。



          移除一個web應(yīng)用,只是指從Tomcat的運行拷貝中刪除了該應(yīng)用,如果你重新啟動Tomcat,被刪除的應(yīng)用將再次出現(xiàn)(也就是說,移除并不是指從硬盤上刪除)。



          3.部署一個web應(yīng)用

          有兩個辦法可以在系統(tǒng)中部署web服務(wù)。

          1> 拷貝你的WAR文件或者你的web應(yīng)用文件夾(包括該web的所有內(nèi)容)到$CATALINA_BASE/webapps目錄下。

          2> 為你的web服務(wù)建立一個只包括context內(nèi)容的XML片斷文件,并把該文件放到$CATALINA_BASE/webapps目錄下。這個web應(yīng)用本身可以存儲在硬盤上的任何地方。



          如果你有一個WAR文件,你若想部署它,則只需要把該文件簡單的拷貝到CATALINA_BASE/webapps目錄下即可,文件必須以“.war”作為擴(kuò)展名。一旦Tomcat監(jiān)聽到這個文件,它將(缺省的)解開該文件包作為一個子目錄,并以WAR文件的文件名作為子目錄的名字。接下來,Tomcat將在內(nèi)存中建立一個context,就好象你在server.xml文件里建立一樣。當(dāng)然,其他必需的內(nèi)容,將從server.xml中的DefaultContext獲得。



          部署web應(yīng)用的另一種方式是寫一個Context XML片斷文件,然后把該文件拷貝到CATALINA_BASE/webapps目錄下。一個Context片斷并非一個完整的XML文件,而只是一個context元素,以及對該應(yīng)用的相應(yīng)描述。這種片斷文件就像是從server.xml中切取出來的context元素一樣,所以這種片斷被命名為“context片斷”。



          舉個例子,如果我們想部署一個名叫MyWebApp.war的應(yīng)用,該應(yīng)用使用realm作為訪問控制方式,我們可以使用下面這個片斷:



          <!--

          Context fragment for deploying MyWebApp.war

          -->

          <Context path="/demo" docBase="webapps/MyWebApp.war"

          debug="0" privileged="true">

          <Realm className="org.apache.catalina.realm.UserDatabaseRealm"

          resourceName="UserDatabase"/>

          </Context>



          把該片斷命名為“MyWebApp.xml”,然后拷貝到CATALINA_BASE/webapps目錄下。



          這種context片斷提供了一種便利的方法來部署web應(yīng)用,你不需要編輯server.xml,除非你想改變?nèi)笔〉牟渴鹛匦裕惭b一個新的web應(yīng)用時不需要重啟動Tomcat。





          4.配置虛擬主機(jī)(Virtual Hosts)

          關(guān)于server.xml中“Host”這個元素,只有在你設(shè)置虛擬主機(jī)的才需要修改。虛擬主機(jī)是一種在一個web服務(wù)器上服務(wù)多個域名的機(jī)制,對每個域名而言,都好象獨享了整個主機(jī)。實際上,大多數(shù)的小型商務(wù)網(wǎng)站都是采用虛擬主機(jī)實現(xiàn)的,這主要是因為虛擬主機(jī)能直接連接到Internet并提供相應(yīng)的帶寬,以保障合理的訪問響應(yīng)速度,另外虛擬主機(jī)還能提供一個穩(wěn)定的固定IP。



          基于名字的虛擬主機(jī)可以被建立在任何web服務(wù)器上,建立的方法就是通過在域名服務(wù)器(DNS)上建立IP地址的別名,并且告訴web服務(wù)器把去往不同域名的請求分發(fā)到相應(yīng)的網(wǎng)頁目錄。因為這篇文章主要是講Tomcat,我們不準(zhǔn)備介紹在各種操作系統(tǒng)上設(shè)置DNS的方法,如果你在這方面需要幫助,請參考《DNS and Bind》一書,作者是Paul Albitz and Cricket Liu (OReilly)。為了示范方便,我將使用一個靜態(tài)的主機(jī)文件,因為這是測試別名最簡單的方法。

          在Tomcat中使用虛擬主機(jī),你需要設(shè)置DNS或主機(jī)數(shù)據(jù)。為了測試,為本地IP設(shè)置一個IP別名就足夠了,接下來,你需要在server.xml中添加幾行內(nèi)容,如下:



          <Server port="8005" shutdown="SHUTDOWN" debug="0">

          <Service name="Tomcat-Standalone">

          <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"

          port="8080" minProcessors="5" maxProcessors="75"

          enableLookups="true" redirectPort="8443"/>

          <Connector className="org.apache.coyote.tomcat4.CoyoteConnector"

          port="8443" minProcessors="5" maxProcessors="75"

          acceptCount="10" debug="0" scheme="https" secure="true"/>

          <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"

          clientAuth="false" protocol="TLS" />

          </Connector>

          <Engine name="Standalone" defaultHost="localhost" debug="0">

          <!-- This Host is the default Host -->

          <Host name="localhost" debug="0" appBase="webapps"

          unpackWARs="true" autoDeploy="true">

          <Context path="" docBase="ROOT" debug="0"/>

          <Context path="/orders" docBase="/home/ian/orders" debug="0"

          reloadable="true" crossContext="true">

          </Context>

          </Host>



          <!-- This Host is the first "Virtual Host": www.example.com -->

          <Host name="www.example.com" appBase="/home/example/webapp">

          <Context path="" docBase="."/>

          </Host>



          </Engine>

          </Service>

          </Server>



          Tomcat的server.xml文件,在初始狀態(tài)下,只包括一個虛擬主機(jī),但是它容易被擴(kuò)充到支持多個虛擬主機(jī)。在前面的例子中展示的是一個簡單的server.xml版本,其中粗體部分就是用于添加一個虛擬主機(jī)。每一個Host元素必須包括一個或多個context元素,所包含的context元素中必須有一個是默認(rèn)的context,這個默認(rèn)的context的顯示路徑應(yīng)該為空(例如,path=””)。



          5.配置基礎(chǔ)驗證(Basic Authentication)

          容器管理驗證方法控制著當(dāng)用戶訪問受保護(hù)的web應(yīng)用資源時,如何進(jìn)行用戶的身份鑒別。當(dāng)一個web應(yīng)用使用了Basic Authentication(BASIC參數(shù)在web.xml文件中auto-method元素中設(shè)置),而有用戶訪問受保護(hù)的web應(yīng)用時,Tomcat將通過HTTP Basic Authentication方式,彈出一個對話框,要求用戶輸入用戶名和密碼。在這種驗證方法中,所有密碼將被以64位的編碼方式在網(wǎng)絡(luò)上傳輸。



          注意:使用Basic Authentication通過被認(rèn)為是不安全的,因為它沒有強(qiáng)健的加密方法,除非在客戶端和服務(wù)器端都使用HTTPS或者其他密碼加密碼方式(比如,在一個虛擬私人網(wǎng)絡(luò)中)。若沒有額外的加密方法,網(wǎng)絡(luò)管理員將能夠截獲(或濫用)用戶的密碼。但是,如果你是剛開始使用Tomcat,或者你想在你的web應(yīng)用中測試一下基于容器的安全管理,Basic Authentication還是非常易于設(shè)置和使用的。只需要添加<security-constraint>和<login-config>兩個元素到你的web應(yīng)用的web.xml文件中,并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加適當(dāng)?shù)?lt;role>和<user>即可,然后重新啟動Tomcat。



          下面例子中的web.xml摘自一個俱樂部會員網(wǎng)站系統(tǒng),該系統(tǒng)中只有member目錄被保護(hù)起來,并使用Basic Authentication進(jìn)行身份驗證。請注意,這種方式將有效的代替Apache web服務(wù)器中的.htaccess文件。



          <!--

          Define the Members-only area, by defining

          a "Security Constraint" on this Application, and

          mapping it to the subdirectory (URL) that we want

          to restrict.

          -->

          <security-constraint>

          <web-resource-collection>

          <web-resource-name>

          Entire Application

          </web-resource-name>

          <url-pattern>/members/*</url-pattern>

          </web-resource-collection>

          <auth-constraint>

          <role-name>member</role-name>

          </auth-constraint>

          </security-constraint>

          <!-- Define the Login Configuration for this Application -->

          <login-config>

          <auth-method>BASIC</auth-method>

          <realm-name>My Club Members-only Area</realm-name>

          </login-config>



          6.配置單點登錄(Single Sign-On)

          一旦你設(shè)置了realm和驗證的方法,你就需要進(jìn)行實際的用戶登錄處理。一般說來,對用戶而言登錄系統(tǒng)是一件很麻煩的事情,你必須盡量減少用戶登錄驗證的次數(shù)。作為缺省的情況,當(dāng)用戶第一次請求受保護(hù)的資源時,每一個web應(yīng)用都會要求用戶登錄。如果你運行了多個web應(yīng)用,并且每個應(yīng)用都需要進(jìn)行單獨的用戶驗證,那這看起來就有點像你在與你的用戶搏斗。用戶們不知道怎樣才能把多個分離的應(yīng)用整合成一個單獨的系統(tǒng),所有他們也就不知道他們需要訪問多少個不同的應(yīng)用,只是很迷惑,為什么總要不停的登錄。



          Tomcat 4的“single sign-on”特性允許用戶在訪問同一虛擬主機(jī)下所有web應(yīng)用時,只需登錄一次。為了使用這個功能,你只需要在Host上添加一個SingleSignOn Valve元素即可,如下所示:



          <Valve className="org.apache.catalina.authenticator.SingleSignOn"

          debug="0"/>



          在Tomcat初始安裝后,server.xml的注釋里面包括SingleSignOn Valve配置的例子,你只需要去掉注釋,即可使用。那么,任何用戶只要登錄過一個應(yīng)用,則對于同一虛擬主機(jī)下的所有應(yīng)用同樣有效。



          使用single sign-on valve有一些重要的限制:

          1> value必須被配置和嵌套在相同的Host元素里,并且所有需要進(jìn)行單點驗證的web應(yīng)用(必須通過context元素定義)都位于該Host下。

          2> 包括共享用戶信息的realm必須被設(shè)置在同一級Host中或者嵌套之外。

          3> 不能被context中的realm覆蓋。

          4> 使用單點登錄的web應(yīng)用最好使用一個Tomcat的內(nèi)置的驗證方式(被定義在web.xml中的<auth-method>中),這比自定義的驗證方式強(qiáng),Tomcat內(nèi)置的的驗證方式包括basic、digest、form和client-cert。

          5> 如果你使用單點登錄,還希望集成一個第三方的web應(yīng)用到你的網(wǎng)站中來,并且這個新的web應(yīng)用使用它自己的驗證方式,而不使用容器管理安全,那你基本上就沒招了。你的用戶每次登錄原來所有應(yīng)用時需要登錄一次,并且在請求新的第三方應(yīng)用時還得再登錄一次。當(dāng)然,如果你擁有這個第三方web應(yīng)用的源碼,而你又是一個程序員,你可以修改它,但那恐怕也不容易做。

          6> 單點登錄需要使用cookies。



          7.配置用戶定制目錄(Customized User Directores)

          一些站點允許個別用戶在服務(wù)器上發(fā)布網(wǎng)頁。例如,一所大學(xué)的學(xué)院可能想給每一位學(xué)生一個公共區(qū)域,或者是一個ISP希望給一些web空間給他的客戶,但這又不是虛擬主機(jī)。在這種情況下,一個典型的方法就是在用戶名前面加一個特殊字符(~),作為每位用戶的網(wǎng)站,比如:



          http://www.cs.myuniversity.edu/~username

          http://members.mybigisp.com/~username



          Tomcat提供兩種方法在主機(jī)上映射這些個人網(wǎng)站,主要使用一對特殊的Listener元素。Listener的className屬性應(yīng)該是org.apache.catalina.startup.UserConfig,userClass屬性應(yīng)該是幾個映射類之一。如果你的系統(tǒng)是Unix,它將有一個標(biāo)準(zhǔn)的/etc/passwd文件,該文件中的帳號能夠被運行中的Tomcat很容易的讀取,該文件指定了用戶的主目錄,使用PasswdUserDatabase 映射類。



          <Listener className="org.apache.catalina.startup.UserConfig"

          directoryName="public_html"

          userClass="org.apache.catalina.startup.PasswdUserDatabase"/>



          web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一樣的目錄下面。當(dāng)然你也可以改變public_html 到其他任何子目錄下。



          實際上,這個用戶目錄根本不一定需要位于用戶主目錄下里面。如果你沒有一個密碼文件,但你又想把一個用戶名映射到公共的像/home一樣目錄的子目錄里面,則可以使用HomesUserDatabase類。



          <Listener className="org.apache.catalina.startup.UserConfig"

          directoryName="public_html" homeBase="/home"

          userClass="org.apache.catalina.startup.HomesUserDatabase"/>



          這樣一來,web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一樣的目錄下。這種形式對Windows而言更加有利,你可以使用一個像c:home這樣的目錄。



          這些Listener元素,如果出現(xiàn),則必須在Host元素里面,而不能在context元素里面,因為它們都用應(yīng)用于Host本身。





          8.在Tomcat中使用CGI腳本

          Tomcat主要是作為Servlet/JSP容器,但它也有許多傳統(tǒng)web服務(wù)器的性能。支持通用網(wǎng)關(guān)接口(Common Gateway Interface,即CGI)就是其中之一,CGI提供一組方法在響應(yīng)瀏覽器請求時運行一些擴(kuò)展程序。CGI之所以被稱為通用,是因為它能在大多數(shù)程序或腳本中被調(diào)用,包括:Perl,Python,awk,Unix shell scripting等,甚至包括Java。當(dāng)然,你大概不會把一個Java應(yīng)用程序當(dāng)作CGI來運行,畢竟這樣太過原始。一般而言,開發(fā)Servlet總要比CGI具有更好的效率,因為當(dāng)用戶點擊一個鏈接或一個按鈕時,你不需要從操作系統(tǒng)層開始進(jìn)行處理。



          Tomcat包括一個可選的CGI Servlet,允許你運行遺留下來的CGI腳本。



          為了使Tomcat能夠運行CGI,你必須做如下幾件事:

          1. 把servlets-cgi.renametojar (在CATALINA_HOME/server/lib/目錄下)改名為servlets-cgi.jar。處理CGI的servlet應(yīng)該位于Tomcat的CLASSPATH下。

          2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中,把關(guān)于<servlet-name> CGI的那段的注釋去掉(默認(rèn)情況下,該段位于第241行)。

          3. 同樣,在Tomcat的CATALINA_BASE/conf/web.xml文件中,把關(guān)于對CGI進(jìn)行映射的那段的注釋去掉(默認(rèn)情況下,該段位于第299行)。注意,這段內(nèi)容指定了HTML鏈接到CGI腳本的訪問方式。

          4. 你可以把CGI腳本放置在WEB-INF/cgi 目錄下(注意,WEB-INF是一個安全的地方,你可以把一些不想被用戶看見或基于安全考慮不想暴露的文件放在此處),或者你也可以把CGI腳本放置在context下的其他目錄下,并為CGI Servlet調(diào)整cgiPathPrefix初始化參數(shù)。這就指定的CGI Servlet的實際位置,且不能與上一步指定的URL重名。

          5. 重新啟動Tomcat,你的CGI就可以運行了。



          在Tomcat中,CGI程序缺省放置在WEB-INF/cgi目錄下,正如前面所提示的那樣,WEB-INF目錄受保護(hù)的,通過客戶端的瀏覽器無法窺探到其中內(nèi)容,所以對于放置含有密碼或其他敏感信息的CGI腳本而言,這是一個非常好的地方。為了兼容其他服務(wù)器,盡管你也可以把CGI腳本保存在傳統(tǒng)的/cgi-bin目錄,但要知道,在這些目錄中的文件有可能被網(wǎng)上好奇的沖浪者看到。另外,在Unix中,請確定運行Tomcat的用戶有執(zhí)行CGI腳本的權(quán)限。



          9.改變Tomcat中的JSP編譯器(JSP Compiler)

          在Tomcat 4.1(或更高版本,大概),JSP的編譯由包含在Tomcat里面的Ant程序控制器直接執(zhí)行。這聽起來有一點點奇怪,但這正是Ant有意為之的一部分,有一個API文檔指導(dǎo)開發(fā)者在沒有啟動一個新的JVM的情況下,使用Ant。這是使用Ant進(jìn)行Java開發(fā)的一大優(yōu)勢。另外,這也意味著你現(xiàn)在能夠在Ant中使用任何javac支持的編譯方式,這里有一個關(guān)于Apache Ant使用手冊的javac page列表。使用起來是容易的,因為你只需要在<init-param> 元素中定義一個名字叫“compiler”,并且在value中有一個支持編譯的編譯器名字,示例如下:



          <servlet>

          <servlet-name>jsp</servlet-name>

          <servlet-class>

          org.apache.jasper.servlet.JspServlet

          </servlet-class>

          <init-param>

          <param-name>logVerbosityLevel</param-name>

          <param-value>WARNING</param-value>

          </init-param>

          <init-param>

          <param-name>compiler</param-name>

          <param-value>jikes</param-value>

          </init-param>

          <load-on-startup>3</load-on-startup>

          </servlet>



          當(dāng)然,給出的編譯器必須已經(jīng)安裝在你的系統(tǒng)中,并且CLASSPATH可能需要設(shè)置,那處決于你選擇的是何種編譯器。



          10.限制特定主機(jī)訪問(Restricting Access to Specific Hosts)

          有時,你可能想限制對Tomcat web應(yīng)用的訪問,比如,你希望只有你指定的主機(jī)或IP地址可以訪問你的應(yīng)用。這樣一來,就只有那些指定的的客戶端可以訪問服務(wù)的內(nèi)容了。為了實現(xiàn)這種效果,Tomcat提供了兩個參數(shù)供你配置:RemoteHostValve 和RemoteAddrValve。



          通過配置這兩個參數(shù),可以讓你過濾來自請求的主機(jī)或IP地址,并允許或拒絕哪些主機(jī)/IP。與之類似的,在Apache的httpd文件里有對每個目錄的允許/拒絕指定。

          例如你可以把Admin Web application設(shè)置成只允許本地訪問,設(shè)置如下:



          <Context path="/path/to/secret_files" ...>

          <Valve className="org.apache.catalina.valves.RemoteAddrValve"

          allow="127.0.0.1" deny=""/>

          </Context>



          如果沒有給出允許主機(jī)的指定,那么與拒絕主機(jī)匹配的主機(jī)就會被拒絕,除此之外的都是允許的。與之類似,如果沒有給出拒絕主機(jī)的指定,那么與允許主機(jī)匹配的主機(jī)就會被允許,除此之外的都是拒絕的。



          --------------------------------------



          作者簡介:

          Jason Brittain是CollabNet公司的一名資深軟件工程師,主要負(fù)責(zé)軟件底層架構(gòu)的開發(fā)。他已經(jīng)為Apache Jakarta項目做了很多貢獻(xiàn),多年以來,他一直是一名積極的開源軟件開發(fā)者。



          Ian F. Darwin已經(jīng)在計算機(jī)行業(yè)工作了30年:從1980年開始使用Unix,從1995年開始使用Java,從1998年開始使用OpenBSD。他是兩本Oreilly圖書的作者:Checking C Programs with lint 和 Java Cookbook,還與Jason Brittain合著了Tomcat: The Definitive Guide。



          譯者簡介:

          陳光(Holen Chen),J2EE項目經(jīng)理,熟悉知識管理及電子政務(wù),致力于Apache Jakarta項目在國廣的推廣及深層次應(yīng)用,可通過 holen@263.net與作者聯(lián)系。

          posted on 2006-05-15 10:00 javaGrowing 閱讀(278) 評論(0)  編輯  收藏 所屬分類: tomcat
          主站蜘蛛池模板: 教育| 洞口县| 手机| 廉江市| 上栗县| 平顺县| 太白县| 本溪市| 铅山县| 汶上县| 巴南区| 柳林县| 论坛| 温宿县| 澄城县| 凭祥市| 称多县| 昌江| 北碚区| 霍山县| 怀化市| 四子王旗| 柘城县| 连云港市| 高清| 长沙县| 宝鸡市| 阿拉善右旗| 昭觉县| 集贤县| 尖扎县| 郯城县| 游戏| 丽水市| 临沭县| 天柱县| 贡觉县| 津南区| 庆安县| 洛宁县| 瑞昌市|