版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
12.1軟件組件模型
12.2JavaBean的概念及特點
12.3JavaBean的組成
12.4JavaBean的編寫與使用 12.5JavaBean與數(shù)據(jù)庫
12.6小結(jié)
12.7習(xí)題
長期以來,程序開發(fā)人員在應(yīng)用程序開發(fā)中,發(fā)現(xiàn)很多功能類似的程序模塊總是重復(fù)出現(xiàn),為避免這些程序的重復(fù)開發(fā),產(chǎn)生了軟件組件技術(shù)。軟件組件是按照“一次開發(fā),任何地方重復(fù)使用”原則開發(fā)的自包含軟件單元。換句話說,軟件組件是離散的、可重用的軟件單元。
組件技術(shù)具有可以重復(fù)使用、易于替換和升級、可以加快軟件的開發(fā)速度和縮短軟件開發(fā)周期的特點。12.1軟件組件模型
JavaBean就是Java的組件模型。常見的還有COM組件技術(shù),它是Microsoft提出的一種組件模型;還有DCOM和CORBA,是在分布式應(yīng)用上常見的組件模型。
組件分為可視化組件和非可視化組件,可視化組件具有可視的功能,如在VB或Delphi等開發(fā)工具中使用的按鈕、文本輸入框等組件。非可視化組件在后臺工作,不可視,如VB或Delphi使用的定時器,它就是一種非可視化組件。
傳統(tǒng)的JavaBean主要應(yīng)用在可視化領(lǐng)域,如多列的列表框、菜單項等,但隨著JSP等技術(shù)的發(fā)展,JavaBean在非可視化領(lǐng)域的應(yīng)用更為廣泛,特別是在JSP的服務(wù)器端應(yīng)用方面表現(xiàn)出越來越強(qiáng)的生命力。所謂JavaBean,就是在基于Java組件規(guī)范的基礎(chǔ)上,可以在軟件工具上可視化操作的、可重復(fù)使用的、獨立于平臺的軟件組件。
JavaBeanAPI官方文檔中有這樣的定義:“JavaBean是在開發(fā)工具上可視化操作的、可重用的軟件組件(AJavaBeanisareusablesoftwarecomponentthatcanbemanipulatedvisuallyinabuildertool)。”12.2JavaBean的概念及特點
JavaBean它既不是Applet,也不是Aplication,而是一個獨立的、可重用的軟件組件,可以用構(gòu)造工具來直觀地操縱它。
JavaBean具有獨立性、可重復(fù)使用、在可視化工具(如Jbuilder、VisualAge或Visualcofe等)中使用、狀態(tài)可以保存等特點。12.3.1JavaBean的屬性
屬性定義了JavaBean的外觀或者行為特征,在運行時可以通過它們的get和set方法來獲取或設(shè)置它們的值。
JavaBean屬性分為四種屬性:
●單值屬性:它標(biāo)識一個單獨的值,可以使用get和set方法來設(shè)定或獲取。
●索引屬性:表示一個成員數(shù)組,包含幾個類型相同的數(shù)據(jù)元素。12.3JavaBean的組成●綁定屬性:如果屬性值修改,則向其他對象提供通知,一般是給JavaBean注冊一個外部的事件偵聽器,當(dāng)屬性值發(fā)生變化時,產(chǎn)生通信事件。事件偵聽器注冊和取消注冊一般使用addPropertyChangeListener()和removePropertyChangeListener()方法。
●限制屬性:能夠在屬性值被修改的時候給其他對象發(fā)送通知,注冊成限制屬性的偵聽器的對象,其屬性值可以拒絕修改,一般采用addVetoableChangeListener()和removeVetoableChangeListener()方法來注冊和取消注冊。12.3.2JavaBean的事件
事件是在JavaBean之間或JavaBean和容器之間傳送異步消息的機(jī)制。JavaBean用事件通知另一個JavaBean做某個動作或者告訴某個JavaBean狀態(tài)已經(jīng)發(fā)生改變。事件允許JavaBean在發(fā)生某些事件時進(jìn)行通信。通信包含三部分:事件對象、事件監(jiān)聽者和事件源。
JavaBean主要使用繼承了EventListener的事件監(jiān)聽者接口來進(jìn)行通信。JavaBean的開發(fā)者可以使用他們自定義的事件類型和事件監(jiān)聽者接口,并可以使它們的JavaBean作為實現(xiàn)addXXXListener()和removeXXXListener()方法的源,即作為通信中的事件源,其中XXX是事件類型的名稱。然后開發(fā)者可以通過實現(xiàn)XXXListener接口使其他Beans作為事件監(jiān)聽者。調(diào)用sourceBean.addXXXListner(targetBean)方法將sourceBean和targetBean結(jié)合在一起。12.3.3JaveBean的方法
方法是一種用于和JavaBean交互的操作。由合適的事件源方法來調(diào)用JavaBean,可以使它們接收到事件通知。某些方法是特殊的,用來處理屬性和事件。這些方法必須遵循
JavaBean規(guī)范中的命名規(guī)定。其他方法可能和事件或?qū)傩詻]有關(guān)系。JavaBean的所有公共方法對于JavaBean框架是可存取的,且能用來將一個JavaBean連接到其他JavaBean。
JavaBean主要有兩種開發(fā)方式,一種是以手寫代碼的方式來編寫,另一種方式是使用應(yīng)用程序生成器工具來生成JavaBean。
例12-1為JavaBean的編寫過程,并演示了索引屬性值的改變。
首先編寫一個類,使其繼承Beans類,其屬性值設(shè)為private屬性,并使用getXXX和setXXX的方法來獲取或設(shè)置屬性值。例12-1中的ItemName屬性可以由getItemName()方法來獲取,由setItemName()方法來設(shè)置,并且給出了此JavaBean添加注冊偵聽器和移除偵聽器的方法addPropertyChangeListener()和removePropertyChangeListener()。12.4JavaBean的編寫與使用【例12-1】JavaBean文件Items.java。
importjava.beans.*;
importjavax.swing.*;
publicclassItemsextendsBeans
{
privatePropertyChangeSupportsupport;
privateString[]ItemNames={"書法繪畫","文化藝術(shù)","體育運動"};
publicItems()
{support=newPropertyChangeSupport(this);
}
publicStringgetItemName(intindex)
{
returnItemNames[index];
}
publicvoidsetItemName(intindex,StringItemName)throwsArrayIndexOutOfBoundsException
{
this.ItemNames[index]=ItemName;
}publicvoidaddPropertyChangeListener(PropertyChangeListenerl)
{
support.addPropertyChangeListener(l);
}
publicvoidremovePropertyChangeListener(PropertyChangeListenerl)
?{
support.removePropertyChangeListener(l);
}
}例12-2中,創(chuàng)建了剛編寫的JavaBean對象“bean1”,然后調(diào)用“bean1”的setItemName來設(shè)置其屬性值,調(diào)用getItemName()來獲取某個索引index下的值。
【例12-2】JavaBean的調(diào)用示例文件TestBean.java。
importjavax.swing.*;
importjava.awt.*;
publicclassTestBeanextendsJFrame
{
JPaneljp=newJPanel();
Itemsbean1=newItems();
publicTestBean()
{ JTextFieldt1=newJTextField(10);
t1.setText(bean1.getItemName(0));
JTextFieldt2=newJTextField(10);
bean1.setItemName(1,"文學(xué)藝術(shù)");
t2.setText(bean1.getItemName(1));
setLayout(newBorderLayout());
jp.add(t1);jp.add(t2);
add(jp,BorderLayout.CENTER);
}publicstaticvoidmain(Stringargs[])
{
TestBeanf=newTestBean();
f.setTitle("測試JavaBean");
f.pack();
f.show();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}程序執(zhí)行結(jié)果如圖12-1所示,以getItemName()獲取索引index=0時的值為“書法繪畫”,顯示在TextField1中;以setItemName來改變index=1時的值,即由“文化藝術(shù)”變?yōu)椤拔膶W(xué)藝術(shù)”,顯示在TextField2中。圖12-1手工編寫JavaBean下面以數(shù)據(jù)庫訪問為例來說明JavaBean的使用。
在db.java源文件中,定義了連接數(shù)據(jù)庫、關(guān)閉數(shù)據(jù)庫連接和運行查詢的方法。在emp.java中emp類繼承db類,并實施了具體的查詢,并將結(jié)果以getXXX()的方式返回,便于其他應(yīng)用程序獲取。在TestBean.java中,創(chuàng)建emp的對象,并通過輸入的empno的值,傳遞給Bean中的查詢方法實施查詢,查詢后的結(jié)果以對象的getXXX()方法獲取,并輸出顯示。運行結(jié)果見圖12-2。12.5JavaBean與數(shù)據(jù)庫圖12-2JavaBean示例【例12-3】db.java文件。
packagedb;
import.*;
importjava.sql.*;
importjava.io.*;
publicclassdb
{
Connectionconn;
Statementstmt;
ResultSetrs;
publicvoidgetConnection(){try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
conn=DriverManager.getConnection(
"jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=D:\\Worker.mdb");
}
catch(Exceptione){System.out.println(e.getMessage());}
}
publicvoidcloseConnection()
{try
{if(conn!=null){conn.close();}
}
catch(Exceptione){System.out.println(e.getMessage());}
}
publicResultSetexecuteQuery(Stringsql)
{rs=null;
try
{
getConnection();
if(conn!=null)
{stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
}
}catch(Exceptione){System.out.println(e.getMessage());}
returnrs;
}
}【例12-4】emp.java文件。
packagedb;
importjava.sql.*;
publicclassempextendsdb
{
privateStringempno;
privateStringename;
privateStringjob;privateStringmgr;
privateStringhiredate;
privateStringsal;
privateStringcomm;
privateStringdeptno;
publicvoidquery()
{try
{
StringsSql="select*fromWorkerwhereempno='"+empno+"'";
ResultSetrs=executeQuery(sSql);
if(rs.next())
{ename=rs.getString("ename");
job=rs.getString("job");
mgr=rs.getString("mgr");
hiredate=rs.getString("hiredate");
sal=rs.getString("sal");
comm=rs.getString("comm");
deptno=rs.getString("deptno");
}
}catch(Exceptione){System.out.println(e.getMessage());}
}publicvoidsetempno(Stringem){empno=em;}
publicStringgetename(){returnename;}
publicStringgetDeptno(){returndeptno;}
publicStringgetHiredate(){returnhiredate;}
publicStringgetJob(){returnjob;}
publicStringgetMgr(){returnmgr;}
publicStringgetSal(){returnsal;}
publicStringgetComm(){returncomm;}
}【例12-5】TestBean.java文件。
packagedb;
importjava.io.*;
importjava.sql.*;
classTestBean
{
publicstaticvoidmain(Stringargs[])
{
Stringempno;
empem;
try{
System.out.print("請輸入工號:");
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
empno=br.readLine();
em=newemp();
em.setempno(empno);
em.query();
System.out.println("姓名:"+em.getename());System.out.println("職位:"+em.getJob());
System.out.println("上級:"+em.getMgr());
System.out.printl
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 濱州職業(yè)學(xué)院《小球類(乒乓球)》2023-2024學(xué)年第一學(xué)期期末試卷
- 濱州學(xué)院《應(yīng)用微生物技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 濱州科技職業(yè)學(xué)院《汽車企業(yè)管理與技術(shù)經(jīng)濟(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 濱州科技職業(yè)學(xué)院《Matab與工程計算綜合實驗》2023-2024學(xué)年第一學(xué)期期末試卷
- 畢節(jié)幼兒師范高等??茖W(xué)?!犊刂评碚摗?023-2024學(xué)年第一學(xué)期期末試卷
- 進(jìn)口紅酒購銷合同
- 保險法教案第二章保險合同
- 2025版貨車貨運信息平臺合作開發(fā)與推廣合同
- 幼兒園教師教育心得體會
- 管理軟件系統(tǒng)采購合同范本
- 2023年泰安市泰山城建集團(tuán)有限公司招聘筆試題庫及答案解析
- 分布式光伏發(fā)電項目建議書
- 高中化學(xué)必修1思維導(dǎo)圖(Word版zj)
- 2022年體育老師個人年終工作總結(jié)
- GB 18613-2020 電動機(jī)能效限定值及能效等級
- 指導(dǎo)小學(xué)生課外閱讀案例
- 全國婦聯(lián)統(tǒng)計軟件
- 【高中化學(xué)校本課程】《生活中的化學(xué)》校本教材
- 水資源管理培訓(xùn)材料課件
- 促銷活動方案(共29頁).ppt
- 農(nóng)民專業(yè)合作社財務(wù)報表(三張表)
評論
0/150
提交評論