Java 高级应用程序设计课件_第1页
Java 高级应用程序设计课件_第2页
Java 高级应用程序设计课件_第3页
Java 高级应用程序设计课件_第4页
Java 高级应用程序设计课件_第5页
已阅读5页,还剩206页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目標FlowLayout(流佈局管理器)

GridLayout(網格佈局管理器)

BorderLayout(邊界佈局管理器)

CardLayout(卡片佈局管理器)

BoxLayout(盒佈局管理器)

GridBagLayout(GridBag佈局管理器)

使用佈局管理器佈局介面2.1

佈局管理器種類

Java中設置佈局的類也叫佈局管理器(LayoutManager)。佈局管理器是執行佈局管理的特殊的對象,它確定容器的組件是如何組織和管理的。當創建一個容器時,Java自動地為它創建並分配一個默認的佈局管理器,它確定容器中控件的佈局。可在應用中為不同的容器創建不同的佈局管理器。

除BoxLayout外,所有的佈局類都在java.awt包中,是最頂層類java.lang.Object類的子類,並實現LayoutManager介面。Java中常用的佈局管理器分類如下:

FlowLayout(流佈局管理器)

GridLayout(網格佈局管理器)

BorderLayout(邊界佈局管理器)

CardLayout(卡片佈局管理器)

BoxLayout(盒佈局管理器)

GridBagLayout(GridBag佈局管理器)

為創建容器的佈局管理器,可調用setLayout(LayoutManager,layout)方法。而該方法以佈局類的實例為參數,所以應先創建相應的佈局類的實例。然後,為容器指出放置細件要用的佈局。FlowLayoutflowLayoutObj=newFlowLayout();JPanelpanelObj=newJPanel(flowLayoutObj);//以流佈局類對象為參數

2.2

FlowLayout(流佈局管理器)

JPanel的默認佈局管理器為FlowLayout。流佈局管理器以控件加入到容器的次序、按行一個接一個地放置控件。當該佈局管理器的控件到達此JFrame框架的右邊界時,它自動開始在下一行放置控件。

在默認狀態下,FlowLayout管理器使控件對準每一行的中心,其構造符函數如下:

FlowLayout(),創建一個流佈局管理器,位置以中心對齊並在組件之間留以5像素的水準和垂直間隔。

FlowLayout(intalign),創建一個流佈局管理器,位置按所指定的對齊方式並在組件之間留以5像素的水準和垂直間隔。

FlowLayout(intalign,inthgap,intvgap),創建一個流佈局管理器,位置按所指定的對齊方式並在組件之間按所指定的水準和垂直間隔。

2.3

GridLayout(網格佈局管理器)

流佈局管理器(FlowLayout)是JPanel默認佈局管理器,也是最簡單的佈局管理器。正如所看到的,它不能給你必要的控制以創建複雜的框架。

網格佈局管理器是流佈局管理器的擴展,網格佈局管理器把顯示編組為矩形格子,然後網格佈局管理器把創建的組件放入每一個格子,從左到右,自上向下地放置。網格佈局管理器和流佈局管理器不同的是它按指定的列數自動換行。

網格佈局管理器類似於流佈局管理器,以控件加入到容器的次序、按行一個接一個地放置控件。當控件的個數到網格的列時,它自動開始在下一行放置控件。

在默認狀態下,GridLayout管理器使控件對準每一矩形格的中心。GridLayout的構造符函數如下:

GridLayout(),創建一個默認為1行的網格佈局管理器,行佈局中所有組件大小相同。

GridLayout(introws,intcols),創建一個帶指定行數和列數的網格佈局管理器,佈局中所有組件大小相同。

GridLayout(introws,intcols,inthgap,intvgap),創建一個帶指定行數、列數、水準與垂直間距的網格佈局管理器,佈局中所有組件大小相同。

2.4

BorderLayout(邊界佈局管理器)JFrame容器默認為邊界佈局管理器(BorderLayout)。佈局方式按上北(north)、下南(south)、左西(west)、右東(east)和中(center)佈局。

BorderLayout的構造函數如下:

BorderLayout(),創建一個邊界佈局管理器。BorderLayout(inthgap,intvgap),以指定組件之間的水準與垂直間隔,創建一個邊界佈局管理器。

2.5

CardLayout(卡片佈局管理器)

最複雜的佈局管理器之一為卡片佈局管理器。用這個佈局管理器,可以創建如卡片盒之類的佈局盒,然後從一種佈局翻動到另一種佈局,要想實現這種翻動,涉及到下一章要講到的交互與事件處理機制。

CardLayout(),創建一個卡片佈局管理器。

panelObj.add(“card1”,buttonObj1);cardObj.show(panelObj,”card1”);cardObj.first(panelObj);

默認顯示第一張,為了在卡片堆中顯示想要的卡片,CardLayout類提供了如下所示的方法。

first(Containerparent)顯示第一張卡片

last(Containerparent)顯示最後一張卡片

next(Containerparent)顯示下一張卡片

previous(Containerparent)顯示上一張卡片

show(Containerparent)顯示所指定的卡片2.6

BoxLayout(盒佈局管理器)

盒佈局管理器(BoxLayout)在javax.swing包中。利用盒佈局管理器可在容器中水準和垂直地排列多個組件,類似網格佈局的一行和一列,不同的是組件大小不會因容器大小而改變,又類似於流佈局。

BoxLayout的構造函數與其他不同:

BoxLayout(Containertarget,intaxis)layoutObj=newBoxLayout(panelObj,BoxLayout.X_AXIS);

提示:一個容器只能使用一種類型的佈局管理器,任何一個較為複雜的介面佈局都不是一個容器和一種類型的佈局管理器所能完成的。一個容器可以作為一個單獨的控件加入另一個容器的佈局。例1:多個佈局管理器的例子。

例2:p135程式j06。

第六次課:BoxLayout(盒佈局管理器)綜合案例2.7

GridBagLayout(GridBag佈局管理器)GridBagLayout佈局管理器是java.awt包中提供的最靈活、同時又是最複雜的一種佈局管理器,它類似於網格佈局(GridLayout)。GridBagLayout佈局管理器把組件組織成長方形網格,使用這種佈局,可靈活地把組件放在長方形網格的任何行和列中,它也允許特定的組件跨多行和多列。

GridBagLayout類只有一個不帶任何參數的構造符。GridBagLayout類僅僅創建了一個佈局。為了指出諸如組件的位置和尺寸的約束,需要創建GridBagConstraints類的對象,調用GridBagConstraints類的屬性變數限制組件的位置和尺寸。GridBagConstraints類的屬性變數如下:gridx、gridy:指出組件所在的行數和列數,0開始。gridwidth、gridheight:指出組件跨的行數和列數anchor:指出組件在網格的方位(8個方位)

GridBagConstraints.NORTH

GridBagConstraints.NORTHEASTfill:是否充滿網格weightx、weighty:是否拉長組件

L6.1檔管理:File類

概念Java的java.io.File類是頂層類java.lang.Object的子類,在java.io包中,它提供了類似Windows資源管理器的一些功能,對檔和目錄進行操作,例如,創建和刪除目錄、檔,流覽檔等。

用File類訪問檔和目錄對象,它使用當前主機的操作系統的命名慣例,此類可用來創建檔和目錄對象。L6.1檔管理:File類

檔流的建立類File檔類(File)是一個經常使用的類,它並不一定代表一個實際的檔,儘管從名稱看起來是這樣。它可以代表一個檔或一個目錄。檔的生成publicFile(Stringpath);publicFile(Stringpath,Stringname);publicFile(Filedir,Stringname);檔對象的建立

Filefp=newFile(“tempfile.txt”);L6.1檔管理:File類

檔流的建立對檔操作要定義檔流FileInputStream類用來打開一個輸入檔FileOutputStream類用來打開一個輸出檔輸出檔輸入檔readwriteL6.1檔管理:File類

檔案名的位置檔案名的位置StringgetName();得到一個檔的名稱(不包括路徑)StringgetPath();得到一個檔的路徑名StringgetAbsolutePath();得到一個檔的絕對路徑名StringgetParent();得到一個檔的上一級目錄名StringrenameTo(FilenewName);將當前檔案名更名為給定檔的完整路徑L6.1檔管理:File類

檔屬性的測試檔屬性測試booleanexists();測試當前File對象所指示的檔是否存在booleancanWrite();測試當前檔是否可寫booleancanRead();測試當前檔是否可讀booleanisFile();測試當前檔是否是檔(不是目錄)booleanisDirectory();測試當前檔是否是目錄L6.1檔管理:File類

檔的描述普通檔資訊和工具longlastModified();得到檔最近一次修改的時間longlength();得到檔的長度,以位元組為單位booleandelete();刪除當前檔目錄操作booleanmkdir();根據當前對象生成一個由該對象指定的路徑Stringlist();列出當前目錄下的檔L6.1檔管理:File類

檔的順序處理對本機檔進行順序的讀/寫FileInputStream和FileOutputStream類用來進行檔I/O處理由它們所提供的方法可以打開本地主機上的檔並進行順序的讀/寫。FileInputStreamfis;try{fis=newFileInputStream("text"); System.out.print("contentoftextis:"); intb; while((b=fis.read())!=-1){ System.out.print((char)b); }}catch(FileNotFoundExceptione){ System.out.println(e);}catch(IOExceptione){ System.out.println(e);}

L6.1檔管理:File類

File類的構造符

File(Stringpathname),通過把給出的路徑名轉換為抽象路徑名,創建一個新的File實例。

File(Stringparent,Stringchild),由父路徑名和子路徑名,創建一個新的File實例。

File(Fileparent,Stringchild),由父File對象和子路徑名,創建一個新的File實例。

·

File類的構造符以路徑名、父路徑名和子路徑名,或File類對象和子路徑名為參數,File類的構造符只是構造了一個File類對象,此對象既可以是目錄、也可以是檔,需要調用相應的方法mkdir()和creatNewFile()創建目錄和文件。

L6.1檔管理:File類

File類的構造符步驟:

1.創建目錄對象。用構造函數創建目錄對象。

2.創建目錄。mkdir()方法是創建路徑中的當前目錄,其父目錄必須已經存在,否則創建不成功;mkdirs()方法創建路徑中的所有目錄。

3.創建檔對象。用構造函數創建檔對象。

4.創建檔。createNewFile()方法創建路徑中的檔,該方法拋棄異常,調用時必須捕捉這種異常,函數原型:publicbooleancreateNewFile()throwsIOException。

5.路徑分隔符號是雙反斜杠“\\”,因為Java是跨平臺的,在Windows操作系統下雙反斜杠“\\”轉換為“\”,在linux操作系統下雙反斜杠“\\”轉換為“/”。

L6.2流的定義和類型

6.2.1概念Java以流的形式處理所有的輸入和輸出數據流是Java程式中發送和接收數據的一個管道當發送數據流時——我們認為是在——寫數據流當接收數據流時——我們認為是在——讀數據流檔程式終端檔程式網路端點數據流起點終點網路端點檔,字串、存儲區L6.2流的定義和類型

6.2.1概念在Java中有關流的操作使用java.io.*出於安全的考慮,小應用默認是不能實現檔I/O流IOException無論什麼時候讀取或寫入數據流,都會阻塞所有的其他線程。所以,應將輸入和輸出數據流分開如果讀取或寫入數據流時發生錯誤那麼就拋出一個IOExceptionL6.2流的定義和類型

6.2.2輸入流(Java1.0的I/O體系)L6.2流的定義和類型

6.2.2輸入流(Java1.0的I/O體系)classjava.io.InputStream(抽象類)classjava.io.ByteArrayInputStream(從記憶體中提取字元緩衝區作為數據源)classjava.io.FileInputStream(從檔讀取資訊)classjava.io.FilterInputStream(對數據流進行輸入處理)classjava.io.BufferedInputStream(避免每次都進行物理性的讀取)classjava.io.DataInputStream(讀取一個流中的基本的數據類型)

classjava.io.LineNumberInputStream(不建議使用)

classjava.io.PushbackInputStream(有一個位元組的後推緩衝區,以便後推讀入上一個字元,

Java編譯器使用)classjava.io.ObjectInputStream(對象輸入流)classjava.io.PipedInputStream(實現管道化概念)classjava.io.SequenceInputStream(將兩個或更多的InputStream對象轉換成單個InputStream對象)classjava.io.StringBufferInputStream(不建議使用)L6.2流的定義和類型

6.2.2輸入流(Java1.1的I/O體系)classjava.io.Reader對應於(InputStream)classjava.io.BufferedReader對應於(BufferedInputStream)classjava.io.LineNumberReader對應於(LineNumberInputStream)classjava.io.CharArrayReaderclassjava.io.FilterReaderclassjava.io.PushbackReaderclassjava.io.InputStreamReaderclassjava.io.FileReader對應於(FileInputStream)classjava.io.PipedReaderclassjava.io.StringReader對應於(StringBufferInputStream)L6.2流的定義和類型

6.2.3輸出流(Java1.0的I/O體系)L6.2流的定義和類型

6.2.3輸出流(Java1.0的I/O體系)classjava.io.OutputStream(抽象類)classjava.io.ByteArrayOutputStreamclassjava.io.FileOutputStream(向檔輸出資訊)classjava.io.FilterOutputStream(對數據流進行輸出處理)classjava.io.BufferedOutputStream(避免每次物理性的寫入)classjava.io.DataOutputStream(向一個流中輸出基本的數據類型)classjava.io.PrintStream(控制顯示)classjava.io.ObjectOutputStream(對象輸出流)classjava.io.PipedOutputStream(實現管道化概念)L6.2流的定義和類型

6.2.3輸出流(Java1.0的I/O體系)classjava.io.Writer對應於(OutputStream)classjava.io.BufferedWriter對應於(BufferedOutputStream)classjava.io.CharArrayWriterclassjava.io.FilterWriterclassjava.io.OutputStreamWriterclassjava.io.FileWriter對應於(FileOutputStream)classjava.io.PipedWriterclassjava.io.PrintWriter對應於(PrintStream)classjava.io.StringWriter(無對應)L6.2流的定義和類型

6.2.4_標準的系統數據流標準的系統數據流(java.lang.System)標準輸出數據流——System.out把輸出送到缺省的顯示(通常是顯示器)print()、println()標準輸入數據流——System.in從標準輸入獲取輸入(通常是鍵盤)read()標準錯誤數據流——System.err把錯誤資訊送到缺省的顯示print()、println()每當main方法被執行時就自動生成上述三個對象L6.2流的定義和類型

6.2.4_處理流的基本類(InputStream和OutputStream)Java中每一種流的基本功能依賴於基本類InputStreamOutputStream它們是抽象類,不能直接使用L6.2流的定義和類型

6.2.4_位元組流與字元流的概念位元組流與字元流位元組流從InputStream和OutputStream派生出來的一系列類。這類流以位元組(byte)為基本處理單位。如:FileInputStream和FileOutputStream字元流從Reader和Writer派生出的一系列類,這類流以16位的Unicode碼表示的字元為基本處理單位。如:FileReader和FileWriter

流位元組流字元流sourcestreamsInputStream

ReadersinkstreamsOutputStreamWriterL6.2流的定義和類型

6.2.5FileInputStream和FileOutputStream類

讀或寫到特定位置(如磁片檔或記憶體)的輸入/輸出流稱為位元組流。Java提供java.io.InputStream類從源讀入數據字節,java.io.OutputStream類把數據字節寫到目的地。PX是所有輸入/輸出流的父類,儘管輸入/輸出流很多,但都是用在不同的場合,和文件輸入/輸出相關的是FileInputStream類

和FileOuputStream類

。FileInputStream類的構造函數如下:

FileInputStream(Stringname),創建一個新的FileInputStream對象,該對象和參數所指定的檔相連,該檔必須是在系統中已經存在的。

FileInputStream(Filefile),創建一個新的FileInputStream對象,該對象和參數所指定的File檔相連。L6.2流的定義和類型

6.2.5FileInputStream和FileOutputStream類FileInputStream類繼承InputStream抽象類的方法

intread()由檔讀入1個位元組的數據intread(byte[]buffer)由檔讀入n個位元組的數據,並存儲在位元組數組中。intread(byte[]buffer,intoffset,intlength)

從第2個參數開始,讀取第3個參數長度的位元組的數據,並存儲在位元組數組中。Intclose()

關閉輸入流,並釋放與他有聯繫的數據。L6.2流的定義和類型

6.2.5FileInputStream和FileOutputStream類FileOutputStream類的構造函數如下:FileOutputStream(Stringname),創建一個新的FileOutputStream對象,該對象和參數所指定的檔相連,該檔必須是在系統中已經存在的。FileOutputStream(Filefile),創建一個新的FileOutputStream對象,該對象和參數所指定的檔相連,該檔不一定是在系統中已經存在的。L6.2流的定義和類型

6.2.5FileInputStream和FileOutputStream類

FileOutputStream類繼承OuputStream抽象類的方法

intwrite()intwrite(byte[]buffer)intwrite(byte[]buffer,intoffset,intlength)Intclose()L6.2流的定義和類型

6.2.5FileInputStream和FileOutputStream類注意:構造函數FileInputStream()和ileOutputStream()拋出FileNotFoundException異常,方法read()、write()、close()拋出IOException異常,必須捕捉該異常。read(byte[])當讀到檔末尾時返回-1System.out.println(String)需將byte[]型數據轉換為String類型,方法為Stringstr=newString(byArry); 下麵的例子是使用FileInputStream類和FileOutputStream類讀入Text1.dat檔的數據(內容),把數據顯示到螢幕,並寫入到Text2.dat檔L6.2流的定義和類型

6.2.6連接輸入流:SequenceInputStream類·

SequenceInputStream類,用於將多個輸入流順序連接起來,使它們看起來就像一個比較長的流。

順序輸入流提供了把若干個不同的流統一為同一個流的功能。下麵是一個順序輸入流的例子,該例子的目的是構造一個順序輸入流,將當前路徑下的test1.dat和test2.dat檔中的內容讀取出來,並輸出到test3.dat檔,並顯示到螢幕。SequenceInputStream類的構造方法:

publicSequenceInputStream(inputStrinms1,inputStrinms2L6.2流的定義和類型

6.2.7過濾流:FilterInputStream和FilterOutputStream類在java.io包中,FilterInputStream和FilterOutputStream類是所有過濾輸入流和輸出流的父類,它們是抽象類,本身不能生成任何實例,必須被其他類繼承。

FilterInputStream和FilterOutputStream類具有自己的子類,分別實現了幾個特殊的過濾輸入流和輸出流,利用這些特殊輸入流和輸出流的實例可以進行流的處理。

下麵介紹幾個過濾輸入流和輸出流的子類:

DataInputStream和DataOutputStream

這兩個類不僅能讀寫數據流,而且能以與機器無關的格式讀寫各種各樣的Java語言本身固有的數據類型,例如char、int、float等。

BufferedInputStream和BufferedOutputStream這兩個類實現了帶緩衝的過濾流,在系統讀取數據的同時進行緩存,將任意的輸入流和輸出流綁定到緩衝流上,提高運行效率。對於BufferedInputStream類,數據首先寫入緩衝區,當緩衝區滿時,緩衝區中的數據寫入連接的輸出流,使用BufferedInputStream類提供的方法flush()可以強制將緩衝區的內容全部寫入輸出流。

L6.2流的定義和類型

6.2.7過濾流:FilterInputStream和FilterOutputStream類例:對於某些流來說(比如FileInputStream),它們可以從一些檔等地方讀入位元組數據。而對另一些流來說(比如DataInputStream),它們則可以將位元組“組裝”成更有用的數據類型。Java程式員必須綜合運用這兩種流,將其和並成所謂的“過濾流”。為了能從檔中讀取數字,首先要創建一個FileInputStream,然後將其傳遞給一個DataInputStream的構件器。如下:

FileInputStreamfin=newFileInputStream(“employee.dat”);DataInputStreamdin=newDataInputStream(fin);doubles=din.readDouble();L6.2流的定義和類型

6.2.7過濾流:FilterInputStream和FilterOutputStream類DataInputStream、DataOutputStream一種較為高級的數據輸入輸出方式,除了位元組和位元組數組,還可以處理int,float,boolean等類型.還可以用readLine方法讀取一行資訊。可使用的方法:1.write,writeBoolean……

2.read,readByte……

例:dos.writeBoolean(true);dos.writeByte((byte)35);dos.writeChar('A');dos.writeDouble(3.1415926);dos.writeFloat(3.14F);dos.writeInt(123456789);dos.writeLong(9876543210L);dos.writeShort((short)1024);DataIOTest.javaL6.3用RandomAccessFile類讀寫檔

隨機存取檔隨機訪問意味著可以從檔的任意位置讀出或向檔的任意位置寫入RandomAccessFile類extendsObjectimplementsDataInput,DataOutputL6.3用RandomAccessFile類讀寫檔

隨機存取檔創建一個隨機訪問檔Withthefilename:myRAFile=newRandomAccessFile(Stringname,Stringmode);WithaFileobject:myRAFile=newRandomAccessFile(Filefile,Stringmode);L6.3用RandomAccessFile類讀寫檔

隨機存取檔支持隨機檔操作的方法:Byte[]readBytes();把指定字串作為位元組寫到檔IntwriteBytes(String);從檔中讀入指定個數的位元組到位元組數組seek(longpos);將指針調到所需位置getFilePointer();返回指針當前位置Longlength();返回檔長度L6.4字元讀入/寫出

6.4.1Reader和WriterOutputStreamWrite類Java.io.OutputStreamWriter用作OutputStream和Writer之間的轉換器InputStreamRead類Java.io.InputStreamRead用作InputStream和Read之間的轉換器L6.4字元讀入/寫出

6.4.1Reader和Writer

輸入流(InputerStream)和輸出流(OutputerStream)的子類以位元組的形式讀入和寫出數據。讀入器(Reader)和寫出器(Writer)的子類以字元的形式讀入和寫出數據。Reader和Writer類是所有字元輸入/輸出的父類,Reader和Writer類都是抽象類,支持Unicode字元流的讀和寫,Unicode字元以16位表示每個字元數據,而位元組以8位工作,因此,以字元形式輸入/輸出速度更快、功能更強。這些16位版本的流稱為讀入器(Reader)和寫入器(Writer),能夠快速地傳輸數據。

L7.1JDBC技術概述

什麼是JDBCJDBCJava資料庫連接

(JavaDatabaseConnectivity,JDBC)JDBC在設計上和ODBC很相似。由於ODBC驅動程式被廣泛使用,首先建立JDBC_ODBC橋接器,使得JDBC有能力訪問幾乎所有類型的資料庫。JDBCAPI是作為Java2標準版(J2SE)和Java2企業版(J2EE)平臺的一個關鍵部分出現的。它是一種主要的基於標準的機制,能讓Java語言通過編程來訪問關係資料庫。L7.1JDBC技術概述

什麼是JDBCJDBC的兩種主要介面JDBC主要有兩種介面,分別是面向程式開發人員的JDBCAPI和麵向底層的JDBCDRIVERAPI.JDBCAPI使用一系列抽象的介面,它使得應用程式員能夠進行資料庫連接,執行SQL聲明,並且得到返回結果.

JDBCDriverAPI是面向驅動程式開發商的編程介面,對於大多數資料庫驅動程式來說,僅僅實現JDBCAPI提供的抽象的類就可以了.L7.1JDBC技術概述

什麼是JDBCJDBCAPI使用一系列抽象的介面:1.java.sql.DriverManager:用來處理裝載驅動程式並且為創建新的資料庫連接提供支持.

2.java.sql.Connection:完成對一指定資料庫連接的功能.3.java.sql.Statement:在一個給定的連接中作為SQL執行聲明的容器,他包含了兩個重要的子類型.

4.java.sql.PreparedStatement:用於執行,編譯的SQL聲明.

5.java.sql.CallableStatement:用於執行數據庫中存儲的過程的調用.

6.java.sql.ResultSet:控制對於某一給定聲明取得結果列的途徑.L7.1JDBC技術概述

什麼是JDBCJDBC可以不依賴於網路環境來工作Java成為編寫世界級應用程式的一個最合適的語言平臺,JDBC起了關鍵作用。JDBC允許Applet,Servlet程式以及獨立的應用程式以通用的方式訪問在RDBMS中的數據L7.1JDBC技術概述

什麼是JDBCJDBC提供一個標準的庫,用以訪問關係資料庫.利用一個單獨的標準的API(JDBCAPI)建立連接,不用考慮DBMSJDBC的API類庫位於

java.sql包中JDBC不是嵌入式結構化查詢語言JDBCAPI不是標準的SQL語法JDBCAPI已經成為了許多不同API(如JNDI、JTS、JavaBeans)之間提供交互操作性能的核心資料庫已經不再是應用程式的數據源資料庫更大意義是為Java對象提供持續的服務。L7.1JDBC技術概述

什麼是JDBC安全性問題java作為網路應用就相應的需要考慮安全性問題.在Javaapplication這種使用方法下,Java的代碼是本地的,因此是可信任的.同樣出於安全性考慮,可信任的applet也可歸為此類。

相反,如一個Java的applet是不可信任的,就不能允許存取本地機上的檔或是其他網路數據.L7.1JDBC技術概述

什麼是JDBC安全性問題

1)JDBC和不可信任的appletsJDBC必須遵守標準的applet的安全模式。

*JDBC必須保證普通的無標誌的applet是不可信任的.

*JDBC將不允許不可信任的applet存取本地的資料庫系統的數據.

*如果下載了一個已向JDBCDriverManager註冊的JDBC驅動程式,那麼只有與該驅動程式從同一伺服器上下載的代碼中提出的連接要求,JDBC才能利用驅動程式來進行連接。

*一個不可信任的applet通常只能對他所下載的伺服器進行資料庫連接。

*在與遠程資料庫伺服器進行連接時,JDBC應當避免自動或是盲目使用本地機上的私有資訊。L7.1JDBC技術概述

什麼是JDBC安全性問題

2)JDBC和Java的應用程式(包括除不可信任的applet外的所有Java代碼)。JDBC將很迅速的從本地路徑上裝載驅動程式,並且允許應用程式自由存取檔的遠程伺服器等,而對於applet來說,如果從一個遠程伺服器上下載一個不可信任的sun.sql.Driver類,那麼這個Driver只能於從同一源伺服器上下載的代碼一起使用。

3)網路的安全性:對於JDBC的用戶來說,有關資料庫操作的安全性以及在網路上尤其是在Internent上數據的傳輸問題也是一個很重要的值的考慮的問題.L7.1JDBC技術概述

線上資源線上資源Sun’sJDBCSitehttp://java.sun.com/products/jdbc/JDBCTutorialhttp://java.sun.com/docs/books/tutorial/jdbc/ListofAvailableJDBCDrivershttp://industry.java.sun.com/products/jdbc/drivers/APIforjava.Sqlhttp://java.sun.com/j2se/1.3/docs/api/java/sql/package-summary.htmlL7.1JDBC技術概述

JDBC的基本特徵調用級SQL介面JDBC是一個Java語言在客戶機上使用的調用級介面JDBC完全獨立於多種DBMSJDBC是一個低級的應用程式編程介面允許Java程式發出SQL語句並獲取結果同時也提供了管理和警告的方法應用程式

JDBC

代碼DBMSmydbL7.1JDBC技術概述

JDBC的基本特徵與SQL的一致性JDBC允許使用屬於DBMS的任何查詢語句支持ANSISQL-92Entrylevel標準可以使用盡可能多的SQL功能一致的APIJDBC使用健壯、靜態的數據類型方便、簡單L7.1JDBC技術概述

JDBC組件JDBC連接資料庫的典型結構通常由4個必要組件定義應用程式驅動程式管理器驅動程式數據源L7.1JDBC技術概述

JDBC組件——數據源數據源由用戶應用程式想訪問的數據源和自身參數組成Java應用程式JDBC管理器JDBC

網路驅動程式AJDBC-ODBC

橋JDBC

驅動程式CJDBC

驅動程式DODBC

驅動程式B原始

驅動程式C原始

驅動程式C數據源A數據源B數據源C數據源DJDBC介面JDBC驅動

程式介面L7.2JDBC的應用

應用JDBC的七個基本步驟七個基本步驟1.裝載驅動程式2.定義連接的URL3.建立連接關係4.創建一個Statement對象5.執行一個查詢6.處理結果集7.關閉連接L7.2JDBC的應用

Step1——裝載驅動程式裝載驅動程式應用Class類的forName()方法註冊JDBC-ODBC橋驅動程式

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

註冊Oracle資料庫廠商提供的JDBC驅動程式Class.forName("oracle.jdbc.driver.OracleDriver");建立橋接器時可能發生異常,需要捕獲這個異常Try{class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}Catch(ClassNotFoundEXceptione){}L7.2JDBC的應用

Step2——定義連接的URL定義連接的URL

JDBCURL是提供識別資料庫的途徑的字串JDBCURL分三部分

<協議>:<子協議>:<子名>

jdbc:subprotocolname:other_stuff在JDBCURL中,<協議>總是jdbc;<子協議>是驅動程式的名字或一種資料庫連通機制的名字如果檢索數據的機制是ODBC-JDBC橋驅動程式子協議必須是odbc<子名>用於確定資料庫

other_stuff(子名)參數的格式取決於使用的子協議。Sun建議:如果網址是other_stuff參數的一部分,最好用標準URL命名形式://hostname:port/otherJDBCL7.2JDBC的應用

Step2——定義連接的URL定義連接的URL(SB2.6)mydbJDBCjdbc:mydbdrv://:8192/mydbport:8192URLL7.2JDBC的應用

Step2——定義連接的URL定義連接的URL例1

Stringurl="jdbc:odbc:MyDataSource";

這個url表示用JDBC/ODBC網橋訪問一個名為MyDataSource的ODBC源資料庫。例2

Stringurl=“jdbc:oracle:thin:@6:1521:ORCL”;

這個url表示用Oracle資料庫廠商提供的一個純Java庫驅動程式,直接把JDBC請求轉換成指定資料庫協議接收的請求。L7.2JDBC的應用

Step3——建立連接關係建立連接關係驅動程式將在URL中尋找已登記的JDBC驅動程式,以使與指定的數據源建立連接。(注:也有其他方法)Connection對象java.SQl.Connection表示和數據庫的連接在應用程式中可有多個連接對象連接到一個或多個數據庫L7.2JDBC的應用

Step3——建立連接關係建立連接關係getConnection()方法初始化Connection對象,如:

Stringurl=“jdbc:Odbc:MyDatasource”;

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

connectioncon=DriverManager.getConnection(url,數據源的loginname,數據源的password);建立連接時應捕獲SQLException異常try{connectioncon=DriverManager.getConnection(url,數據源的loginname,數據源的password);}Catch(SQLEXceptione){}L7.2JDBC的應用

Step3——建立連接關係3.建立連接關係應用案例■使用協議是JDBC■

使用的驅動程式是JDBC-ODBC橋■ODBC數據源是mysource■用戶名是javauser■

密碼是hotjavaStringURL="jdbc:odbc:mysource"Stringusername="javauser";Stringpassword="hotjava";Try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connectionconnection=DriverManager.getConnection(URL,username,password); //……

connect.close() }catch(Exceptione){System.out.println("Aproblemoccrued duringtheestablishoftheconnection"+e) }L7.2JDBC的應用

Step4——創建一個Statement對象創建一個Statement對象用Satement對象發送簡單查詢給資料庫創建語法Statementstatement=connection.createStatement();

用connection對象的createStatement()方法創建Statement對象L7.2JDBC的應用

Step5——執行一個查詢執行一個查詢用Statement對象的executeQuery()方法執行一個簡單的查詢

編輯資料庫時,可使用Statements對象的executeUpdate()方法,執行帶UPDATE,INSERT或DELETE的SQL語句Statements對象的execute()方法執行一個SQL語句,可能返回多個結果使用Statements對象的setQueryTimeout()方法,設置獲得結果的最大延遲時間。Stringquery="SELECTcol1,col2,col3FROMsometable";resultSetresult=statement.executeQuery(query);L7.2JDBC的應用

Step6——處理結果集處理結果集結果集由數據行組成,可以在一個迴圈中使用resultSet.next()方法來訪問並獲取每行數據一個結果集維持一個指向當前行的指針最初這個指針指向第一行之前,所以需調用resultSet.next()方法訪問第一行,然後再進行處理連續調用next()方法將使指針依次指向結果集各行當沒有下一行時,返回值是false。

===================

===================

===================

===================

===================

resultSet.next();數據行結果集第一列的序號為1而不是0L7.2JDBC的應用

Step6——處理結果集處理結果集代碼樣例——獲得行資訊while(resultSet.next()){ System.out.println( resultSet.getString(1)+""+ resultSet.getString(2)+""+ resultSet.getString(3));}處理結果集使用Metadata方法獲得關於列和數據類型資訊因為組成基本表的某一行,可能由許多不同類型的列組成。獲得列數

intcolNum=getMetaData().getColumnCount();獲得列名

StringcolName=getMetaData().getColumnLabel(inti);L7.2JDBC的應用

Step6——處理結果集L7.2JDBC的應用

Step6——處理結果集訪問列java.sql中的介面ResultSetMetaData可以利用一個列索引或列名迴圈來獲得ResultSetMetadata對象中的列L7.2JDBC的應用

Step6——處理結果集訪問列通過getXXX()方法,可釋放包含在結果集列中的值,以便訪問行的內容L7.2JDBC的應用

Step6——處理結果集訪問列getXXX()方法的兩種形式通過列索引訪問getXXX(intcolumnIndex)通過列名訪問getXXX(StringcolumnName)java.sql.*java.io.*java.sqlInterfaceResultSetL7.2JDBC的應用

Step6——處理結果集訪問列bytegetByte(int/String)DategetDate(int/String)doublegetDouble(int/String)floatgetFloat(int/String)intgetInt(int/String)longgetLong(int/String)StringgetString(int/String)L7.2JDBC的應用

Step6——處理結果集可滾動結果集當需要在結果集中前後移動、或顯示結果集指定的一條記錄時,需要得到一個可滾動的結果集。先用下述方法獲得一個Statement對象。Statementstmt=con.createStatement(inttype,intconcurrency);type:ResultSet.TYPE_FORWARD_ONLYResultSet.TYPE_SCROLL_INSENSITIVE(資料庫變化時當前結果集不變)ResultSet.TYPE_SCROLL_SENSITIVE(資料庫變化時當前結果集同步改變)concurrency:ResultSet.CONCUR_READ_ONLY(不能用結果集更新資料庫中的表)ResultSet.CONCUR_UPDATETABLE(能用結果集更新資料庫中的表)L7.2JDBC的應用

Step6——處理結果集可滾動結果集Publicbooleanprevious()將游標上移PublicbooleanbeforeFirst()將游標移到第一行之前PublicbooleanafterLast()將游標移到結果集最後一行之後Publicbooleanfirst()將游標移到結果集的第一行Publicbooleanlast()將游標移到結果集的最後一行PublicintgetRow()得到當前游標所指的行號,行號從第1開始,結果集沒有行返回0。Publicbooleanabsolute(introw)將游標移到參數row指定的行號。L7.2JDBC的應用

Step7——關閉連接關閉連接

connection.close();L7.2JDBC的應用

編寫JDBC程式例:建立數據源

ODBC在對數據庫進行連接時,必須給出數據源的名稱。首先,使用ACCESS建立所需的資料庫檔。1.建立資料庫檔2.建立好資料庫後,需要建立數據源

1)打開控制面板,選擇ODBC項

2)選擇Add

3)選擇MicrosoftAccessDriver.(若沒有此項,應先安裝ODBC驅動程式)

4)在DataSourceName一項中填入數據源名,以後對此數據源的引用要通過數據源名來實現.最後按ok完成操作.L7.2JDBC的應用

編寫JDBC程式例:與資料庫建立連接

所有JDBC程式的第一步都是與資料庫建立連接.用戶將得到一個java.sql.connection類的對象。

Connectioncon1=DriverManager.getConnection("jdbc:odbc:"+datasource);加載驅動程式Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

程式:JdbcTest.javaL3.1事件處理基礎介面介面在Java語言中,一個介面不是一個類,而是對符合介面需求的類的一套規範。“interface”(介面)關鍵字使抽象的概念更深入了一層。我們可以將其想像為一個“純”抽象類。它允許創建者規定一個類的基本形式:方法名、引數列表以及返回類型,但不規定方法主體。介面包含的數據成員,默認為static和final。所有的方法都默認為public和abstract。不能在介面中說明一個private或protected的變數或方法。並且方法不能定義成final創建介面,請使用interface關鍵字,而不要用class。我們可以在interface關鍵字的前面增加public關鍵字,或者省略默認為“友好的”介面不是類,不能實例化。在Java中不支持多重繼承,但可以通過介面實現“多重繼承”機能。L3.1事件處理基礎介面介面的聲明

利用extends關鍵之,可以方便地位一個介面添加新的方法聲明。定義一個介面L3.1事件處理基礎介面介面的使用若要一個類實現一個介面,需採取下麵兩個步驟:聲明類需要實現的指定介面。提供介面中所有方法的定義。聲明一個類實現一個介面需要使用implements關鍵字。

如果實現介面的類中沒有提供介面中所有方法的定義,則該類為抽象類例:

publicclassStockAppletextendsApplet

implementsStockWatcher{...publicvoidvalueChanged(StringtickerSymbol,doublenewValue){if(tickerSymbol.equals(sunTicker)){...}elseif(tickerSymbol.equals(oracleTicker)){...}elseif(tickerSymbol.equals(ciscoTicker)){...}}}L3.1事件處理基礎內部類內部類(innerclass)是一個被定義於另一個類中的類。它們也稱為嵌套類。使用內部類原因:一個內部類的對象可訪問創建它的對象的實現—包括私有數據。對於同一包中的其他類來說,內部類能夠隱藏起來。匿名內部類可以很方便的定義回調。在編寫事件驅動程式時,內部類非常方便。注意:只有內部類才可以時“靜態的”和“私有的”。L3.1事件處理基礎內部類內部類的語法:1:內部類

<修飾符>class<類名>{

<修飾符>class<內部類名>{}//其他屬性和方法}2:局部內部類<修飾符>class<類名>{[<訪問說明符>][<修飾符>]方法的返回值類型方法名稱(參數1,參數2,…){

…//方法的內容

<修飾符>class<內部類名>{}}//其他屬性和方法}L3.1事件處理基礎內部類例:內部類

publicclassStack{privateVectoritems;

...//codeforStack'smethodsandconstructorsnotshown...

publicEnumerationenumerator(){returnnewStackEnum();}classStackEnumimplementsEnumeration{intcurrentItem=items.size()-1;publicbooleanhasMoreElements(){return(currentItem>=0);}publicObjectnextElement(){if(!hasMoreElements())thrownewNoSuchElementException();elsereturnitems.elementAt(currentItem--);}}}L3.1事件處理基礎內部類例:局部內部類

publicvoidstart(finaldoublerate){classInterestAdderimplementsActionListener{publicvoidactionPerformed(ActionEventevent){……}}ActionListeneradder=newInterestAdder();...…}L3.2事件處理

L3.2.1什麼是事件事件-描述發生了什麼的對象如果用戶在用戶介面層執行了一個動作(滑鼠點擊和按鍵),這將導致一個事件的發生。事件是描述發生了什麼的對象。存在各種不同類型的事件類用來描述各種類型的用戶交互。事件源-事件的產生器事件源是一個事件的產生者。例如,在Button組件上點擊滑鼠會產生以這個Button為源的一個ActionEvent.這個ActionEvent實例是一個對象,它包含關於剛才所發生的那個事件的資訊的對象。這些資訊包括:getActionCommand-返回與動作相關聯的命令名稱。GetModifiers-返回在執行動作時持有的修飾符。

對EventObj類getSource()-返回對事件源的引用。事件處理器-接收事件、解釋事件並處理用戶交互的方法L3.2.2

JDK1.0、JDK1.2的事件模型比較

JDK1.0事件模型——層次模型

層次模型是基於容器的。事件先發送到組件,然後沿容器層次向上傳播。沒有被組件處理的事件會自動地繼續傳播到組件的容器。優點簡單,而且非常適合面向對象的編程環境。缺點事件只能由產生這個事件的組件或包含這個組件的容器處理。為了處理事件,你必須定義接收這個事件的組件的子類,或者在基容器創建handleEvent()方法。L3.2.2

JDK1.0、JDK1.2的事件模型比較

JDK1.2事件模型——委託模型

委託事件模型是在JDK1.1中引入的。在這個模型中,事件被送往產生這個事件的組件,然而,註冊一個或多個稱為監聽者的類取決於每一個組件,這些類包含事件處理器,用來接收和處理這個事件。採用這種方法,事件處理器可以安排在與源組件分離的對象中。監

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论