隨著java的流行,其在web上的應用也越來越廣,tomcat作為一個開源的servlet容器,應用前景越來越廣,本文將向你講述tomcat的一些知識。 ?
一:簡介 ?
tomcat是jakarta項目中的一個重要的子項目,其被JavaWorld雜志的編輯選為2001年度最具創新的java產品(Most Innovative Java Product),同時它又是sun公司官方推薦的servlet和jsp容器(具體可以見http://java.sun.com/products/jsp/tomcat/),因此其越來越多的受到軟件公司和開發人員的喜愛。servlet和jsp的最新規范都可以在tomcat的新版本中得到實現。 ?
二:安裝及配置 ?
tomcat最新版本為4.0.1,這個版本用了一個新的servlet容器Catalina,完整的實現了servlet2.3和jsp1.2規范。注意安裝之前你的系統必須安裝了jdk1.2以上版本。 ?
(一):安裝 ?
1:windows平臺 ?
從tomcat網站下載jakarta-tomcat-4.0.1.exe,按照一般的windows程序安裝步驟即可安裝好tomcat,安裝時它會自動尋找你的jdk和jre的位置。 ?
2:linux平臺 ?
下載jakarta-tomcat-4.0.1.tar.gz,將其解壓到一個目錄。 ?
(二):配置 ?
運行tomcat需要設置JAVA_HOME變量 ?
set JAVA_HOME=c:/jdk (win98,在msdos方式下使用,或者放入autoexec.bat中) ?
export JAVA_HOME=/usr/local/jdk (linux下使用,放到/etc/bashrc或者/etc/profile中) ?
(三):運行 ?
設置完畢后就可以運行tomcat服務器了,進入tomcat的bin目錄,win98下用startup啟動tomcat,linux下用startup.sh,相應的關閉tomcat的命令為shutdown和shutdown.sh。 ?
啟動后可以在瀏覽器中輸入http://localhost:8080/測試,由于tomcat本身具有web服務器的功能,因此我們不必安裝apache,當然其也可以與apache集成到一起,下面會介紹。 ?
下面你可以測試其自帶的jsp和servlet示例。 ?
三:應用 ?
(一):目錄結構 ?
tomcat的目錄結構如下: 目錄名 簡介 ?
bin 存放啟動和關閉tomcat腳本 ?
conf 包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml ?
work 存放jsp編譯后產生的class文件 ?
webapp 存放應用程序示例,以后你要部署的應用程序也要放到此目錄 ?
logs 存放日志文件 ?
lib/japser/common 這三個目錄主要存放tomcat所需的jar文件 ?
(二):server.xml配置簡介 ?
下面我們將講述這個文件中的基本配置信息,更具體的配置信息見tomcat的文檔 元素名 屬性 解釋 ?
server port 指定一個端口,這個端口負責監聽關閉tomcat的請求 ?
shutdown 指定向端口發送的命令字符串 ?
service name 指定service的名字 ?
Connector ?
(表示客戶端和service之間的連接) port 指定服務器端要創建的端口號,并在這個斷口監聽來自客戶端的請求 ?
minProcessors 服務器啟動時創建的處理請求的線程數 ?
maxProcessors 最大可以創建的處理請求的線程數 ?
enableLookups 如果為true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址 ?
redirectPort 指定服務器正在處理http請求時收到了一個SSL傳輸請求后重定向的端口號 ?
acceptCount 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理 ?
connectionTimeout 指定超時的時間數(以毫秒為單位) ?
Engine ?
(表示指定service中的請求處理機,接收和處理來自Connector的請求) defaultHost 指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的 ?
Context ?
(表示一個web應用程序,通常為WAR文件,關于WAR的具體信息見servlet規范) docBase 應用程序的路徑或者是WAR文件存放的路徑 ?
path 表示此web應用程序的url的前綴,這樣請求的url為http://localhost:8080/path/**** ?
reloadable 這個屬性非常重要,如果為true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,我們可以在不重起tomcat的情況下改變應用程序 ?
host ?
(表示一個虛擬主機) ?
name 指定主機名 ?
appBase 應用程序基本目錄,即存放應用程序的目錄 ?
unpackWARs 如果為true,則tomcat會自動將WAR文件解壓,否則不解壓,直接從WAR文件中運行應用程序 ?
Logger ?
(表示日志,調試和錯誤信息) ?
className 指定logger使用的類名,此類必須實現org.apache.catalina.Logger 接口 ?
prefix 指定log文件的前綴 ?
suffix 指定log文件的后綴 ?
timestamp 如果為true,則log文件名中要加入時間,如下例:localhost_log.2001-10-04.txt ?
Realm ?
(表示存放用戶名,密碼及role的數據庫) ?
className 指定Realm使用的類名,此類必須實現org.apache.catalina.Realm接口 ?
Valve ?
(功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣) ?
className 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程序的訪問信息 ?
directory 指定log文件存放的位置 ?
pattern 有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應代碼,發送的字節數。combined方式比common方式記錄的值更多 ?
注意:1:經過我測試,我設置Context 的path="",reloadable=true,然后放一個WAR文件到webapps目錄,結果tomcat不能檢測出此文件(重起tomcat可以),而把此文件解壓,則tomcat會自動檢測出這個新的應用程序。如果不能自動檢測WAR文件,我們可以利用下面管理中講的方法來部署應用程序。 ?
2:默認的server.xml中,Realm元素只設置了一個className屬性,但此文件中也包含幾個通過JDBC連接到數據庫進行驗證的示例(被注釋掉了),通過Realm元素我們可以實現容器安全管理(Container Managed Security)。 ?
3:還有一些元素我們沒有介紹,如Parameter,loader,你可以通過tomcat的文檔獲取這些元素的信息。 ?
(三):管理 ?
1:配置 ?
在進行具體的管理之前,我們先給tomcat添加一個用戶,使這個用戶有權限來進行管理。 ?
打開conf目錄下的tomcat-users.xml文件,在相應的位置添加下面一行: ?
<user name="zf" password="zf" roles="standard,manager"/> ?
注意:這一行的最后部分一定是/>,tomcat的文檔掉了/符號,如果沒有/符號的話,tomcat重起時將無法訪問應用程序。通過logs/catalina.out文件你可以看到這個錯誤的詳細信息。 ?
然后重起tomcat,在瀏覽器中輸入http://localhost:8080/manager/,會彈出對話框,輸入上面的用戶名和密碼即可。 ?
2:應用程序列表 ?
在瀏覽器中輸入http://localhost:8080/manager/list,瀏覽器將會顯示如下的信息: ?
OK - Listed applications for virtual host localhost ?
/ex:running:1 ?
/examples:running:1 ?
/webdav:running:0 ?
/tomcat-docs:running:0 ?
/manager:running:0 ?
/:running:0 ?
面的信息分別為應用程序的路徑,當前狀態(running 或者stopped),與這個程序相連的session數。 ?
3:重新裝載應用程序 ?
在瀏覽器中輸入
http://localhost:8080/manager/reload?path=/examples,瀏覽器顯示如下: ?
OK - Reloaded application at context path /examples ?
表示example應用程序裝載成功,如果我們將server.xml的Context元素的reloadable屬性設為true(見上面表格),則沒必要利用這種方式重新裝載應用程序,因為tomcat會自動裝載。 ?
4:顯示session信息 ?
在瀏覽器中輸入http://localhost:8080/manager/sessions?path=/examples,瀏覽器顯示如下: OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes ?
1111111111111
第一步:下載j2sdk和tomcat:到sun官方站點(http://java.sun.com/j2se/1.4.2/download.html)下載j2sdk,注意下載版本為Windows Offline Installation的SDK,同時最好下載J2SE 1.4.2 Documentation,然后到tomcat官方站點(http://www.apache.org/dist/jakarta/tomcat-4/)下載tomcat(下載最新4.1.x版本的tomcat); ?
第二步:安裝和配置你的j2sdk和tomcat:執行j2sdk和tomcat的安裝程序,然后按默認設置進行安裝即可。 ?
1.安裝j2sdk以后,需要配置一下環境變量,在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量(假定你的j2sdk安裝在c:\j2sdk1.4.2): ?
JAVA_HOME=c:\j2sdk1.4.2 ?
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因為它代表當前路徑) ?
path=%JAVA_HOME%\bin ?
接著可以寫一個簡單的java程序來測試J2SDK是否已安裝成功: ?
public class Test{ ?
public static void main(String args[]){ ?
System.out.println("This is a test program."); ?
} ?
} ?
將上面的這段程序保存為文件名為Test.java的文件。 ?
然后打開命令提示符窗口,cd到你的Test.java所在目錄,然后鍵入下面的命令 ?
javac Test.java ?
java Test ?
此時如果看到打印出來This is a test program.的話說明安裝成功了,如果沒有打印出這句話,你需要仔細檢查一下你的配置情況。 ?
2.安裝Tomcat后,在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量(假定你的tomcat安裝在c:\tomcat): ?
CATALINA_HOME=c:\tomcat; ?
CATALINA_BASE=c:\tomcat; ?
然后修改環境變量中的classpath,把tomat安裝目錄下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下: ?
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar; ?
接著可以啟動tomcat,在IE中訪問http://localhost:8080 ?
如果看到tomcat的歡迎頁面的話說明安裝成功了。
第三步:建立自己的jsp app目錄 ?
1.到Tomcat的安裝目錄的webapps目錄,可以看到ROOT,examples, tomcat-docs之類Tomcat自帶的的目錄; ?
2.在webapps目錄下新建一個目錄,起名叫myapp; ?
3.myapp下新建一個目錄WEB-INF,注意,目錄名稱是區分大小寫的; ?
4.WEB-INF下新建一個文件web.xml,內容如下: ?
<?xml version="1.0" encoding="ISO-8859-1"?> ?
<!DOCTYPE web-app ?
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" ?
"
http://java.sun.com/dtd/web-app_2_3.dtd"> ?
<web-app> ?
<display-name>My Web Application</display-name> ?
<description> ?
A application for test. ?
</description> ?
</web-app> ?
5.在myapp下新建一個測試的jsp頁面,文件名為index.jsp,文件內容如下: ?
<html><body><center> ?
Now time is: <%=new java.util.Date()%> ?
</center></body></html> ?
6.重啟Tomcat ?
7.打開瀏覽器,輸入http://localhost:8080/myapp/index.jsp 看到當前時間的話說明就成功了。 ?
第四步:建立自己的Servlet: ?
1.用你最熟悉的編輯器(建議使用有語法檢查的java ide)新建一個servlet程序,文件名為Test.java,文件內容如下: ?
package test; ?
import java.io.IOException; ?
import java.io.PrintWriter; ?
import javax.servlet.ServletException; ?
import javax.servlet.http.HttpServlet; ?
import javax.servlet.http.HttpServletRequest; ?
import javax.servlet.http.HttpServletResponse; ?
public class Test extends HttpServlet { ?
protected void doGet(HttpServletRequest request, HttpServletResponse response) ?
throws ServletException, IOException { ?
PrintWriter out=response.getWriter(); ?
out.println("<html><body><h1>This is a servlet test.</h1></body></html>"); ?
out.flush(); ?
} ?
} ?
2 .編譯 ?
將Test.java放在c:\test下,使用如下命令編譯: ?
C:\Test>javac Test.java ?
然后在c:\Test下會產生一個編譯后的servlet文件:Test.class ?
3 .將結構test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那個test目錄到classes目錄下,如果classes目錄不存在,就新建一個。 現在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目錄結構 ?
4 .修改webapps\myapp\WEB-INF\web.xml,添加servlet和servlet-mapping ?
編輯后的web.xml如下所示,紅色為添加的內容: ?
<?xml version="1.0" encoding="ISO-8859-1"?> ?
<!DOCTYPE web-app ?
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" ?
"
http://java.sun.com/dtd/web-app_2_3.dtd"> ?
<display-name>My Web Application</display-name> ?
<description> ?
A application for test. ?
</description> ?
<servlet> ?
<servlet-name>Test</servlet-name> ?
<display-name>Test</display-name> ?
<description>A test Servlet</description> ?
<servlet-class>test.Test</servlet-class> ?
</servlet> ?
<servlet-mapping> ?
<servlet-name>Test</servlet-name> ?
<url-pattern>/Test</url-pattern> ?
</servlet-mapping> ?
</web-app> ?
這段話中的servlet這一段聲明了你要調用的Servlet,而servlet-mapping則是將聲明的servlet“映射”到地址/Test上 ?
5 .好了,啟動Tomcat,啟動瀏覽器,輸入http://localhost:8080/myapp/Test 如果看到輸出This is a servlet test.就說明編寫的servlet成功了。 ?
注意:修改了web.xml以及新加了class,都要重啟Tomcat ?
第四步:建立自己的Bean: ?
1.用你最熟悉的編輯器(建議使用有語法檢查的java ide)新建一個java程序,文件名為TestBean.java,文件內容如下: ?
package test; ?
public class TestBean{ ?
private String name = null; ?
public TestBean(String strName_p){ ?
this.name=strName_p; ?
} ?
public void setName(String strName_p){ ?
this.name=strName_p; ?
} ?
public String getName(){ ?
return this.name; ?
} ?
} ?
2 .編譯 ?
將TestBean.java放在c:\test下,使用如下命令編譯: ?
C:\Test>javac TestBean.java ?
然后在c:\Test下會產生一個編譯后的bean文件:TestBean.class ?
3 .將TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下, ?
4 .新建一個TestBean.jsp文件,文件內容為: ?
<%@ page import="test.TestBean" %> ?
<html><body><center> ?
<% ?
TestBean testBean=new TestBean("This is a test java bean."); ?
%> ?
Java bean name is: <%=testBean.getName()%> ?
</center></body></html> ?
5 .好了,重啟Tomcat,啟動瀏覽器,輸入http://localhost:8080/myapp/TestBean.jsp 如果看到輸出Java bean name is: This is a test java bean.就說明編寫的Bean成功了。 ?
這樣就完成了整個Tomcat下的jsp、servlet和javabean的配置。接下來需要做的事情就是多看書、多讀別人的好代碼,自己多動手寫代碼以增強自己在這方面開發的能力了。 ?
////////////////////
JSP中tomcat的SQL Server2000數據庫連接池的配置
環境:
1. 數據庫:Microsoft SQL Server 2000
2. 數據庫驅動程序:net.sourceforge.jtds.jdbc.Driver
JNDI(Java Naming and Directory Interface)概述:
Tomcat4(5)提供了一個與Java Enterprise Edition應用服務相兼容的JNDI--InitialContext實現實例。它的初始數據設置在$CATALINA_HOME/conf/server.xml文件里,并可能在網頁應用環境描述(/WEB-INF/web.xml)里被下列元素引用:
1) <env-entry>--環境入口,設置應用程序如何操作。
2) <resource-ref>--資源參數,一般是數據庫驅動程序、JavaMail Session、自定義類工廠等。
3) <resource-env-ref>--在Servlet 2.4里用來簡化設置不需認證信息的資源資源如環境參數、resource-ref變量。
InitialContext在網頁應用程序初始化時被設置,用來支持網頁應用程序組件。所有的入口和資源都放在JNDI命名空間里的java:comp/env段里。點擊下列網址以獲取更多信息:
1) Java命名和目錄接口(Java Naming and Directory Interface)
2) J2EE平臺說明(J2EE Platform Specification)
設置JNDI資源
設置JNDI資源要在$CATALINA_HOME/conf/server.xml文件里使用下列標志符:
1) <Environment>--設置域個可變的JNDI InitialContext入口的名字和值(同上面說的<env-entry>等價)。
2) <Resource>--設置應用程序可用的資源的名字和類型(同上面說的<resource-ref>等價)。
3) <ResourceParams>--設置Java資源類工廠的名稱或將用的JavaBean屬性。
4) <ResourceLink>--給全局JNDI環境(JNDI Context)添加一個鏈接。
上述這些標志符必須放在<Context>和</Context>之間(針對專門的網頁應用程序)或<DefaultContext>和</DefaultContext>之間。
此外,設在網頁應用環境描述(Web Application Descriptor)(/WEB-INF/web.xml)里的名字和值也在初始環境(Initial Context)里被設置,當被<Environemt>元素值允許時將被重設初始值。
全局變量能在<Server>子元素的<GlobalNamingResources>里設置。
數據庫連接池概述:
數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現得尤為突出。對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標。數據庫連接池正是針對這個問題提出來的。
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而再不是重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺漏。這項技術能明顯提高對數據庫操作的性能。
數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。數據庫連接池的最小連接數和最大連接數的設置要考慮到下列幾個因素:
1) 最小連接數是連接池一直保持的數據庫連接,所以如果應用程序對數據庫連接的使用量不大,將會有大量的數據庫連接資源被浪費;
2) 最大連接數是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求將被加入到等待隊列中,這會影響之后的數據庫操作。
3) 如果最小連接數與最大連接數相差太大,那么最先的連接請求將會獲利,之后超過最小連接數量的連接請求等價于建立一個新的數據庫連接。不過,這些大于最小連接數的數據庫連接在使用完不會馬上被釋放,它將被放到連接池中等待重復使用或是空閑超時后被釋放。
配置Tomcat數據庫連接池的前提:
1. 必須裝有Java運行環境;
2. 必須有SQL Server2000數據庫服務器(可以不在本地);
3. 必須有jtds.jar,并將它放在$CATALINA_HOME/common/lib目錄下(只能是這里)。使用它是因為Microsoft公司的Java SQL Server驅動程序不支持二次查詢,可到網上搜到。目前使用的是jtds-0.6.jar。
在$CATALINA_HOME/conf/server.xml里設置數據庫連接池:
下面是配置的代碼,必須放在<Host>和</Host>之間。
<Context path="/quality" docBase="quality" debug="0" reloadable="true" crossContext="true"><Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_quality_log." suffix=".txt" timestamp="true"/><Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/><ResourceParams name="jdbc/connectDB"> <parameter> ?<name>maxActive</name> ?<!-- Maximum number of DB connections in pool.Set to 0 for no limit. --> ?<value>100</value> </parameter> <parameter> ?<name>maxIdle</name> ?<!-- Maximum number of idle DB connections to retain in pool.Set to 0 for no limit. --> ?<value>30</value> </parameter> <parameter> ?<name>maxWait</name> ?<!-- Maximum time to wait for a DB connection to become available in ms.An exception is thrown if this timeout is exceeded.Set to -1 to wait indefinitely. --> ?<value>10000</value> </parameter> <parameter> ?<name>removeAbandoned</name> ?<!-- Abandoned DB connections are removed and recycled --> ?<value>true</value> </parameter> <parameter> ?<name>removeAbandonedTimeout</name> ?<!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned. ?--> ?<value>60</value> </parameter> <parameter> ?<name>logAbandoned</name> ?<!-- Log a stack trace of the code which abandoned --> ?<value>false</value> </parameter> <parameter> ?<name>factory</name> ?<!-DBCP Basic Datasource Factory --> ?<value>org.apache.commons.dbcp.BasicDataSourceFactory</value> </parameter> <parameter> ?<name>username</name> ?<!-- Database User Name --> ?<value>Iorishinier</value> </parameter> <parameter> ?<name>password</name> ?<!-- User Password --> ?<value>mypasswd</value> </parameter> <parameter> ?<name>driverClassName</name> ?<!-- Database Driver Class Name --> ?<value>net.sourceforge.jtds.jdbc.Driver</value> </parameter> <parameter> ?<name>url</name> ?<!-- Database Address --> ?<value>jdbc:jtds:sqlserver://127.127.127.127:1433/Northwind</value> </parameter></ResourceParams></Context>
下面是一些參數的說明:
<Context path="/quality" docBase="quality" debug="0" reloadable="true" crossContext="true">
其中:
1) path 指定路徑,這里設定的是$CATALINA_HOME/webapps下的quality目錄;
2) docBase 文件根目錄。
3) reloader 當網頁被更新時是否重新編譯。
4) maxActive 連接池的最大數據庫連接數。設為0表示無限制。
5) maxIdle 數據庫連接的最大空閑時間。超過此空閑時間,數據庫連接將被標記為不可用,然后被釋放。設為0表示無限制。
6) maxWait 最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制。
7) removeAbandoned 回收被遺棄的(一般是忘了釋放的)數據庫連接到連接池中。

removeAbandonedTimeout 數據庫連接過多長時間不用將被視為被遺棄而收回連接池中。
9) logAbandoned 將被遺棄的數據庫連接的回收記入日志。
10) driverClassName JDBC驅動程序。
11) url 數據庫連接字符串
在$CATALINA_HOME/webapps/quality/WEB-INF/web.xml里設置被引用的資源:
下面是配置代碼,必須放在<web-app>和</web-app>里。
<!-- Database Config start --><resource-ref><description>connectDB test</description><res-ref-name>jdbc/connectDB</res-ref-name><res-type>javax.sql.DataSource</res-type><res-auth>Container</res-auth></resource-ref><!-- Database Config end -->
下面是一下參數的必要說明:
1) description 對被引用的資源的描述。
2) res-ref-name 資源名稱。見上面的<ResourceParams name="jdbc/connectDB">
3) res-type 資源類型。見上面的<Resource name="jdbc/connectDB" auth="Container" type="javax.sql.DataSource"/>
在JSP中使用資源:
這是在$CATALINA_HOME/webapps/quality下的某級子目錄里的jsp網頁文件部分代碼:
<%@ page contentType="text/html;charset=GBK"%><%@ page errorPage="error.jsp"%><%@ page import="javax.naming.*"%><%@ page import="javax.sql.*"%><%@ page import="java.sql.*"%><html> <head> </head> <body> ?<% ? ……………… ? ……………… ? // 數據庫操作 ? Context ctx=null; ? Connection cnn=null; ? Statement stmt=null; ? ResultSet rs=null; ? try ? { ? ?ctx=new InitialContext(); ? ?if(ctx==null) ? ? throw new Exception("沒有匹配的環境"); ? ?DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB"); ? ?if(ds==null) ? ? throw new Exception("沒有匹配數據庫"); ? ? ? ?cnn=ds.getConnection(); ? ?stmt=cnn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); ? ?rs=stmt.executeQuery("select * from table1"); ? ?……………… ? ?……………… ? } ? finally ? { ? ?if(rs!=null) ? ? rs.close(); ? ?if(stmt!=null) ? ? stmt.close(); ? ?if(cnn!=null) ? ? cnn.close(); ? ?if(ctx!=null) ? ? ctx.close(); ? } ? ?%> </body></html>
代碼說明:
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/connectDB");
上面這句應用了剛才設的資源。
資源使用完要釋放,尤其是Context資源,見try-catch-finally部分的finally代碼段,這是一種好的習慣。資源釋放時如果釋放了上級資源,下級資源將先被釋放。如:釋放了ctx,那么資源釋放順序將是rs,stmt,cnn,ctx。換句話說,如果釋放了ctx,那么rs,stmt和cnn都將不可用了。
這里的釋放資源只是將數據庫連接返回連接池中,并不是把資源真正釋放掉,見數據庫連接池概述。
/////
Tomcat下JSP、Servlet和JavaBean環境的配置 ?
經常看到jsp的初學者問tomcat下如何配置jsp、servlet和bean的問題,于是總結了一下如何tomcat下配置jsp、servlet和ben,希望對那些初學者有所幫助。 ?
一、開發環境配置 ?
第一步:下載j2sdk和tomcat:到sun官方站點(http://java.sun.com/j2se/1.4.2/download.html)下載j2sdk,注意下載版本為Windows Offline Installation的SDK,同時最好下載J2SE 1.4.2 Documentation,然后到tomcat官方站點(http://www.apache.org/dist/jakarta/tomcat-4/)下載tomcat(下載最新4.1.x版本的tomcat); ?
第二步:安裝和配置你的j2sdk和tomcat:執行j2sdk和tomcat的安裝程序,然后按默認設置進行安裝即可。 ?
1.安裝j2sdk以后,需要配置一下環境變量,在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量(假定你的j2sdk安裝在c:\j2sdk1.4.2): ?
JAVA_HOME=c:\j2sdk1.4.2 ?
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因為它代表當前路徑) ?
path=%JAVA_HOME%\bin ?
接著可以寫一個簡單的java程序來測試J2SDK是否已安裝成功: ?
public class Test{ ?
public static void main(String args[]){ ?
System.out.println("This is a test program."); ?
} ?
} ?
將上面的這段程序保存為文件名為Test.java的文件。 ?
然后打開命令提示符窗口,cd到你的Test.java所在目錄,然后鍵入下面的命令 ?
javac Test.java ?
java Test ?
此時如果看到打印出來This is a test program.的話說明安裝成功了,如果沒有打印出這句話,你需要仔細檢查一下你的配置情況。 ?
2.安裝Tomcat后,在我的電腦->屬性->高級->環境變量->系統變量中添加以下環境變量(假定你的tomcat安裝在c:\tomcat): ?
CATALINA_HOME=c:\tomcat ?
CATALINA_BASE=c:\tomcat ?
然后修改環境變量中的classpath,把tomat安裝目錄下的common\lib下的(可以根據實際追加)servlet.jar追加到classpath中去,修改后的classpath如下: ?
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar; ?
接著可以啟動tomcat,在IE中訪問http://localhost:8080,如果看到tomcat的歡迎頁面的話說明安裝成功了。 ?
第三步:建立自己的jsp app目錄 ?
1.到Tomcat的安裝目錄的webapps目錄,可以看到ROOT,examples, tomcat-docs之類Tomcat自帶的的目錄; ?
2.在webapps目錄下新建一個目錄,起名叫myapp; ?
3.myapp下新建一個目錄WEB-INF,注意,目錄名稱是區分大小寫的; ?
4.WEB-INF下新建一個文件web.xml,內容如下: ?
<?xml version="1.0" encoding="ISO-8859-1"?> ?
<!DOCTYPE web-app ?
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" ?
"
http://java.sun.com/dtd/web-app_2_3.dtd"> ?
<web-app> ?
<display-name>My Web Application</display-name> ?
<description> ?
A application for test. ?
</description> ?
</web-app> ?
5.在myapp下新建一個測試的jsp頁面,文件名為index.jsp,文件內容如下: ?
<html><body><center> ?
Now time is: <%=new java.util.Date()%> ?
</center></body></html> ?
6.重啟Tomcat ?
7.打開瀏覽器,輸http://localhost:8080/myapp/index.jsp看到當前時間的話說明就成功了。 ?
第四步:建立自己的Servlet: ?
1.用你最熟悉的編輯器(建議使用有語法檢查的java ide)新建一個servlet程序,文件名為Test.java,文件內容如下: ?
package test; ?
import java.io.IOException; ?
import java.io.PrintWriter; ?
import javax.servlet.ServletException; ?
import javax.servlet.http.HttpServlet; ?
import javax.servlet.http.HttpServletRequest; ?
import javax.servlet.http.HttpServletResponse; ?
public class Test extends HttpServlet { ?
protected void doGet(HttpServletRequest request, HttpServletResponse response) ?
throws ServletException, IOException { ?
PrintWriter out=response.getWriter(); ?
out.println("<html><body><h1>This is a servlet test.</h1></body></html>"); ?
out.flush(); ?
} ?
} ?
2 .編譯 ?
將Test.java放在c:\test下,使用如下命令編譯: ?
C:\Test>javac Test.java ?
然后在c:\Test下會產生一個編譯后的servlet文件:Test.class ?
3 .將結構test\Test.class剪切到%CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那個test目錄到classes目錄下,如果classes目錄不存在,就新建一個。 現在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目錄結構 ?
4 .修改webapps\myapp\WEB-INF\web.xml,添加servlet和servlet-mapping ?
編輯后的web.xml如下所示,紅色為添加的內容: ?
<?xml version="1.0" encoding="ISO-8859-1"?> ?
<!DOCTYPE web-app ?
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" ?
"
http://java.sun.com/dtd/web-app_2_3.dtd"> ?
<web-app> ?
<display-name>My Web Application</display-name> ?
<description> ?
A application for test. ?
</description> ?
<servlet> ?
<servlet-name>Test</servlet-name> ?
<display-name>Test</display-name> ?
<description>A test Servlet</description> ?
<servlet-class>test.Test</servlet-class> ?
</servlet> ?
<servlet-mapping> ?
<servlet-name>Test</servlet-name> ?
<url-pattern>/Test</url-pattern> ?
</servlet-mapping> ?
</web-app> ?
這段話中的servlet這一段聲明了你要調用的Servlet,而servlet-mapping則是將聲明的servlet"映射"到地址/Test上 ?
5 .好了,重啟動Tomcat,啟動瀏覽器,輸http://localhost:8080/myapp/Test如果看到輸出This is a servlet test.就說明編寫的servlet成功了。 ?
注意:修改了web.xml以及新加了class,都要重啟Tomcat ?
第四步:建立自己的Bean: ?
1.用你最熟悉的編輯器(建議使用有語法檢查的java ide)新建一個java程序,文件名為TestBean.java,文件內容如下: ?
package test; ?
public class TestBean{ ?
private String name = null; ?
public TestBean(String strName_p){ ?
this.name=strName_p; ?
} ?
public void setName(String strName_p){ ?
this.name=strName_p; ?
} ?
public String getName(){ ?
return this.name; ?
} ?
} ?
2 .編譯 ?
將TestBean.java放在c:\test下,使用如下命令編譯: ?
C:\Test>javac TestBean.java ?
然后在c:\Test下會產生一個編譯后的bean文件:TestBean.class ?
3 .將TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下, ?
4 .新建一個TestBean.jsp文件,文件內容為: ?
<%@ page import="test.TestBean" %> ?
<html><body><center> ?
<% ?
TestBean testBean=new TestBean("This is a test java bean."); ?
%> ?
Java bean name is: <%=testBean.getName()%> ?
</center></body></html> ?
5 .好了,重啟Tomcat,啟動瀏覽器,輸http://localhost:8080/myapp/TestBean.jsp如果看到輸出Java bean name is: This is a test java bean.就說明編寫的Bean成功了。 ?
這樣就完成了整個Tomcat下的jsp、servlet和javabean的配置。接下來需要做的事情就是多看書、多讀別人的好代碼,自己多動手寫代碼以增強自己在這方面開發的能力了。 ?
jvm應填寫到 ?
c:\j2sdk\bin ?
給你一個簡單的配置:::: ?
JSP環境配置心得 ?
首先要說的是,使用jdk+tomcat完全可以配置我們的jsp服務器,不再需要其實任何東東,有很多文章介紹了Apache,其實根本用不著,一般的學習調試tomcat完全可以勝任了。 ?
安裝jdk后,tomcat在安裝之前會自動找到jdk的安裝路徑,一路點擊"下一步",經過一段時間的文件復制,最后"close",完成comcat的安裝。 ?
您最好去下載一個版本較高的tomcat,比如4.1以上的,因為它不需要設置太多的系統變量,右擊"我的電腦",選擇"屬性"->"高級"->"環境變量"->"系統變量",新建一個TOMCAT_HOME,值設置成你的tomcat所在的路徑,比如:D:\Program Files\Apache Group\Tomcat 4.1,配置完成。 ?
從開始菜單中找到tomcat選項,一般打開順序是:開始->程序->Apache Tomcat 4.1,選擇"Start Tomcat",讓jsp服務器開始運行,此時會打開一個類似Dos的窗口,會顯示一些相關的信息。 ?
如果您使用代理上網,一定要先撤掉代理,不然您的jsp程序永遠也得不到執行。如果不是代理的,這一步就跳過了。 ?
打開瀏覽器,在地址欄中輸入:http://localhost:8080,如果看到有老虎(我也不知道是老虎還是貓)的畫面,恭喜您,您成功了一半。 ?
先來享受一下成功的喜悅吧,請輸入下面的代碼: ?
<html> ?
<head> ?
<title>First Page</title> ?
</head> ?
<body> ?
<H3>Today is: h ?
<%= new java.util.Date() %> ?
</H3> ?
</body> ?
</html> ?
將該程序保存為:First.jsp,放到Tomcat的ROOT目錄下,然后在瀏覽器的地址欄中輸入:http://localhost:8080/First.jsp,(First.jsp跟我們保存的文件名的大小寫要一致)回車,如果不出意外,應該可以看到形如Today is: h Fri Apr 11 08:32:38 CST 2003 的結果。 ?
注意:ROOT是tomcat的默認虛擬目錄,如果要改成自己的虛擬目錄怎么辦呢?請繼續往下看吧。 ?
要改成自己的虛擬目錄,就要請出server.xml來了,該文件是一個配置文件,在Tomcat\conf目錄下,使用任何文本編輯軟件都能打開它,我們先找到下面一句: ?
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" ?
port="8080" minProcessors="5" maxProcessors="75" ?
enableLookups="true" redirectPort="8443" ?
acceptCount="100" debug="0" connectionTimeout="20000" ?
useURIValidationHack="false" disableUploadTimeout="true" /> ?
這里的port="8080"就是端口,我們完全可以用別的端口來代替,但不能是被系統占用的端口(0--1023),這里簡單提一下。 ?
下面我們再往下找,會發現以下的語句: ?
</Context> ?
</Host> ?
我們就應該找到這兩個語句,如果不懂E文,您就認定這兩個語句好了。然后我們將該語句更改如下: ?
</Context> ?
<Context path="/myjsp" debug="0" docBase="e:/myjsp" reloadable="true"> ?
</Context> ?
</Host> ?
這里的path="/myjsp"就是我們就配置的虛擬目錄了,以后在地址欄中輸入http://localhost:8080/myjsp即可。而docBase="e:/myjsp" 則是機器本地路徑,他們通過這個語句形成一個映射關系,其它照抄。 ?
將上面的First.jsp文件放到e:/myjsp目錄下,輸入http://localhost:8080/myjsp/First.jsp,是不是有一種喜上眉梢的感覺? ?
在論壇里我見得最多的就是很多人不知道javaBean文件放到哪里,老實說開始我也不知道,更令人不解的是,十個人有九種不同的說法,這更讓我們茫然。其實這問題也不是我們想像的那么復雜,我們以一個例子說明: ?
先建立一個java程序,代碼如下: ?
package hall; ?
public class SimpleBean { ?
private String message = "No message specified"; ?
public String getMessage() { ?
return(message); ?
} ?
public void setMessage(String message) { ?
this.message = message; ?
} ?
} ?
保存為SimpleBean.java,編譯后會生成一個包,其實就相當于一個目錄,也就是SimpleBean.class會存放在hall目錄中,暫且保存起來,將來備用。 ?
再輸入以下代碼: ?
<HTML> ?
<HEAD> ?
<title>Reusing JavaBeans in JSP</title> ?
</HEAD> ?
<BODY> ?
<CENTER> ?
<TABLE BORDER=5> ?
<TR><TH CLASS="title"> ?
Reusing JavaBeans in JSP</TABLE> ?
</CENTER> ?
<P> ?
<jsp:useBean id="test" class="hall.SimpleBean" /> ?
<jsp:setProperty name="test" property="message" value="Hello WWW" /> ?
<H1>Message: <I> ?
<jsp:getProperty name="test" property="message" /> ?
</I></H1> ?
</BODY> ?
保存在我們剛才建立的虛擬目錄e:/myjsp下面,并命名為:BeanTest.jsp。 ?
現在我們應該將hall(包)目錄放在哪兒呢?別急,我們先在e:/myjsp下建立一個文件夾WEB-INF,然后再在WEB-INF下建立一個classes文件夾,最后將hall目錄放到classes下,當然,hall下的字節碼文件SimpleBean.class也一并要移過來,而SimpleBean.java就和BeanTest.jsp放到同一目錄吧(可以不需要放的,自己試試)。 ?
好了,大功告成了,重新啟動機器(如果您試了好多次都不行,這一步一定要做),在瀏覽器中輸入:http://localhost:8080/myjsp/BeanTest.jsp,您看到了什么?呵,別告訴我您什么都沒看到,那肯定是您設置的問題了。 ?
好了,文章寫完了,我也只是一只菜鳥,所以有寫的不準備的地方請多多指教。祝您jsp之旅一路順風!!! ?
Java學習 - 技術文章中心 ?
初學者問的諸如:《怎樣配置環境變量》《怎樣運行Servlet》啊?這樣的問題太多了,現在我寫一個初學者入門必讀,以便對初學者有指導作用! ?
首先是下載工具: ?
我建議初學者用Editplus+JDK,我覺得如果用例如JB,Eclipse,JCreator,雖然剛開始的時候比較方便,但是確使初學者門不知道怎樣配置環境變量, ?
從而難以達到知其然,知其所以然的地步 ?
可以通過如下地址下載: ?
Editplus(最新版本是v2.11):http://count.skycn.com/softdown.php?id=3641&url=http://sc-http.skycn.net/down/epp211a_cn.exe(要照注冊碼就自己找吧,網上很多的) ?
JDK(最新版本是Java2sdk1_4_2):http://count.skycn.com/softdown.php?id=3116&url=http://sc-http.skycn.net/down/j2sdk-1_4_2-windows-i586.exe(這是For Windows) ?
然后就是安裝JDK,我是把它裝到從c:\JDK目錄下面: ?
然后就是CLASSPATH的問題了: ?
正如操作系統利用PATH來搜索可執行程序一樣,Java運行環境也會遍歷CLASSPATH來查找類,即便是HelloWorld這樣簡單的程序,JVM也會遍歷 ?
CLASSPATH定義的每一個路徑,直到找到相應的文件為止。 ?
相信大家用的系統不是2k就是XP,然后就應當如下設置Path: ?
我的電腦->屬性->高級->環境變量 ?
然后在環境變量的Path后面追加: C:\JDK\bin;.;C:\JDK\lib ?
也可以這樣配置:C:\JDK\bin;.;C:\JDK\lib\dt.jar;C:\JDK\lib\tools.jar ?
★記住:環境變量中的 . 切記不能少,它表示當前路徑,如果少掉出現的錯誤等會就說! ?
dt.jar是關于運行環境的類庫,tools.jar是關于一些工具的類庫 ?
如果沒有配置:C:\JDK\bin,則會出現 " javac′ 不是內部或外部命令,也不是可運行的程序或批處理文件。"這樣的錯誤。 ?
然后下面就該寫程序了: ?
首先是(HelloWorld.java),打開Editplus,新建一個Java文件,請照著如下輸入,要一字不漏,并且分清大小寫: ?
public class HelloWorld{ ?
public static void main(String[] args){ ?
System.out.println("Hello,World!"); ?
} ?
} ?
然后把這個文件保存(ctrl + s)到HelloWorld.java,記住大小寫一定要分清,是HelloWorld.java不是helloworld.java或者其它的 ?
下面就該運行了,開始->運行->cmd ?
在控制臺中把目錄切換到當前目錄: ?
javac HelloWorld.java ?
java HelloWorld ?
你就會在控制臺上看見輸出的Hello,World!(沒出來?我把電腦吃了:)) ?
javac是編譯命令,它把HelloWorld.java編譯成HelloWorld.class ?
java就是解釋命令,JVM把HelloWorld.class解釋執行. ?
在這個時候: ?
1。如果出現Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld ?
那就是你在環境變量中沒有加上那個.(dot) ?
2。如果出現Exception in thread "main" java.lang.NoSuchMethodError: main ?
或者HelloWorld.java:1: Public class helloworld must be defined in a file called ?
"HelloWorld.java". ?
那就是你沒有分清大小寫的寫入這個HelloWorld,或者保存得時候沒有保存為HelloWorld.java ?
這個名字一定要跟public class的名字一樣 ?
對于環境變量的問題就說到這里,下面我先所說怎么在Editplus里面編譯和運行,在Tools->參數設置->配置用戶工具 ?
1.添加工具(添加應用程序) ?
菜單文字:Compile Java Program ?
程序:C:\JDK\bin\javac.exe ?
參數:文件名稱 ?
初始目錄:文件目錄 ?
2.添加工具(添加應用程序) ?
菜單文字:Run Java Program ?
程序:C:\JDK\bin\java.exe ?
參數:文件名稱(不含擴展名) ?
初始目錄:文件目錄 ?
工具組名稱可以隨便添,比如Debug Java Program ?
然后在Tools的下拉菜單中,你就會看見Compile Java Program以及Run Java Program這兩個選項,以后你就可以利用ctrl + 1編譯和ctrl +2運行程序了 ?
下面就討論Servlet的運行: ?
首先要運行Servlet,則需要JSP/Servlet container,我建議初學者用Tomcat ?
Tomcat(最新版本5.0)http://cvs.apache.org/builds/jakarta-tomcat-5/nightly/jakarta-tomcat-5-bin-20030725.zip ?
然后把這個壓縮包解壓到: ?
C:\Tomcat ?
然后再配置環境變量: ?
添加三個系統變量: ?
JAVA_HOME: C:\JDK ?
TOMCAT_HOME: C:\Tomcat ?
CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\lib ?
Tomcat的環境變量就配置完畢了,下面檢驗Tomcat是否能夠運行: ?
在控制臺中轉到C:\Tomcat\bin這個目錄,運行startup,然后回出現一個窗口,連跳一大串東西,最后表示Server已經運行 ?
在瀏覽器中輸入http://localhost:8080,出現歡迎界面,則表示Tomcat沒問題了 ?
然后和上面一樣,寫入你的第一個Servlet ?
import java.io.*; ?
import javax.servlet.*; ?
import javax.servlet.http.*; ?
public class HelloWorld extends HttpServlet ?
{ ?
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException ?
{ ?
response.setContentType("text/html"); ?
PrintWriter out = response.getWriter(); ?
out.println("<html><head><title>"); ?
out.println("This is my first Servlet"); ?
out.println("</title></head><body>"); ?
out.println("<h1>Hello,World!</h1>"); ?
out.println("</body></html>"); ?
} ?
} ?
然后照樣用javac HelloWorld.java來編譯這個文件,如果出現無法import javax.servlet.* ?
那么就是應該把C:\Tomcat\common\lib里面的servlet.jar(根據實際來看)文件拷貝到C:\JDK\jre\lib\ext中,再次編譯,就沒有問題了! ?
然后在Tomcat目錄里面的C:\Tomcat\webapps\ROOT里面按如下的文件結構: ?
ROOT\index.html ?
ROOT\welcom.jsp ?
ROOT\WEB-INF\lib\MyServlet.jar(如果你的servlet的.class打成了.jar文件,則放在lib下面) ?
ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文件放在這個里面) ?
然后在瀏覽器中輸入http://localhost:8080/servlet/HelloWorld,于是Server眾望所歸的報錯了:Error 404--Not Found ?
怎么回事呢? ?
Servlet必須使用C:\Tomcat\webapps\ROOT\WEB-INF這個目錄下面的web.xml文件進行注冊,用EP打開這個web.xml文件, ?
在里面加入 ?
<servlet> ?
<servlet-name>HelloWorld</servlet-name> ?
<servlet-class>HelloWorld</servlet-class> ?
</servlet> ?
<servlet-mapping> ?
<servlet-name>HelloWorld</servlet-name> ?
<url-pattern>/servlet/helloworld</url-pattern> ?
</servlet-mapping> ?
這樣的結構 ?
<servlet> ?
<servlet-name>HelloWorld</servlet-name> ?
<servlet-class>HelloWorld</servlet-class> ?
</servlet> ?
表示指定包含的servlet類. ?
而以下的結構 ?
<servlet-mapping> ?
<servlet-name>HelloWorld</servlet-name> ?
<url-pattern>/servlet/HelloWorld</url-pattern> ?
</servlet-mapping> ?
表示指定HelloServlet應當映射到哪一種URL模式。 ?
在修改web.xml完畢過后,重新啟動Server,然后再輸入http://localhost:8080/servlet/HelloWorld,那么偌大一個Hello,World!等著你呢,恭喜你
posted on 2006-11-08 16:57
壞男孩 閱讀(1853)
評論(0) 編輯 收藏 所屬分類:
java命令學習