
第9章 Eclipse的J2EE開發
Eclipse默認安裝是沒有J2EE開發支持的,它需要安裝第三方插件,本章的主要介紹的J2EE開發插件是Lomboz,主要開發環境是Tomcat + Lomboz + Struts + Hibernate,這是當前比較流行的一種選擇。其中Tomcat充當WEB服務器;Lomboz是J2EE開發的工具;Struts提供強大的MVC模式支持;Hibernate替代笨重的EJB來充當數據庫的持久層。
以上所有的工具和軟件包不僅流行、功能強大、而且是免費的,是J2EE開發典型搭配。本章將分三個層次來漸進式的展開講解:
l Lomboz下的純J2EE開發
l 融合Struts的J2EE開發
l 融合Struts和Hibernate后的J2EE開發
由于篇幅有限,本章以開發環境的安裝和配置為重點,并輔以一個典型而有深度的實例來演示具體的開發操作,最后給出一個擴展知識的資料索引。
本章和第8章一樣也使用CVS來管理所有例程,在每一節的標題后會用括號顯示這一節的版本號。本章具體的環境為:WindowsXP + JDK1.4.2_06 + Eclipse3.1M4 + cvsnt2.0.58d + Tomcat5.0.28 + Lomboz3.1.0 + Struts 1.2.4。
9.1 WEB環境的搭建(V0010)
9.1.1 下載CVS版本注意事項
由于V0010版,存在一些空目錄,而這些空目錄也是必須要的,否則項目會出錯。這需要修改一個CVS的配置,如下圖9.1所示,打開Eclipse的首選項→小組→CVS→將“修剪空目錄”項取消勾選。

圖9.1 修改CVS配置
9.1.2 Tomcat的下載與安裝
這一節先搭建好Tomcat環境,Tomcat的下載安裝和Eclipse、Lomboz都沒有直接關系,它是完全獨立的。
1、下載Tomcat
(1)用IE打開Tomcat的下載頁面:http://jakarta.apache.org/tomcat/index.html,選擇頁面左邊的鏈接“Binaries”,轉到下圖9.2所示的頁面:

圖9.2 Tomcat項目選擇
(3)單擊上圖中標識的“Tomcat”項,出現如下圖9.3所示的頁面

圖9.3 具體下載項
(4)下載上圖9.3所示的“5.0.28.exe”項,下載后的文件名為:jakarta-tomcat-5.0.28.exe
l 注意:
l (1)不要下載Tomcat5.5.*版,因為那需要JDK5.0的支持;也不要下載4.1.*版,它的功能太弱了。因為不同版本之間的安裝和配置都會有所不同,為了和本教程同步,一定要下載5.0.28版。
l (2)如果用FlashGet等多線程下載工具無法下載,則改用原始的IE右鍵菜單的“另存為…”項來下載。
2、安裝Tomcat
安裝Tomcat的過程比較簡單,雙擊得到的下載文件:jakarta-tomcat-5.0.28.exe,開始安裝。
(1)選擇安裝組件。接受默認的勾選即可,如下圖9.4所示。

圖9.4 選擇組件
(2)選擇Tomcat安裝目錄。也一樣接受默認值,將安裝到C:\Program Files\Apache Software Foundation\Tomcat 5.0目錄下,如下圖9.5所示:

圖9.5 Tomcat的安裝目錄
(3)選擇HTTP監聽端口(Port),如下圖9.6所示。默認端口是8080,如果8080端口已被你電腦上的其他軟件所占用(如IIS、JBoss等),則可以另選擇一個空閑的端口。最后,給Tomcat的超級管理員admin設為一個密碼(本書設為123456)。

圖9.6 設置端口和密碼
(4)設置Tomcat使用的JVM,本書的默認值為“C:\Program Files\Java\j2re1.4.2_06”,如下圖9.7所示。很多資料都指出,在安裝JDK時要設置設置classpath、JAVA_HOME、path等環境變量,但本書從第一章開始就從沒有設置過這些環境變量,一樣可以運行通暢,也許是新版的JDK1.4.2_06很好的解決了這些問題。從這一步也可以看到,Tomcat已經在安裝時定位好了JVM的位置,不必再手工設置了。
設置好JVM后,單擊“install”按鈕,開始安裝。

圖9.7 定位JVM的位置
(5)安裝完成之后,在Windows的“控制面板”→“管理工具”→“服務”窗口中,可以看到Tomcat已經注冊為windows的一項服務,如下圖9.8所示。請確定它是“手動”方式,這一點在開發時很重要,因為我們以后要通過Eclipse來啟動Tomcat。

圖9.8 windows“服務”窗口
3、啟動Tomcat
雖然以后在開發時,是要通過Eclipse來啟動Tomcat,但現在為了測試Tomcat是否安裝成功,暫時先啟動Tomcat。
(1)可以通過Windows的“開始”菜單→“Apache Tomcat5.0”組→“Configure Tomcat”項來運行Tomcat的配置界面(如下圖9.10所示),這個界面包含了Tomcat的一些參數設置,這些設置一般都不用去改動它。直接“單擊”按鈕,即可啟動Tomcat。

圖9.10 Tomcat的配置界面
(2)在IE瀏覽器中輸入“http://localhost:8080”或“http://127.0.0.1:8080”,其中8080為安裝時設置的端口號。如果啟動成功,則會出現如下圖9.11所示的頁面;反之,如果沒有出現此頁面,則表示啟動未成功,這時你需要檢查前面的安裝步驟是否和本書的一致。

圖9.11 驗證Tomcat是否安裝及啟動成功
附注:在上圖頁面的左部有兩個鏈接:Tomcat Administration、Tomcat Manager,它們是用于管理Tomcat的,登錄密碼都是在安裝Tomcat時設置的用戶名admin和密碼123456。其中,Tomcat Adiministration項可以設置數據庫連接池、管理用戶及權限、以及其他一些Tomcat服務器相關設置;Tomcat Manager項主要用來發布網頁管理,通過它可以輕松的將一個WAR包發布到Tomcat中。
關于Tomcat中文問題的解決,請參閱9.4.6節。
9.1.3 Lomboz的下載與安裝
下載Lomboz時一定要針對Eclipse的版本來選擇相應的Lomboz版本下載,否則對應版本不同,很有可能會導致Lomboz無法正常使用。本章由于依然要使用CVS,所以還是用Eclipse3.1M4版,Lomboz選擇相應的3.1.0版。
1、下載Lomboz
Lomboz的下載地址是:http://forge.objectweb.org/project/showfiles.php?group_id=97 ,下載頁面如下圖9.12所示,請選擇for Eclipse3.1.x的Lomboz來下載,而且還需要同時下載emf包(如圖中箭頭所示)。
下載后的文件名為:
l org.objectweb.lomboz_3.1.0.N20050106.zip
l emf-sdo-runtime-I200412160800.zip

圖9.12 Lomboz的下載頁面
2、安裝Lomboz
(1)因為Lomboz、emf是Eclipse的插件,所以它和其他Eclipse插件的安裝方法一樣,本書采用Links式的插件安裝方法,具體步驟不再重復,請參閱1.2節的安裝步驟。
下圖9.13是安裝完成后的目錄結構:

圖9.13 lomboz、emf的安裝目錄結構
其中圖9.13中的links目錄有新創建的兩個文本文件:
l 文件lomboz.link,內容僅一句:path=lomboz_3.1.0.N20050106
l 文件emf.link,內容也僅一句:path=emf-sdo-runtime-I200412160800
(2)驗證Lomboz是否安裝成功
啟動Eclipse。如果安裝成功,選擇“文件”→“新建”→“項目”會出現如下圖9.14所示的Lomboz項目。

圖9.14 驗證Lomboz是否安裝成功
(3)如果未能出現上圖畫面,請做如下檢查和嘗試:
l 刪除eclipse目錄下的子目錄configuration,再啟動Eclipse試一試。
l 檢查Lomboz的版本是否和Eclipse的一致。
l Links文件中的path項是否設置正確。
l Lomboz的目錄結構是否正確:..\lomboz_3.1.0.N20050106\eclipse\plugins,注意lomboz_3.1.0.N20050106和plugins的中間還有個elcipse目錄。
9.1.4 Lomboz的環境設置
安裝完Lomboz之后,還需要針對Tomcat做一些設置才能用于開發WEB,具體操作步驟如下:
(1)打開Eclipse的首選項,設定JDK的tools.jar包的位置,本書是“C:\jdk\lib\tools.jar”,如下圖9.15所示:

圖9.15 設定JDK的tools.jar包的位置
(2)如下圖9.16所示,注意,在Server types項的下拉框中,要選擇和當前所用Tomcat版本相對應的項;Application Server Directory和Classpath Variable兩項都是指向Tomcat的安裝目錄:C:\Program Files\Apache Software Foundation\Tomcat 5.0。

圖9.16 Tomcat在Lomboz中的設置
(3)Tomcat5.0.28版本在Lomboz中無法啟動,必須還要做一些小修改。到Lomboz插件的“..\lomboz_3.1.0.N20050106\eclipse\plugins\com.objectlearn.jdt.j2ee_3.0.1\servers”目錄中,可以看到各種Web服務器的配置文件,它們都會顯示在上圖9.16的server types下拉框中,除了tomcat50x.server文件外,其他都不需要,把它們都刪除掉或者備份到其他地方。最后,用記事本打開tomcat50x.server,并將所有“${serverRootDirectory}/bin;${serverRootDirectory}/common/endorsed”項替換成“${serverRootDirectory}/common/endorsed”,共有兩處,約在文件中的35、39行位置。
9.1.5 JSP的HelloWorld
本小節將寫一個JSP的HelloWorld,用來驗證以上Tomcat和Lomboz的環境是否安裝成功。
1、設置Java的構建路徑
打開Eclipse首選項,如下圖9.17所示,選擇“java”→“構建路徑”→選擇“文件夾”項。經過此步設置之后,新建的Java項目(包括J2EE項目)就會默認以bin為輸出目錄。
l 注意:這一步相當重要,因為用Lomboz創建J2EE項目時,是無法象創建普通Java項目那樣選擇“項目布局”的,此時J2EE項目的輸出目錄將會是在項目根目錄下,以后JavaBean的java文件也會和class文件混在一塊,非常不便。更關鍵的是,在后面會要重新定位JavaBean的輸出路徑,如果不經過這一步,則定位JavaBean的輸出路徑時,整個項目的輸出路徑也會自動定位到bin目錄下,但此時項目結構都會調整,容易導致混亂。總之,此步一定不能省略。

圖9.17 設置Java項目的構建路徑
2、創建一個J2EE項目
(1)重啟Eclipse。選擇“文件”→“新建”→“項目”,選擇如下圖9.18所示的“Lomboz J2EE Project”項目,然后單擊“下一步”。

圖9.18 選擇“Lomboz J2EE Project”項目
(2)輸入項目名稱myweb,然后單擊“下一步”。
(3)在接下的“定義Java構建設置”頁中不做任何改變,直接單擊“下一步”。
(4)最后一個頁面是J2EE的設置,如下圖9.19、9.20所示。共有三步:創建一個名為hello的Web Modules(WEB模塊);在Targeted Servers選項卡中,選擇“Apache Tomcat v5.0.x”項并單擊“Add”加入;單擊“完成”按鈕,開始生成一個J2EE項目。

圖9.19 創建一個Web Modules

圖9.20 設置Targeted Servers
(5)完成以上操作之后,“包資源管理器”視圖中會出現如下圖9.21所示的項目結構。

圖9.21 myweb項目的項目結構
3、在Lomboz中啟動Tomcat
右鍵單擊“hello模塊”,彈出如下圖9.22所示的右鍵菜單,選擇Run Server來啟動Tomcat(啟動前確保Tomcat還是停止狀態)。在這個菜單中還有其他常用的菜單項:
l Stop Server - 停止Tomcat
l Debug Server - 用調試方式啟動Tomcat。在WEB開發中,它比Run Server更常用。
l Check All JSP Syntax - 檢查項目中所有JSP文件的語法是否符合規范
l Undeploy Module - 刪除已經發布在Tomcat上的WEB模塊
l Deploy Module - 發布WEB模塊到Tomcat上
l Show in Browser - 在IE中預覽本WEB模塊的效果。

圖9.22 hello模塊的右鍵菜單
如果啟動Tomcat成功,在控制臺會顯示如下圖9.23所示的字符串。

圖9.23 控制臺的輸出顯示
4、發布hello模塊
右鍵單擊hello模塊,打開如上圖9.22所示的右鍵菜單,選擇Deploy Module項,將hello模塊發布到Tomcat。
從下圖9.24的控制臺輸出,可以看出Lomboz使用Ant來發布網頁,每一行都顯示出hello模塊的打包發布過程,下面給出一些關鍵詞解釋:
l mkdir - 創建目錄
l copy - 復制文件
l jar - 用JDK的jar來打包(這里是打包成hello.war)
l delete - 刪除文件

圖9.24 發布hello模塊時的控制臺輸出
再次調出hello模塊的右鍵菜單,選擇Show in Browser項。Lomboz將打開IE瀏覽器,得到如下圖9.25所示的效果,也可以直接打開IE瀏覽器,輸入地址“http://127.0.0.1:8080/hello/”來查看效果。這個頁面顯示的是index.jsp文件。

圖9.25 用IE來查看網頁效果
5、修改index.jsp
如下圖9.26所示,修改index.jsp來顯示一個HelloWorld字符串。

圖9.26 修改index.jsp
保存好之后,還要再用“Deploy Module” 菜單項重新發布hello模塊,然后才能在IE中看到修改后的效果。
6、一些相關問題
(1)如果看不到修改效果,有可能是IE的頁面緩存的原因,可以嘗試如下解決辦法:關掉IE,然后再打開,進入“工具”→“Internate選項”,單擊下圖9.27中的“刪除文件”按鈕來刪除IE的網頁緩存。

圖9.27 刪除IE頁面緩存
(2)同樣是因為緩存原因,在停止Tomcat服務后,即使刷新網頁卻依然能正常顯示。將IE關掉重啟,頁面即會無法訪問。
(3)如果是在Eclipse中啟動Tomcat的,則關閉Eclipse,Tomcat服務也隨之停止。但建議還是使用“Stop Server”菜單項來正常停止Tomcat服務。
9.1.6 如何不必發布就可以在IE上顯示WEB修改效果
經過前面設置后,雖然可以開發WEB了,但每一次修改都要重新發布hello模塊,才能在IE上顯示修改后的效果,這無疑是開發時無法接受的,照這樣,開發的時間進度至少要增加一倍。本小節將給出不必不發布就可以在IE上顯示修改效果的方法。
首先,解決的辦法是基于以下知識的:
l 在發布hello模塊時,Lomboz是將hello模塊打成一個WAR壓縮包,然后復制到Tomcat的webapps目錄,在IE上顯示的網頁就是來自于這個目錄下的WAR壓縮包中,所以不能直接顯示修改后的JSP文件也是可以理解的了。
l Tomcat要發布網頁,不是必須得打成WAR包,也可以發布未經壓縮的文件目錄。實際項目中,直接發布零散文件的方式居多,因為這樣更新JSP文件比較方便。
l 在Tomcat安裝目錄下的conf子目錄里有一個名為server.xml的文件,它可以用來定義一個新的WEB應用。
由上面的知識,可以得出以下解決思路:通過修改server.xml文件,定義一個新的WEB應用,將這個WEB應用定位到Eclipse的workspace目錄中的myweb項目。這樣設置以后,IE顯示的文件就是Eclipse中正在編寫的JSP文件了,也就是說,不必再經過打包成WAR發布這一步。
具體操作步驟如下:
(1)為了避免干擾,先將原來發布的hello模塊刪除。
打開Tomcat主頁面:http://127.0.0.1:8080/。選擇鏈接“Tomcat Manager”,輸入用戶名密碼(admin、123456),得到如下圖9.28所示頁面。單擊hello模塊右側的“Undeploy”將hello模塊從Tomcat上的撤消發布。

圖9.28 撤消Tomcat上的hello模塊
(2)修改server.xml,定義一個新的WEB應用
server.xml此文件的具體路徑如下:C:\Program Files\Apache Software Foundation\Tomcat 5.0\conf\server.xml。此server.xml文件最未尾的</Host>項之前插入一項<Context>的設置,<Context>的具體代碼如下:
<Context path="/hello"
reloadable="true"
docBase="C:\eclipse3.1M4\eclipse\workspace\myweb\hello"
workDir="C:\eclipse3.1M4\eclipse\workspace\myweb\bin" />
代碼說明:
l 注意一定要將以上代碼加在緊靠</Host>項之前,<Context>的幾個屬性可以分行寫,也可以寫成一行。
l path - 是指WEB模塊的名稱hello,這樣其訪問地址為:http://127.0.0.1:8080/hello/
l docBase - 定義jsp文件位置。本處指向Eclipse中hello模塊的路徑
l workDir - 在IE顯示之前,JSP要先編譯成servlet,這個屬性就是定義hello模塊輸出的servlet的所在位置。如下圖9.29所示,因為所建的myweb項目默認的輸出路徑為myweb\bin目錄,所以這里的workDir也定位到此myweb\bin目錄。

圖9.29 myweb項目的默認輸出文件夾
(4)右鍵單擊“hello”模塊→選擇Lomboz J2EE→選擇Debug Server(或Run Server)。然后,在IE瀏覽器中輸入“http://127.0.0.1:8080/hello/”來查看效果。最后,隨便修改一下index.jsp文件,直接刷新一下IE,如果可以看到修改后的效果,表示以上所有設置成功。
如下圖9.30所示的“導航器”視圖(注意:不是“包資源管理器”視圖),index.jsp在經過IE顯示之后生成幾個新文件和目錄(可能需要先刷新一下myweb項目):

圖9.30 myweb項目結構
9.1.7 配置Tomcat的數據庫連接池
在WEB開發中,有沒有數據庫連接池對WEB性能的影響非常大,Tomcat有自帶的連接池,這一節就來配置Tomcat的連接池。
1、復制JDBC連接包
將第8章使用的JDBC連接包mysql-connector-java-3.0.16-ga-bin.jar復制到C:\Program Files\Apache Software Foundation\Tomcat 5.0\common\lib目錄下,common\lib是Tomcat的全局引用庫的所在目錄,Tomcat在啟動時會自動加載這個目錄中的所有JAR包。
有些網上的文章說也可以將數據庫連接包復制到WEB應用的WEB-INF\lib中(本例的myweb\hello\WEB-INF\lib目錄),這個目錄是hello模塊發布時會自動加載的一個包目錄。但經筆者實驗,如果連接包將放在此目錄中,不用數據庫連接池方式來訪問數據庫,則連接包可以正常使用;如果使用Tomcat連接池,則會出錯誤,連接包無法使用。
2、進入Tomcat的配置頁面
用IE瀏覽器輸入地址:http://127.0.0.1:8080/admin/ ,打開Tomcat服務器配置的登錄頁面,再輸入用戶名admin、密碼123456,進入Tomcat的配置頁面,如下圖9.31所示:

圖9.31 連接池設置
單擊左邊的樹結點“Data Source”→選擇右上角的下拉框的“Create New Data Source”項,然后在表格中輸入相應的連接池配置信息:
l JNDI Name:jdbc/mysql - 設置連接池的JNDI名,在Java程序會用到此名。
l Data Source URL:jdbc:mysql://localhost/sms - 數據庫連接字串,sms是數據庫。
l JDBC Driver Class:com.mysql.jdbc.Driver - JDBC連接類。
l User Name:root - 數據庫登錄用戶名。
l Password:****** - 數據庫登錄密碼。本例為123456。
l Max. Active Connections:4 - 最大連接數。實際應用時,應該根據WEB使用情況設置得大一些;開發時,4個連接足夠了。
l Max. Idle Connections:2 - 最大空閑連接數。
l Max. Wait for Connection:5000 - 最大等待連接限制。
l Validation Query:驗證用的查詢語句,可以不填。
填寫完以上信息之后,單擊右下角的“Save”按鈕保存修改,再單擊右上角的“Commit Changes”按鈕提交修改。
3、修改Tomcat的server.xml文件
server.xml文件的具體路徑:C:\Program Files\Apache Software Foundation\Tomcat 5.0\conf\server.xml,在原來的<Context>項中加入一個子項< ResourceLink>:
<Context path="/hello"
reloadable="true"
docBase="C:\eclipse3.1M4\eclipse\workspace\myweb\hello"
workDir="C:\eclipse3.1M4\eclipse\workspace\myweb\bin">
<ResourceLink name="jdbc/mysql"
global="jdbc/mysql"
type="javax.sql.DataSourcer"/>
</Context>
4、測試數據庫連接池
將以下測試程序命名為test.jsp,創建在hello模塊的根目錄下,然后通過IE地址:http://127.0.0.1:8080/hello/test.jsp來訪問。這個測試程序從數據庫連接池中獲得一個數據庫連接對象Connection,然后再查詢數據庫的iuser表,并用name(姓名)列的數據打印出來(注:iuser是在第8章創建的用戶表)。test.jsp運行效果如下圖9.32所示:

圖9.32 test.jsp的效果
test.jsp源代碼如下:
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="java.sql.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="javax.naming.*"%>
<%
Connection con=null;
Statement sm=null;
ResultSet rs=null;
try{
InitialContext ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
con = ds.getConnection();
sm = con.createStatement();
rs = sm.executeQuery("select * from iuser");
while(rs.next())
out.println(rs.getString("name")+",");
}catch(Exception e){
e.printStackTrace();
}finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {}
rs = null;
}
if (sm != null) {
try {
sm.close();
} catch (SQLException e) {}
sm = null;
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {}
con = null;
}
}
%>
程序說明:
l <%@ page contentType="text/html; charset=GBK"%> 這一行是設置網頁的字符集,也是解決中文亂碼問題的關鍵一句。如果是純html頁面,則應在</HEAD>項之前加入這樣一句:<META http-equiv=Content-Type content="text/html; charset=GBK">。
l <%@ page import="java.sql.*"%> 這一句類似于Java中的import java.sql.*。
l ctx.lookup("java:comp/env/jdbc/mysql"); 這一句中comp/env是固定不變的,jdbc/mysql是前面連接池設置的JNDI Name。
l 在程序最后一定要關閉數據庫連接(實際是將連接返回給連接池,并沒有真正關閉),否則,很快就會因連接數耗盡,而無法再正常顯示JSP頁面。