Borland公司的JBuilder是世界領先的Java開發環境。目前最新版本JbuilderX是一個開發企業級Java應用的綜合性跨平台環境,它在使JBuilder屢獲殊榮的性能上,增加了很多新的特性,從而成為目前最強大的 Java可視化開發環境。本文將通過一個簡單的WEB項目,使您快速進入JBuilderX的殿堂。
JBuilderX的功能極其豐富,本文不會也不可能面面俱到地介紹所有的功能,只會對涉及例子項目開發的一些容易忽視或不容易掌握的功能展開介紹,而對一些常見的功能將一點而過,或不提及,相信您可以在項目開發操作過程中自然掌握那些基本的功能。您也可以通過JBuilderX在線幫助文檔來了解和掌握這些內容,推薦您閱讀help->JBuilder toturials中前4個基礎教程。
項目介紹
雖然JBuilderX可以用於開發桌面、無線、applet等應用程序,但80%以上的使用者用它開發J2EE的WEB應用程序,所以我設計了一個簡單的WEB應用項目,亦步亦趨地帶領您開發出一個可以運行的WEB應用程序。
這個WEB項目只包含一個用戶登錄的功能,其系統框圖如下:
圖1. 系統框圖
其中web應用服務器為tomcat4.1,數據庫服務器為oracle10g。
這個項目包括以下內容:
1) 用戶表T_USER:用於保存用戶的信息
2) 登錄頁面login.htm:讓用戶錄入用戶名和密碼
3) 用戶信息javaBean類UserBean:包括三個屬性,即用戶ID和用戶密碼及用戶名
4) 獲取數據庫連接類DSBean:獲取數據庫鏈接,以便操作數據庫
5) 用戶登錄處理頁面execute.jsp:將用戶id,用戶密碼和數據庫中的比較,產生結果頁面
6) 異常處理頁面error.jsp:當發生異常時轉入異常處理頁面,顯示人性化的錯誤信息
項目中各項部分的協作關系如下圖:
圖2. 系統中各部分的協作關系
創建數據庫
首先以system用戶登錄oracle數據庫,創建數據庫用戶:
create user test identified by test;grant connect,resource to test;
用戶信息表T_USER,該包括三個字段,其表的結構如下:
字段名 類型 注釋 user_ID varchar2(10) 用戶ID user_name varchar2(20) 用戶名 password varchar2(30) 用戶密碼以test用戶登錄數據庫,運行以下語句SQL,創建用戶信息表:
create table T_USER ( USER_ID VARCHAR2 (10) PRIMARY KEY, USER_NAME VARCHAR2(20), PASSWORD VARCHAR2(30))/
往表中插入兩條用戶信息:
insert into T_USER values(‘zhangshang’,’張三’,’123456’);insert into T_USER values(‘lisi’,’李四’,’abc’);commit;
創建項目工程
創建工程:File->New Project出現下面的界面:
圖3. 創建項目工程
項目取名為loginPro,放置在D:/loginPro路徑中,一路按Next就可以了。
創建完項目工程後,在工程下創建一個Web模塊:File->New...->左邊樹選擇Web->雙擊右邊窗口的Web Module(WAR)項目->在彈出的窗口中點選Create empty Web Module,按Next->在彈出的窗口中按以下設置:
圖4. 設置web模塊路徑和技術標准
web模塊的名稱為loginWeb,放置在項目路徑下的loginWeb子文件夾中,設置Servlet和JSP的版本。在設置完後直接點擊Finish完成Web模塊的創建。
特別提醒讀者,如果您開發的是Web項目,一定要創建Web模塊,只有這樣,在工程中開發的Java類在Rebuild後,JBuilderX才會調用Ant工具,將編譯後的class文件同步到web模塊的WEB-INF目錄中。筆者曾經有一個朋友向我報怨說用JBuilder開發WEB程序很麻煩,原來他沒有在工程中創建Web模塊,每次更改類後,都不辭辛苦地將編譯後的類手工拷到到WEB應用的WEB-INF\classes目錄下,殊不知,金光大道已經開通,而自己還在羊腸小道裡掙扎。
編寫類
本項目中包括兩個類,一個是用戶信息類UserBean.java,另一個是獲取數據庫連接類DSBean.java。下面我們來編寫這兩個類:
首先編寫UserBean.java類:File->New Class...彈出如下的窗口:
圖5. 編寫類向導
在類向導的窗口界面上錄入類的名字UserBean,包名默認的是項目的名稱,您可以更改其他更用意義的包名,我們簡單地接受默認的包名。按OK後,在編輯窗口中得到如下的類代碼:
package loginpro;public class UserBean { public UserBean() { }}
下面我們給UserBean類添加3個屬性:在UserBean的編輯窗口的底部點擊Bean標簽頁->選擇Bean標簽下的Properties的子標簽頁->在Properties頁面中通過Add Property來添加類的屬性,點擊該按鈕彈出屬性窗口->在此窗口中添加屬性。
不過筆者以為這種常規的給類添加屬性的方法比較笨拙,效率很低,您可以直接通過在類中鍵入全局變量,然後再按上面的步驟切換到Properties標簽頁,JBuilderX會自動將全局變量列在這個頁面中,通過鉤選Getter和Setter列中的復選框,變量的set和get方法就自動產生了,筆者在編寫程序的時候選擇采用這種方法。添加全局變量後,UserBean代碼如下(其中粗體紅色為新增的代碼,下同):
package loginpro;public class UserBean
{
private String userID;
private String userName;
private String password;
public UserBean() { }
}
切換到Properties頁面,鉤選所有的Getter和Setter
切換回代碼頁面後,屬性的get和set方法都自動生成了:
...
public class UserBean
{
...
public String getPassword()
{
return password;
}
public String getUserID()
{
return userID;
}
public String getUserName()
{
return userName;
}
public void setUserName(String userName)
{
this.userName = userName;
}
public void setUserID(String userID)
{
this.userID = userID;
}
public void setPassword(String password)
{
this.password = password;
}
}
編寫好UserBean後我們再來編寫獲取數據連接的DSBean,在編寫這個類之前,因為該類需要用到Oracle的JDBC包,所以我們需要將oracle JDBC的jar包加載到類庫中,再將其引入項目工程裡。
目前oracle最新的版本是oracle10g,如果您安裝了oracle10g,則JDBC包位於[ORACLE_HOME]\jdbc\lib\classes12.jar,如果您未安排數據庫,您可以到這兒下載JDBC驅動包,它是向下兼容的。假設我們已經將其下載到D:\extra目錄中,我們通過以下操作將其加載到JBuilderX的類庫中:Tools->點擊Configure Libraries彈出Configure Libraries窗口,如圖6,首先點擊Configure Libraries窗口左下方的New...彈出New Library Wizard窗口,在窗口中給該類取一個名字叫jdbcLib,再點擊該窗口的Add...按鈕彈出Select One or More Directories窗口,定位到D:\extra目錄,選取class12.jar,然後確認即可。
圖6. 添加新類到JBuilderX類庫中
接下來我們需要在項目中引用類庫中這個新的jar包,這樣項目才可以訪問這個JDBC的jar包:Project->Project Properties在彈出的窗口左邊的樹中選擇Paths,按照圖7的操作完成引用的任務:
圖7. 添加jdbc的jar包到項目中
需要指出的是,如果項目需要引用大量的外部jar包,則可以將這些jar包組織到一個目錄下,然後將整個目錄加入到類庫,在項目工程中引用該目錄對應的類庫名就可以在項目中調用這些包了。當Rebuild項目時,JBuilderX還會將這些包同步到WEB應用的目錄中。
現在萬事俱備了,我們開始編寫DSBean.java:
package loginpro;
import java.sql.*;
public class DSBean
{
public static Connection getConnection() throws SQLException
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException ex)
{
System.out.println("數據庫驅動程序沒有找到。");
}
return DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.189:1521:ora9i", "test", "test");
}
}
我的數據庫裝在IP為192.168.0.189的機器上,數據庫的SID是ora9i,讀者在編寫時必須根據您的數據庫的具體情況作相應的更改。
編寫完這兩個類後,我們可以在項目工程面板中右擊loginPro.jpx,選擇Rebuild,來編譯這兩個類,編譯完後的類不但會輸出到D:\loginPro\classes目錄下,同時還將同步到D:\loginPro\loginWeb\WEB-INF\classes目錄中,並且將會將項目中引用的外部包拷貝一份到D:\loginPro\loginWeb\WEB-INF\lib目錄下。值得注意的是,如果用Make命令來編譯,則類只會輸出到D:\loginPro\classes中,而不會同步到D:\loginPro\loginWeb\WEB-INF\classes目錄。對J2EE的web目錄結構的探討超越本文內容,請自行閱讀相關資料。
登錄頁面和處理頁面
編寫用戶登錄的頁面login.htm:File->New File...彈出以下對話框:
圖8. 創建login.htm
在編輯窗口鍵入以下的頁面代碼:
<html>
<body>
<form name="form1" method="post" action="execute.jsp">
<input type="text" name="userID">
<input type="text" name="password">
<input type="submit" name="Submit" value="提交">
</form>
</body>
</html>
該登錄頁面接受用戶輸入的用戶id和密碼,提交給execute.jsp頁面處理,下面我們來編寫execute.jsp:File->New...->在Object Gallery窗口中左邊的樹中選擇Web->在右邊窗口中雙擊JavaServer Page圖標將彈出如下的對話框:
圖9. JSP頁面向導
在該對話框中的Name中鍵入JSP頁面的名字:execute,點擊Next,在彈出的頁面中再點擊Next,進入向導的第3步,在這步中,允許您設置頁面引用的JavaBean:
圖10. 設置JSP頁面引用的JavaBean
點擊OK後,loginpro.UserBean類被定義為該頁面的一個JavaBean,其id默認名為bean0,我們將其改為userBean,列表中還允許您指定這個JavaBean的作用域,我們選擇session。直接點擊Finish得到execute.jsp文件的代碼:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>execute</title>
</head>
<jsp:useBean id="userBean" scope="session" class="loginpro.UserBean" />
<jsp:setProperty name="userBean" property="*" />
<body bgcolor="#ffffff">
</body>
</html>
需要指出的是<jsp:setProperty name="userBean" property="*" />以參數名匹配的方式接收客戶端發送過來的參數值,在這裡,當login.htm提交後userBean的userID和password兩個將被設置為login.htm頁面表單中兩個輸入框的值。
接收到客戶端的值後,程序將其和數據庫中T_USER表中的記錄作比較,以便查明是否是合法用戶,現在我們給execute.jsp添加代碼,完成這些處理工作:
<%@ page contentType="text/html; charset=GBK" errorPage="error.jsp"%>
<%@ page import="java.sql.*"%>
<%@ page import="loginpro.DSBean"%>
<html>
<head>
...
<jsp:setProperty name="userBean" property="*" />
<body bgcolor="#ffffff">
<% Connection conn = DSBean.getConnection();
String sqlStr = "select count(*) from T_USER where USER_ID=? and password=?"; PreparedStatement pStat = conn.prepareStatement(sqlStr);
pStat.setString(1,userBean.getUserID());
pStat.setString(2,userBean.getPassword());
ResultSet rs = pStat.executeQuery();
if(rs.next() && rs.getInt(1) == 1)
out.print("您是合法的用戶,歡迎您的到來!"); else out.print("密碼不對,或者您還沒有注冊為系統的用戶");
%>
<body bgcolor="#ffffff">...
我們只是簡單地將userID和password的值發送到數據庫中進行比較,在真正的應用中,一定事先要檢查userID和password的值是否有單引號(’),如果有,必須將其轉換成兩個單引號(‘’),否則將產生安全漏洞問題,有興趣的朋友可以在網上查找相關資料。
最後的一個JSP是處理錯誤和異常的error.jsp,它的代碼如下:
<%@ page contentType="text/html; charset=GBK" isErrorPage="true" %>
<%@ page import="java.sql.SQLException"%>
<html>
<head>
<title>error</title>
</head><body bgcolor="#ffffff">
<%
if( exception instanceof SQLException ) out.println("發生了數據庫操作異常,請和系統管理員聯系"); else out.println("發生了不可知的異常,請和系統管理員聯系"); %>
</body>
</html>
當execute.jsp發現數據庫操作或其他的異常時,將會跳轉到該錯誤處理頁面,打印出可讀性強的錯誤信息。
由於JBuilderX對頁面可視化的支持不強,您也可以在Dreamweaver中完成HTML及JSP可視化內容的開發,而在JBuilderX中完成邏輯處理部分的開發,畢竟這個世界永遠需要協作。
在JBuilderX中運行WEB程序
至此我們已經完成了項目中所有程序的開發工作,下面我們將在JBuilderX中運行該WEB程序。在運行程序之前,必須保證已經設置了WEB服務器。Project->Project Properties...->在彈出窗口左邊樹中設置Server:
在Single Server for all services in project選項裡選擇Tomcat4.1,其默認的設置是Tomcat4.0。如果您給JBuilderX配置了其他的WEB服務器,如WebSphere或WebLogic,它們都會列在該下拉框中。但是,我將不擬對此展開討論,一個主要原因是,雖然JBuilderX允許您在開發環境中設置並運行這些服務,但由於這些重量級的WEB服務開啟或關閉都需要很長的時間,給測試帶來了很大的不便。所以我們一般的作法是先在輕量級的WEB服務(一般是Tomcat中)中完成測試,再將其部署到真正的企業級WEB服務器中去。
更進一步,我們將不在JBuilderX中運行Tomcat測試,而是通過外部的Tomcat來測試,否則當JBuilderX開啟測試的WEB服務後會給更改程序帶來了不便。關於tomcat配置討論已經超出了本文范圍,有興趣的朋友可以自行研究。為了簡單,本文將在JBuilderX環境中完成測試。
在編輯窗口中鼠標右擊login.htm的標簽,選擇Web Run using “execute”:
圖11. 運行WEB服務
JBuilderX將自動完成WEB配置信息的設置並在8080端口啟動WEB服務,login.htm登錄頁面展示出來接受用戶的錄入,我們以zhangshang/123456登錄:
圖12. 用戶登錄
如果此時數據庫還沒有啟動則execute.jsp轉到error.jsp,錯誤頁面輸出以下內容:
圖13. 錯誤頁面
在保證數據庫啟動及連接正常後,將得到正確登錄的頁面:
圖14. 登錄成功的頁面
您也可以啟動IE,在IE的地址欄中鍵入正確的地址來運行程序。
一些常見問題的解決方法
在使用JBuilderX開發項目過程中,您可能會碰到一些小麻煩,在這裡我將介紹兩個常見的經常影響開發者情緒的問題及其解決方法。
1、編輯界面不支持中文:您在編輯界面中鍵入的中文會變成一串不可識別的“口口口”,這個問題好象只出現在JBuilderX版本中,但也不一定會在每台機器上都發生。有一次,我的一個同事的JBuilderX就發生了這種情況,後來我幫其更改了JBuilderX的配置文件C:\Documents and Settings\Administrator\.primetimeX\user_zh.properties中的設置信息,才解決了這個問題,具體解決方法,您可以參考borland網站的這篇文章。
2、光標錯位:這個問題是JBuilder開發工具的一個頑疾,每個JBuilder版本都存在這個問題(borland這種抱殘守缺,矢志不移的精神讓我納悶,同時也很敬佩)。解決的方法很簡單,對於低版本的JBuilder您可能將字體設置為宋體就可以了,但在JBuilderX中,字體選擇下拉框中只列出兩種字體:Courier New和Lucida Sans Typewriter,沒有宋體,這是一個bug。但我們可能通過其它方法來曲線救國:Tools->Perferences...->點擊彈出窗口左邊的Color在右邊窗口的設置界面中列出了Java,HTML/XML,JSP及其他格式文件的編寫樣式,去除所有粗體格式的設置:
圖15. 設置代碼格式
如圖15,您可以在界面的右下角的編輯框中點選加粗的語句,然後取消Bold前面復選框的鉤。這樣就沒有光標錯位的問題了。
總結
Jbuilder之所以如此流行的原因是顯而易見的。由於其代碼編輯的質量和開發者效率的特點,Borland作為開發者和數據庫工具供應商的聲譽異常顯赫。Borland主導著IDE市場。JavaPro和DevX的研究表明,Jbuilder一直是Java開發者最普遍采用的,並且大大超過其它同類產品的采用率。
本文以開發一個簡單的例子為主線,向您介紹了用JBuilderX開發WEB項目的方方面面,並且適時地指出了開發中的一些實戰經驗和一些常見的問題。建議您在讀完本文後,自己再試著在JBuilderX環境中重復開發這個例子,畢竟紙上得來終覺淺,絕知此事要躬行。