• Đối tƣợng Connection chứa liên kết
trực tiếp đến csdl.
• Sử dụng đối tƣợng Connection để tạo
đối tƣợng Statement.
– Statement s = con.createStatement();
• Đối tƣợng này có nhiệm vụ gửi các câu
lệnh sql đến csdl.
• executeQuery(String) or
executeUpdate(String) method
• Cùng một đối tƣợng Statement có thể
sử dụng cho nhiều câu lệnh sql khác
nhau.
239 trang |
Chia sẻ: huongthu9 | Lượt xem: 449 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng lập trình Java - Huỳnh Công Pháp, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
lớp duy nhất trong cùng một thời
điểm, nhƣng có thể dẫn xuất cùng lúc
nhiều Interfaces
• Không đƣợc phép có những phƣơng
thức cụ thể (concrete methods)
• interface cần phải đƣợc hiện thực
(implements).
Các bƣớc tạo interface
• Định nghĩa Interface
• Biên dịch Interface
• Hiện thực Interface
• Tính chất của interface:
– Tất cả phƣơng thức trong interface phải là
public.
– Các phƣơng thức phải đƣợc định nghĩa
trong lớp dẫn xuất giao diện đó.
Sử dụng Interface
• Không thể dẫn xuất từ lớp khác, nhƣng có
thể dẫn xuất từ những interface khác
• Nếu một lớp dẫn xuất từ một interface mà
interface đó dẫn xuất từ các interface khác
thì lớp đó phải định nghĩa tất cả các phƣơng
thức có trong các interface đó
• Khi định nghĩa một interface mới thì một kiểu
dữ liệu tham chiếu cũng đƣợc tạo ra.
Gói (Packages)
• Tƣơng tự nhƣthƣ mục lƣu trữ những
lớp, interface và các gói con khác. Đó
là những thành viên của gói
• Những ƣu điểm khi dùng gói (Package):
– Cho phép tổ chức các lớp vào những đơn
vị nhỏ hơn
– Giúp tránh đƣợc tình trạng trùng lặp khi
đặt tên.
– Cho phép bảo vệ các lớp đối tƣợng
– Tên gói (Package) có thể đƣợc dùng để
nhận dạng chức năng của các lớp.
• Những lƣu ý khi tạo gói:
– Mã nguồn phải bắt đầu bằng lệnh „package‟
– Mã nguồn phải nằm trong cùng thƣ mục mang tên
của gói
– Tên gói nên bắt đầu bằng ký tự thƣờng (lower case)
để phân biệt giữa lớp đối tƣợng và gói
– Những lệnh khác phải viết phía dƣới dòng khai báo
gói là mệnh đề import, kế đến là các mệnh đề định
nghĩa lớp đối tƣợng
– Những lớp đối tƣợng trong gói cần phải đƣợc biên
dịch
– Để chƣơng trình Java có thể sử dụng những gói
này, ta phải import gói vào trong mã nguồn
• Import gói (Importing packages):
– Xác định tập tin cần đƣợc import trong gói
– Hoặc có thể import toàn bộ gói
Các bƣớc tạo ra gói
(Package)
• Khai báo gói
• Import những gói chuẩn cần thiết
• Khai báo và định nghĩa các lớp đối
tƣợng có trong gói
• Lƣu các định nghĩa trên thành tập tin
.java, và biên dịch những lớp đối tƣợng
đã đƣợc định nghĩa trong gói.
Sử dụng những gói do ngƣời dùng định
nghĩa (user-defined packages)
• Mã nguồn của những chƣơng trình này phải ở
cùng thƣ mục của gói do ngƣời dùng định
nghĩa.
• Để những chƣơng trình Java khác sử dụng
những gói này, import gói vào trong mã nguồn
• Import những lớp đối tƣợng cần dùng
• Import toàn bộ gói
• Tạo tham chiếu đến những thành viên của gói
Xác lập CLASSPATH
• Là danh sách các thƣ mục, giúp cho
việc tìm kiếm các tập tin lớp đối tƣợng
tƣơng ứng
• Nên xác lập CLASSPATH trong lúc
thực thi (runtime), vì nhƣ vậy nó sẽ xác
lập đƣờng dẫn cho quá trình thực thi
hiện hành
Gói và điều khiển truy xuất
(Packages & Access Control)
Gói java.lang
• Mặc định thì bất cứ chƣơng trình Java
nào cũng import gói java.lang
• Những lớp Wrapper (bao bọc) cho các
kiểu dữ liệu nguyên thủy:
Lớp String
• Phƣơng thức khởi tạo (Constructor):
– String str1 = new String();
– String str2 = new String(“Hello World”);
– char ch[ ] = {“A”,”B”,”C”,”D”,”E”};
– String str3 = new String(ch);
– String str4 = new String(ch,0,2);
String Pool
• „String Pool‟ đại diện cho tất cả các ký
tự đƣợc tạo ra trong chƣơng trình
• Khái niệm „String Pool‟
NHỮNG PHƢƠNG THỨC CỦA LỚP
STRING
• charAt( )
• startsWith()
• endsWith( )
• copyValueOf( )
• toCharArray( )
• indexOf( )
• toUpperCase( )
• toLowerCase( )
• trim( )
• equals( )
Lớp StringBuffer
• Cung cấp những phƣơng thức khác nhau để
thao tác trên đối tƣợng string (chuỗi ký tự)
• Những đối tƣợng của lớp này khá linh hoạt
• Cung cấp những phƣơng thức khởi tạo
(constructor) đã đƣợc nạp chồng
(overloaded)
• Những phƣơng thức của lớp StringBuffer:
– append( )
– insert( )
– charAt( )
– setCharAt( )
– setLength( )
– getChars( )
– reverse( )
LỚP JAVA.LANG.MATH
• abs()
• ceil()
• floor()
• max()
• min()
• round()
• random()
• sqrt()
• sin()
• cos()
• tan()
Lớp Runtime
• Đóng gói (Encapsulates) môi trƣờng thực thi
• Dùng để quản lý bộ nhớ, và thi hành những
tiến trình cộng thêm
• Phƣơng thức:
– exit(int)
– freeMemory( )
– getRuntime( )
– gc( )
– totalMemory( )
– exec(String)
Lớp System
• Cung cấp những hạ tầng chuẩn nhƣ nhập
(Input), xuất (Output) và các luồng lỗi(Error
Streams)
• Cung cấp khả năng truy xuất đến những
thuộc tính của hệ thống thực thi Java, và
những thuộc tính môi trƣờng nhƣ phiên bản,
đƣờng dẫn, nhà cung cấp
• Phƣơng thức:
– exit(int)
– gc()
– getProperties()
– setProperties()
– currentTimeMillis()
– arraCopy(Object, int, Object, int, int)
Lớp Class
• Thể hiện (Instance) của lớp này che
giấu tình trạng thực thi của đối tƣợng
trong một ứng dụng Java
• Đối tƣợng hoặc thể hiện của lớp này có
thể tạo ra bằng 1 trong 3 cách sau:
– Sử dụng phƣơng thức getClass( ) của đối tƣợng
– Sử dụng phƣơng thức tĩnh forName( ) của lớp để
tạo ra một thể hiện của lớp đó trong lúc đặt tên
cho lớp
– Sử dụng đối tƣợng ClassLoader để nạp một lớp
mới
Lớp Object
• Là lớp cha (superclass) của tất cả các lớp
• Phƣơng thức:
– equals(Object)
– finalize()
– notify()
– notifyAll()
– toString()
– wait()
Gói java.util
• Cung cấp phần lớn những lớp Java
hữu dụng và thƣờng xuyên cần đến
trong hầu hết các ứng dụng
• Giới thiệu những lớp trừu tƣợng sau:
– Hashtable
– Random
– Vector
– StringTokenizer
Lớp Hashtable
• Mở rộng lớp trừu tƣợng Dictionary
• Dùng để nối kết những khóa vào những
giá trị cụ thể
• Phƣơng thức khởi tạo Hashtable:
– Hashtable(int)
– Hashtable(int, float)
– Hashtable( )
NHỮNG PHƢƠNG THỨC CỦA LỚP
HASHTABLE
• clear()
• done()
• contains(Object)
• containsKey(Obj
ect)
• elements()
• get(Object key)
• isEmpty()
• keys()
• put(Object, Object)
• rehash()
• remove(Object
key)
• size()
• toString()
Lớp Random
• Tạo ra những số ngẫu nhiên theo thuật toán
pseudo
• Những phƣơng thức nhận giá trị ngẫu nhiên:
– nextDouble( )
– nextFloat( )
– nextGaussian( )
– nextInt( )
– nextLong( )
• Phƣơng thức khởi tạo (Constructors):
– random()
– random(long)
Những phƣơng thức của lớp
Random
• nextDouble()
• nextFloat()
• nextGaussian()
• nextInt()
• nextLong()
• setSeed(long)
Lớp Vector
• Cung cấp khả năng co giản cho mảng khi
thêm phần tử vào mảng
• Lƣu trữ những thành phần của kiểu Object
• Một Vector riêng rẽ có thể lƣu trữ những
phần tử khác nhau, đó là những instance của
những lớp khác nhau
• Phƣơng thức khởi tạo (Constructors):
– Vector(int)
– Vector(int, int)
– Vector()
NHỮNG PHƢƠNG THỨC CỦA LỚP
VECTOR
• addElement(Object)
• capacity( )
• clone( )
• contains(Object)
• copyInto(Object [ ])
• elementAt(int)
• elements( )
• ensureCapacity(int)
• firstElement( )
• indexOf(Object)
• indexOf(Object, int)
• insertElementAt(Objec
t, int)
• isEmpty( )
• lastElement( )
• lastIndexOf(Object)
• lastIndexOf(Object,
int)
• removeAllElements(
)
• removeElement(Obj
ect)
• removeElementAt(in
t)
• setElementAt(Object
, int)
• setSize(int)
• size( )
• toString( )
• trimToSize( )
Lớp StringTokenizer
• Có thể đƣợc dùng để tách một chuỗi thành
những thành phần cấu thành của nó
(constituent tokens)
• Ký tự phân cách có thể đƣợc chỉ định khi
một đối tƣợng StringTokenizer đƣợc khởi
tạo
• Phƣơng thức khởi tạo (Constructors):
– StringTokenizer(String)
– StringTokenizer(String, String)
– StringTokenizer(String, String, Boolean)
• Lớp StringTokenizer sử dụng giao diện liệt
kê (enumeration interface)
Những phƣơng thức của lớp
StringTokenizer
• countTokens( )
• hasMoreElements( )
• hasMoreTokens( )
• nextElement( )
• nextToken( )
• nextToken(String)
Chƣơng 4
Xử lý biệt lệ
Giới thiệu về biệt lệ
• Là một kiểu lỗi đặc biệt
• Nó xảy ra trong thời gian thực thi đoạn lệnh
• Thông thƣờng các điều kiện thực thi chƣơng
trình gây ra biệt lệ
• Nếu các điều kiện này không đƣợc quan
tâm, thì việc thực thi có thể kết thúc đột ngột
Mục đích của việc xử lý biệt lệ
• Giảm thiểu việc kết thúc bất thƣờng của hệ
thống và của chƣơng trình.
• Ví dụ, thao tác xuất/nhập trong một tập tin,
nếu việc chuyển đổi kiểu dữ liệu không thực
hiện đúng, một biệt lệ sẽ xảy ra và chƣơng
trình bị hủy mà không đóng tập tin. Lúc đó
tập tin sẽ bị hƣ hại và các nguồn tài nguyên
đƣợc cập phát cho tập tin không đƣợc thu
hồi lại cho hệ thống.
Xử lý biệt lệ
• Khi một biệt lệ xảy ra, đối tƣợng tƣơng ứng với biệt
lệ đó sẽ đƣợc tạo ra.
• Đối tƣợng này sau đó đƣợc truyền tới phƣơng thức
nơi mà biệt lệ xảy ra.
• Đối tƣợng này chức các thông tin chi tiết về biệt lệ.
Thông tin này có thể nhận đƣợc và xử lý.
• Lớp ‟throwable‟ mà Java cung cấp là lớp trên nhất
của lớp biệt lệ.
Mô hình xử lý biệt lệ
• Mô hình đƣợc biết đến là mô hình „catch and
throw‟
• Khi một lỗi xảy ra, biệt lệ sẽ đuợc chặn và
đƣợc vào một khối.
• Từ khóa để xử lý biệt lệ:
– try
– catch
– throw
– throws
– finally
Cấu trúc của mô hình xử lý biệt lệ
• Cú pháp
try { . }
catch(Exception e1) { . }
catch(Exception e2) { . }
catch(Exception eN) { . }
finally { . }
Mô hình „Catch and Throw‟ nâng cao
• Ngƣời lập trình chỉ quan tâm tới các lỗi
khi cần thiết.
• Một thông báo lỗi có thể đƣợc cung cấp
trong exception-handler.
Khối „try‟ và „catch‟
• Đƣợc sử dụng để thực hiện trong mô hình
„catch and throw‟ của xử lý biệt lệ.
• Khối lệnh „try‟ gồm tập hợp các lệnh thực thi
• Một phƣơng thức mà có thể bắt biệt lệ,
cũng bao gồm khối lệnh „try‟.
• Một hoặc nhiều khối lệnh „catch‟ có thể tiếp
theo sau một khối lệnh „try‟
• Khối lệnh „catch‟ này bắt biệt lệ trong khối
lệnh „try‟.
Khối lệnh „try‟ và „catch‟ Blocks
(tt)
• Để bắt bất kỳ loại biệt lệ nào, ta phải chỉ ra
kiểu biệt lệ là „Exception‟
catch(Exception e)
• Khi biệt lệ bị bắt không biết thuộc kiểu nào,
chúng ta có thể sử dụng lớp „Exception‟ để
bắt biệt lệ đó.
• Lỗi sẽ đƣợc truyền thông qua khối lệnh „try
catch‟ cho tới khi chúng bắt gặp một „catch‟
tham chiếu tới nó, hoặc chƣơng trình sẽ bị
kết thúc
Khối lệnh chứa nhiều Catch
• Các khối chứa nhiều „catch()‟ xử lý các
kiểu biệt lệ khác nhau một cách độc lập.
• Ví dụ
try
{ doFileProcessing();
displayResults(); }
catch(LookupException e)
{ handleLookupException(e); }
catch(Exception e)
{
System.err.println(“Error:”+e.printStackTra
ce()); }
Khối lệnh chứa nhiều Catch
(tt)
• Khi sử dụng các „try‟ lồng nhau, khối „try‟
bên trong đƣợc thi hành đầu tiên
• Bất kỳ biệt lệ nào bị chặn trong khối lệnh
„try‟ sẽ bị bắt giữ trong khối lệnh „catch‟ tiếp
ngay sau.
• Nếu khối lệnh „catch‟ thích hợp không đƣợc
tìm thấy, thì các khối „catch‟ của khối „try‟
bên ngoài sẽ đƣợc xem xét
• Ngƣợc lại, Java Runtime Environment sẽ xử
lý biệt lệ.
Khối „finally‟
• Thực hiện tất cả các việc thu dọn khi biệt lệ
xảy ra
• Có thể sử dụng kết hợp với khối „try‟
• Chứa các câu lệnh thu hồi tài nguyên về
cho hệ thống hay lệnh in ra các câu thông
báo:
– Đóng tập tin
– Đóng lại bộ kết quả (đƣợc sử dụng trong
chƣơng trình cơ sở dữ liệu)
– Đóng lại các kết nối đƣợc tạo trong cơ sở dữ
liệu.
Khối „finally‟ (tt)
• Ví dụ
try
{
doSomethingThatMightThrowAnException( );
}
finally
{
cleanup( );
}
Khối „finally‟ (tt)
• Là tùy chọn không bắt buộc
• Đƣợc đặt sau khối „catch‟
• Khối „finally‟ bảo đảm lúc nào cũng đƣợc
thực hiện bất chấp biệt lệ có xảy ra hay
không.
Các biệt lệ đƣợc định nghĩa
với lệnh „throw‟ và „throws‟
• Các biệt lệ thì đƣợc chặn với sự trợ giúp của từ
khóa „throw‟
• Từ khóa „throw‟ chỉ ra một biệt lệ vừa xảy ra.
• Toán hạng của throw là một đối tƣợng của một
lớp, mà lớp này đƣợc dẫn xuất từ lớp
„Throwable‟
• Ví dụ của lệnh „throw‟
try{
if (flag < 0)
{
throw new MyException( ) ; // user-
defined
}
}
Các biệt lệ đƣợc định nghĩa với
lệnh „throw‟ và „throws‟(tt)
• Một phƣơng thức đơn có thể chặn nhiều hơn
một biệt lệ
• Ví dụ từ khóa „throw‟ xử lý nhiều biệt lệ
public class Example {
public void exceptionExample( ) throws
ExException, LookupException {
try
{ // statements }
catch(ExException exmp)
{ . }
catch(LookupException lkpex)
{ . } } }
Các biệt lệ đƣợc định nghĩa với
lệnh „throw‟ và „throws‟(tt)
• Lớp „Exception‟ thực thi giao diện
„Throwable‟ và cung cấp các tính năng
hữu dụng để phân phối cho các biệt lệ.
• Một lớp con của lớp Exception là một
biệt lệ mới có thể bắt giữ độc lập các
loại Throwable khác.
Danh sách các biệt lệ
• RuntimeException
• ArithmeticException
• IllegalAccessException
• IllegalArgumentException
• ArrayIndexOutOfBoundsException
• NullPointerException
• SecurityException
• ClassNotFoundException
Danh sách các biệt lệ (tt)
• NumberFormatException
• AWTException
• IOException
• FileNotFoundException
• EOFException
• NoSuchMethodException
• InterruptedException
Chƣơng V
LẬP TRÌNH GIAO DIỆN VỚI AWT
• AWT viết tắt của Abstract Windowing
Toolkit
• AWT là tập hợp các lớp Java cho phép
chúng ta tạo một GUI
• Cung cấp các mục khác nhau để tạo hoạt
động và hiệu ứng GUI nhƣ
– Containers
– Components
– Layout managers
– Graphics và drawing capabilities
– Fonts
– Events
GIỚI THIỆU VỀ AWT
• AWT bao gồm các lớp, interfaces và các gói
khác
Components
• Tất cả các thành phần cấu tạo nên chƣơng
trình GUI đƣợc gọi là component.
• Ví dụ
– Containers,
– textfields, labels, checkboxes, textareas
– scrollbars, scrollpanes, dialog
Containers
• Là thành phần mà có thể chứa các
thành phần khác. có thể vẽ và tô màu.
• Có các frames, panes,latches, hooks
• Java.awt chứa một lớp có tên là
Container. Lớp này dẫn xuất trực tiếp
và không trực tiếp theo 2 cách là:
– Frames
– Panels
Frames
• Là các cửa sổ
• Là lớp con của Windows
• Đƣợc hiển thị trong một cửa sổ và có đƣờng
viền
Panels
• Là các vùng chứa trong một cửa sổ.
• Hiển thị trong một cửa sổ mà trình duyệt
hoặc appletviewer cung cấp và không có
đƣờng viền.
• Đƣợc sử dụng để nhóm một số các thành
phần
• Một panel không có sẳn vì thế chúng ta cần
phải thêm nó vào frame.
• Hàm dựng
– Panel()
Dialog
• Là một lớp con của lớp Window
• Đối tƣợng dialog đƣợc cấu trúc nhƣ sau :
Frame myframe = new Frame(“My frame”);
String title = “Title”;
boolean modal = true;
Dialog dlg = new Dialog( myframe, title, modal);
Các Components khác
• Ví dụ
– textfields, labels, checkboxes, textareas
– scrollbars, scrollpanes, dialog
Label
• Đƣợc dùng để hiển thị chuỗi (String)
• Các hàm dựng:
– Label( )
– Label(String labeltext)
– Label(String labeltext, int alignment)
• Các phƣơng thức:
– setFont(Font f)
– setText(String s)
– getText( )
TextField
• Là điều khiển text cho phép hiển thị text hoặc
cho user nhập dữ liệu vào.
• Các hàm dựng:
– TextField( )
– TextField(int columns)
– TextField(String s)
– TextField(String s, int columns)
• Các phƣơng thức:
– setEchoChar(char)
– setTest(String s)
– getText( )
– setEditable(boolean)
– isEditable( )
TextArea
• Đƣợc dùng khi text có nội dung từ hai
dòng trở lên
• Là điều khiển text có thể soạn thảo
đƣợc với nhiều dòng
• Các bƣớc để tạo TextArea:
– Tạo một phần tử (element)
– Chỉ ra số dòng hay số cột (tùy chọn)
– Chỉ ra vị trí của điều khiển trên màn hình
TextArea (tt)
• Các hàm dựng:
– TextArea( )
– TextArea(int rows, int cols )
– TextArea(String text)
– TextArea(String text, int rows, int cols)
Các phƣơng thức của
TextArea
• setText(String)
• getText( )
• setEditable(boolean)
• isEditable( )
• insertText(String, int)
• replaceText(String, int, int)
Button
• Các nút Push hay Command là cách dễ nhất
để lấy các sƣ kiện của user
• Các bƣớc để tạo button:
– Tạo một phần tử button, nên tạo cho nó một
caption để chỉ ra mục đích của nó
– Chỉ ra vị trí đặt button trên màn hình
– HIển thị ra trên màn hình
• Các hàm dựng:
– Button( )
– Button(String text)
Checkboxes and
RadioButtons
• Checkboxes đƣợc dùng khi cho phép user nhiều cọn
chọn lựa
• Radiobuttons đƣợc dùng để user chỉ ra một lựa
chọn duy nhất
• Các bƣớc để tạo checkbox hoặc radiobutton:
– Tạo một phần tử (element)
– Khởi tạo giá trị ban đầu (có giá trị selected hay unselected)
– Chỉ ra vị trí trên màn hình
– Hiển thị ra màn hình
• Các hàm dựng để tạo checkbox:
– Checkbox( )
– Checkbox(String text)
• Để tạo radiobutton, ta phải tạo đối tƣợng
CheckBoxGroup trƣớc khi tạo button
Choice Lists
• Lớ p „Choice‟ cho phép ta tạo danh sách có nhiều
chọn lựa
• Khi list đƣợc tạo lần đầu tiên, nó đƣợc khởi tạo là
empty
• Các bƣớc để tạo danh sách chọn lựa:
– Tạo một phần tử
– Thêm các mục (có kiểu Strings) vào danh sách đó,
từng mục một
– Chỉ ra vị trí trên màn hình
– Hiển thị ra màn hình
• Ví dụ
Choice colors=new Choice( );
colors.addItem(“Red”);
colors.addItem(“Green”);
Trình quản lý bố trí
Layout Manager
• Các loại layout khác nhau:
– Flow Layout
– Border Layout
– Card Layout
– Grid Layout
– GridBag Layout
• Trình quản lý layout đƣợc thiết lập bằng
cách gọi phƣơng thức „setLayout( )‟
FlowLayout
• Là trình quản lý layout mặc định cho các
applet và các panel
• Với FlowLayout các thành phần sẽ đƣợc
xắp xếp từ góc trái trên đến góc phải dƣới
của màn hình
• Các constructor:
FlowLayout mylayout = new FlowLayout();
FlowLayout exLayout = new
flowLayout(FlowLayout.RIGHT);
BorderLayout
• Là trình quản lý layout mặc định cho Window,
Frame và Dialog
• Trình quản lý này có thể xắp xếp đến 5 thành
phần trong container
• Các thành phần có thể đƣợc đặt vào 5
hƣớng NORTH, EAST, SOUTH, WEST và
CENTER của container
• Ví dụ: Để thêm một thành phần vào vùng
North của container
Button b1= new Button(“North Button”);
setLayout(new BorderLayout( ));
add(b1, BorderLayout.NORTH);
CardLayout
• Có thể lƣu trữ một danh sách các kiểu layout
khác nhau
• Mỗi layout đƣợc xem nhƣ một thẻ (card)
• Thẻ thƣờng là đối tƣợng Panel
• Một thành phần độc lập nhƣ button sẽ điều
khiển các thẻ đƣợc đặt ở phía trên nhất
• Các bƣớc để tạo CardLayout:
– Bố trí layout của panel chính là CardLayout
– Lần lƣợt thêm các panel khác vào panel chính
GridLayout
• Hỗ trợ việc chia container thành một lƣới
• Các thành phần đƣợc bố trí trong các
dòng và cột
• Một ô lƣới nên chứa ít nhất một thành
phần
• Kiểu layout này đƣợc sử dụng khi tất cả
các thành phần có cùng kích thƣớc
• Hàm constructor
GridLayout gl = new GridLayout(no. of rows,
no. of columns);
GridBagLayout
• Bố trí các thành phần một cách chính
xác
• Các thành phần không cần có cùng kích
thƣớc
• Các thành phần đƣợc xắp xếp trong một
lƣới chứa các dòng và các cột
• Thứ tự đặt các thành phần không tuân
theo hƣớng từ trái-sang-phải và trên-
xuống-dƣới
• Hàm constructor
GridBagLayout gb = new GridBagLayout( );
GridBagLayout
• Để sử dụng layout này, bạn cần phải
biết thông tin về kích cỡ và cách bố trí
của các thành phần
• Lớp „GridBagLayoutConstraints‟ lƣu trữ
tất cả các thông tin mà lớp GridLayout
yêu cầu: Vị trí và kích thuớc mỗi thành
phần
Xử lý các sự kiện
• Các sự kiện (Events) đƣợc xử lý bằng các
công cụ sau:
– Abstract Windowing Toolkit
– Trình duyệt.
– Các trình xử lý sự kiện do các lập trình viên tạo
riêng.
• Các ứng dụng cần đăng ký trình xử lý sự kiện
với đối đối tƣợng
• Các trình xử lý này đƣợc gọi khi có một sự
kiện tƣơng ứng xảy ra
Xử lý các sự kiện (tt)
• Event Listener sẽ lắng nghe một sự kiện cụ
thể mà một đối tƣợng tạo ra
• Mỗi event listener cung cấp các phƣơng
thức để xử lý các sự kiện này
• Lớp có cài đặt listener cần định nghĩa
những phƣơng thức này
Xử lý các sự kiện(tt)
• Các bƣớc cần tuân thủ để sử dụng mô hình
Event Listener:
– Cài đặt Listener tƣơng ứng
– Nhận diện đƣợc tất cả các thành phần tạo ra sự
kiện
– Nhận diện đƣợc tất cả các sự kiện đƣợc xử lý
– Cài đặt các phƣơng thức của listener, và viết các
đoạn mã để xử lý sự kiện trong các phƣơng thức
đó
• Interface định nghĩa các phƣơng thức khác
nhau để xử lý mỗi sự kiện
CÁC SỰ KIỆN VÀ LISTENER
TƢƠNG ỨNG
• ActionEvent
• AdjustmentEvent
• ComponentEvent
• FocusEvent
• ItemEvent
• WindowEvent
• TextEvent
• MouseEvent
• KeyEvent
■ ActionListener
■ AdjustmentListener
■ ComponentListener
■ FocusListener
■ ItemListener
■ WindowListener
■ TextListener
■ MouseListener
■ MouseMotionListener
■ KeyListener
Menus
• Các loại menu :
– Pull-down
– Pop-up menu
• Chỉ có thể đặt các thanh menubar vào
trong các Frame mà thôi
• Các thành phần của menu:
– Menubar
– MenuItems
Chƣơng VI
Applets
Applets
• Là một chƣơng trình Java mà chạy với
sự hổ trợ của trình duyệt web
• Tất cả các applets là lớp con của lớp
„Applet‟
• Để tạo một applet, bạn cần import hai
gói sau:
– java.applet
– java.awt
Cấu trúc applet
• Định nghĩa một applet từ bốn sự kiện xảy ra
trong quá trình thực thi
• Đối với mỗi sự kiện đƣợc định nghĩa bởi một
phƣơng thức tƣơng ứng.
• Các phƣơng thức:
– init( )
– start( )
– stop( )
– destroy( )
• Các phƣơng thức khác:
– paint( )
– repaint( )
– showStatus( )
– getAppletInfo( )
• Các phƣơng thức init(), start(), stop(),
destroy(), and paint() đƣợc thừa kế từ applet.
• Mỗi phƣơng thức này mặc định là rỗng. Vì
thế các phƣơng thức này phải đƣợc nạp
chồng.
Biên dịch và thực thi applet
• Một applet thì đƣợc biên dịch theo cú pháp
sau
javac Applet1.java
• Để thực thi một applet, tạo một tập tin HTML
có sử dụng thẻ applet
– Thẻ applet có hai thuộc tính:
• Width
• Height
– Để truyền tham số tới applet, sử dụng thẻ
„param‟, và tiếp theo là thẻ „value‟
• Applet có thể đƣợc thực thi bằng applet
viewer
Điểm khác biệt giữa applet và một ứng dụng
• Các ứng dụng khi thực thi phải sử dụng
trình biên dịch Java, trong khi các applets
thực thi đƣợc trên bất kỳ trình duyệt nào
mà hổ trợ Java, hoặc sử dụng
„AppletViewer‟ trong JDK.
• Một ứng dụng bắt đầu với phƣơng thức
„main()‟. Còn đối với applet thì không sử
dụng phƣơng thức này
• Một ứng dụng sử dụng
„System.out.println()‟ để hiển thị, trong khi
môt applet thì sử dụng phƣơng thức
„drawstring()‟ để hiển thị.
Những hạn chế về bảo mật
trong applet
• Không thể đọc hoặc viết các tập tin trên hệ
thống tập tin của ngƣời sử dụng
• Không thể giao tiếp với một site trên internet.
Mà chỉ giao tiếp với một dịch vụ trên trang
web có applet.
• Không thể chạy bất kỳ chƣơng trình nào trên
hệ thống của ngƣời đọc
• Không thể load bất kỳ chƣơng trình nào
đƣợc lƣu trên hệ thống của ngƣời sử dụng
Chu trình sống của applet
Truyền tham số tới một applet
• Để truyền tham số, sử dụng PARAM
trong thẻ HTML
• Ví dụ
Lớp đồ họa
• Đƣợc cung cấp bởi gói AWT
• Cung cấp một tập hợp các phƣơng thức để
vẽ nhƣ sau:
– Oval
– Rectangle
– Square
– Circle
– Lines
– Text in different fonts
Graphical Background
• Các phƣơng thức để vẽ nền :
– getGraphics( )
– repaint( )
– update(Graphics g)
– paint(Graphics g)
Hiển thị chuổi, ký tự và bytes
• Phƣơng thức để vẽ hoặc hiển thị một chuổi
trên frame
Cú pháp
– drawString(String str, int xCoor, int yCoor);
• Phƣơng thức để vẽ hoặc hiển thị các ký tự
trên frame
Cú pháp
– drawChars(char array[ ], int offset, int length,
int xCoor, int yCoor);
• Phƣơng thức để vẽ hoặc hiển thị bytes trên
frame
Cú pháp
– drawBytes(byte array[ ], int offset, int length,
int xCoor, int yCoor);
Vẽ các hình thể
• Phƣơng thức đƣợc sử dụng để vẽ
đƣờng thẳng nhƣ sau
Cú pháp
– drawLine(int x1, int y1, int x2, int y2);
• Các phƣơng thức đƣợc sử dụng để vẽ
đƣờng tròn nhƣ sau
Cú pháp
– drawOval(int xCoor, int yCoor, int width, int
height);
– setColor(Color c);
– fillOval(int xCoor, int yCoor, int width, int
height);
• Phƣơng thức sử dụng để vẽ hình
vuông:
Cú pháp
– drawRect(int xCoor, int yCoor, int width, int
height);
– fillRect(int xCoor, int yCoor, int width, int
height);
• Các phƣơng thức đƣợc sử dụng để vẽ
hình vuông có góc tròn
Cú pháp
– drawRoundRect(int xCoor, int yCoor, int
width, int height, int arcWidth, int
arcHeight);
– fillRoundRect (int xCoor, int yCoor, int
width, int height, int arcWidth, int
arcHeight);
3D Rectangles & Arcs
• Các phƣơng thức đƣợc sử dụng để vẽ
hình 3D Cú pháp
– draw3DRect(int xCoord, int yCoord, int
width, int height, boolean raised);
– drawArc(int xCoord, int yCoord, int width,
int height, int arcwidth, int archeight);
– fillArc(int xCoord, int yCoord, int width, int
height, int arcwidth, int archeight);
Drawing PolyLines
• Các phƣơng thức đƣợc sử dụng để vẽ
nhiều đƣợc thẳng
Cú pháp
– drawPolyline(int xArray[ ], int yArray[ ], int
totalPoints);
– g.setFont(new Font("Times Roman",
Font.BOLD,15));
Vẽ và tô các hình đa giác
• Các phƣơng thức để vẽ và tô các hình đa
giác
Cú pháp
– drawPolygon(int x[ ], int y[ ], int
numPoints);
– fillPolygon(int x[ ], int y[ ], int numPoints);
Màu
• Java sử dụng màu RGB
• Bảng các giá trị màu
Element Range
Red 0-255
Green 0-255
Blue 0-255
■ Cú pháp của hàm dựng để tạo một màu
color(int red, int green, int blue);
• Bảng trình bày các giá trị màu RGB thông
thƣờng
Color Red Green Blue
White 255 255 255
Light Gray 192 192 192
Gray 128 128 128
Dark Gray 64 64 64
Black 0 0 0
Pink 255 175 175
Orange 255 200 0
Yellow 255 255 0
Magenta 255 0 255
Font
• Gói java.awt package cung cấp bởi lớp
„Font‟
• Các phƣơng thức của lớp Font:
– getAllFont( )
– getLocalGraphicsEnvironment( )
– getFont( )
– getFontList( )
• Hàm dựng Font nhận 3 tham số
– Tên font trong chuổi định dạng; tên này
có trong phƣơng thức getFontList( ).
– Kiểu của font. Ví dụ nhƣ: Font.BOLD,
Font.PLAIN, Font.ITALIC
– Kích thƣớc của font.
• Ví dụ
Font f1 = new Font("SansSerif", Font.ITALIC, 16);
g.setFont(f1);
Lớp FontMetrics
• Đo lƣờng các ký tự khác nhau hiển thị trong
các font khác nhau.
• Việc đo lƣờng bao gồm „height‟, „baseline‟,
„ascent‟, „descent‟ và „leading‟ của font.
• Nó không cụ thể vì nó là một lớp trừu tƣợng
Lớp FontMetrics (tiếp theo)
• Phƣơng thức:
– getFontMetrics(f1)
– getHeight( )
– getAscent( )
– getDescent( )
– getLeading( )
– getName( )
Kiểu vẽ
• Các đối tƣợng để vẽ đƣợc sử dụng.
• Method used to make old and new
contents visible on the screen
setXORMode(Color c)
• Method used to revert to the overwrite
mode
setPaintMode( )
Chƣơng VII
Lập trình đa tuyến
Tuyến
• Lập trình đa tuyến là một đặc trƣng
của Java
• Tuyến là đơn vị nhỏ nhất của đoạn mã
có thể thi hành đƣợc mà thực hiện một
công việc riêng biệt
Đa tuyến
• Là khả năng làm việc với nhiều tuyến
• Đa tuyến chuyên sử dụng cho việc
thực thi nhiều công việc đồngthời
• Đa tuyến giảm thời gian rỗi của hệ
thống đến mức thấp nhất.
Tạo và quản lý tuyến (1)
• Khi chƣơng trình Java thực thi hàm
main() tức là tuyến main đƣợc thực thi.
Tuyến này đƣợc tạo ra một cách tự
động. tại đây :
- Các tuyến con sẽ đƣợc tạo ra từ đó
- Nó là tuyến cuối cùng kết thúc việc thực
hiện. Trong chốc lát tuyến chính ngừng
thực thi, chƣơng trình bị chấm dứt
• Tuyến có thể đƣợc tạo ra bằng 2 cách:
– Dẫn xuất từ lớp Thread
– Dẫn xuất từ Runnable.
Vòng đời của một tuyến
TRẠNG THÁI CỦA TUYẾN VÀ CÁC
PHƢƠNG THỨC CỦA LỚP TUYẾN
• trạng thái:
– born
– ready to run
– running
– sleeping
– waiting
– ready
– blocked
– dead
• Phƣơng thức:
– start( )
– sleep( )
– wait( )
– notify( )
– run( )
– stop( )
Các phƣơng thức Khác
• enumerate(Thread t)
• getName( )
• isAlive( )
• getPriority( )
• setName(String name)
• join( )
• isDaemon( )
• setDaemon(Boolean on)
• resume( )
• sleep( )
• start( )
Phân chia thời gian giữa các tuyến
• CPU chỉ thực thi chỉ một tuyến tại một
thời điểm nhất định.
• Các tuyến có độ ƣu tiên bằng nhau thì
đƣợc phân chia thởi gian sử dụng bộ
vi xử lý.
tuyến Daemon(ngầm)
• Hai kiểu tuyến trong một chƣơng trình
Java:
– Các tuyến ngƣời sử dụng
– tuyến ngầm
• tuyến ngầm dọn rác
Đa tuyến với Applets
• Các chƣơng trình Java dựa trên Applet
thƣờng sử dụng nhiều hơn một tuyến
• Trong đa tuyến với Applets, Lớp
„java.applet.Applet‟ là lớp con đƣợc tạo ra
một Applet ngƣời sử dụng đã định nghĩa
• nó không thể thực hiện đƣợc trực tiếp lớp
con của lớp tuyến trong các applet
• Con đƣờng để lớp con sử dụng lớp tuyến:
– Sử dụng một đối tƣợng của tuyến ngƣời sử dụng
định nghĩa, mà, lần lƣợt, dẫn xuất lớp tuyến
– Thực thi chạy giao tiếp (interface)
Sự đồng bộ tuyến
• Thâm nhập các tài nguyên/dữ liệu bởi
nhiều tuyến
• Sự đồng bộ (Synchronization)
• Sự quan sát (Monitor)
• Mutex
Mã đồng bộ
• Để thâm nhập sự quan sát của một đối
tƣợng, lập trình viên sử dụng từ khóa
„synchronized‟ để gọi một phƣơng thức
hiệu chỉnh (modified method)
• Khi một tuyến đang đƣợc thực thi
trong phạm vi một phƣơng thức đồng
bộ (synchronized), bất kỳ tuyến khác
hoặc phƣơng thức đồng bộ khác mà
cố gắng gọi nó trong thời gian đó sẽ
phải đợi
Khuyết điểm của các phƣơng
thức đồng bộ
• Các trạng thái chắc chắn không lợi ích
cho đa tuyến
• Trình biên dịch Java từ Sun không
chứa nhiều phƣơng thức đồng bộ
• Các phƣơng thức đồng bộ chậm hơn
từ ba đến bốn lần so với các phƣơng
thức tƣơng ứng không đồng bộ.
Kỹ thuật “wait-notify” (đợi –
thông báo) (1)
• tuyến chia các tác vụ thành các đơn vị
riêng biệt và logic (hợp lý)
• Để tránh trƣờng hợp kiểm soát vòng,
Java bao gồm một thiết kế tốt trong tiến
trình kỹ thuật truyền thông sử dụng các
phƣơng thức “wait()” (đợi), “notify()”
(thông báo) và “notifyAll()” (thông báo hết)
:
– wait( )
– notify( )
– notifyAll( )
Kỹ thuật “wait-notify” (đợi –
thông báo) (1)
• Các chức năng của các phƣơng thức
“wait()”, “notify()”, và “notifyAll()” là :
– wait( )
– notify( )
– notifyAll( )
• tuyến ƣu tiên cao nhất chạy đầu tiên
• Cú pháp của các phƣơng thức:
– final void wait( ) throws IOException
– final void notify( )
– final void notifyAll( )
Một số điểm cần nhớ trong khi
sử dụng phƣơng thức wait():
• tuyến đang gọi đƣa vào CPU
• tuyến đang gọi đƣa vào khóa
• tuyến đang gọi đi vào vùng đợi của
monitor
Các điểm chính cần nhớ về
phƣơng thức notify()
• Một tuyến đƣa ra ngoài vùng đợi của monitor, và vào
trạng thái sẵn sàng
• tuyến mà đã đƣợc thông báo phải thu trở lại khóa của
monitor trƣớc khi nó có thể bắt đầu
• Phƣơng thức notify() là không chính xác
• Trong một số trƣờng hợp này, các phƣơng thức của
monitor đƣa ra 2 sự đề phòng:
– Trạng thái của monitor sẽ đƣợc kiểm tra trong một vòng lặp
“while” tốt hơn là câu lệnh if
– Sau khi thay đổi trạng thái của monitor, phƣơng thức notifyAll()
sẽ đƣợc sử dụng, tốt hơn phƣơng thức notify().
Sự bế tắt (Deadlocks)
• Một “deadlock” (sự bế tắt) xảy ra khi hai
tuyến có một phụ thuộc vòng quanh trên một
cặp đối tƣợng đồng bộ
• Nó khó để gỡ lỗi một bế tắt bởi những
nguyên nhân sau:
– Nó hiểm khi xảy ra, khi hai tuyến chia nhỏ
thời gian trong cùng một con đƣờng
– Nó có thể bao hàm nhiều hơn hai tuyến và
hai đối tƣợng đồng bộ
• Nếu một chƣơng trình đa tuyến khóa kín
thƣờng xuyên, ngay lập tức kiểm tra lại điều
kiện bế tắt
Thu dọn “rác” (Garbage
collection)
• Cải tạo hoặc làm trống bộ nhớ đã định
vị cho các đối tƣợng mà các đối tƣợng
này không sử dụng trong thời gian dài
• Sự dọn rác thực thi nhƣ là một tuyến
riêng biệt có quyền ƣu tiên thấp
• Sử dụng câu lệnh sau để tắt đi sự dọn
rác trong ứng dụng:
java –noasyncgc
Phƣơng thức finalize() (hoàn
thành)
• Java cung cấp một con đƣờng để làm sạch
một tiến trình trƣớc khi điều khiển trở lại hệ
điều hành
• Phƣơng thức finalize(), nếu hiện diện, sẽ
đƣợc thực thi trên mỗi đối tƣợng, trƣớc khi
sự dọn rác
• Câu lệnh của phƣơng thức finalize() nhƣ sau
:
– protected void finalize( ) throws Throwable
• Tham chiếu không phải là sự dọn rác; chỉ các
đối tƣợng mới đƣợc dọn rác
Chƣơng VIII
Các luồng I/O
Các luồng
• Các luồng là những đƣờng ống dẫn để gửi
và nhận thông tin trong các chƣơng trình
java.
• Khi một luồng đọc hoặc ghi , các luồng khác
bị khoá.
• Nếu lỗi xẩy ra trong khi đọc hoặc ghi luồng,
một ngoại lệ sẽ kích hoạt.
• Lớp „java.lang.System‟ định nghĩa luồng nhập
và xuất chuẩn.
Các lớp luồng I/O
• Lớp System.out.
• Lớp System.in.
• Lớp System.err.
Lớp InputStream
• Là lớp trừu tƣợng
• Định nghĩa cách nhận dữ liêu
• Cung cấp số phƣơng thức dùng để đọc và
các luồng dữ liệu làm đầu vào.
• Các phƣơng thức:
– read( )
– available( )
– close ( )
– mark ( )
– markSupported( )
– reset( )
– skip( )
Lớp OutputStream
• Là lớp trừu tƣợng.
• Định nghĩa cách ghi dữ liệu vào luồng.
• Cung cấp tập các phƣơng thức trợ giúp.
trong việc tạo, ghi và xử lý các luồng xuất.
• Các phƣơng thức:
– write(int)
– write(byte[ ])
– write(byte[ ], int, int)
– flush( )
– close( )
Nhập mảng các Byte
• Sử dụng các đệm bộ nhớ
• Lớp ByteArrayInputStream
• Tạo ra một luồng nhập từ đệm bộ nhớ
không gì cả về mảng các byte.
– Không hỗ trợ các phƣơng thức mới
– Các phƣơng thức nộp chồng của lớp
InputStream, giống nhƣ „read()‟, „skip()‟,
„available()‟ và „reset()‟.
Byte Array Output
• sử dụng các vùng đệm bộ nhớ
• Lớp ByteArrayOutputStream
– Tạo ra một luồng kết xuất trên mảng byte
– Cung cấp các khả năng bổ sung cho
mảng kết xuất tăng trƣởng nhằm chừa
chổ cho dữ liệu mới ghi vào.
– Cũng cung cấp các phƣơng thức để
chuyển đổi luồng tới mảng byte, hay đối
tƣợng String.
• Phƣơng thức của lớp
ByteArrayOutputStream :
– reset( )
– size( )
– writeTo( )
Các lớp nhập/xuất tập tin
• Các lớp này trợ giúp trong Java để hổ trợ
các thao tác nhập và xuất:
– File
– FileDescriptor
– FileInputStream
– FileOutputStream
• Các lớp File, FileDescriptor, và
RandomAccessFile đƣợc sử dụng hỗ trợ
trực tiếp hoặc truy cập nhập/xuất ngẫu
nhiên.
Lớp tập tin
• Đƣợc sử dụng truy cập các đối tƣợng tập tin
và thw mục
• Những tập tin có tên đƣợc đặt tên theo qui
ƣớc của hệ điều hành chủ
• Lớp này cung cấp phƣơng thức khởi tạo để
tạo ra các thƣ mục và tập tin
• Tất cả các thao tác thƣ mục và tập tin đều
đƣợc sử dụng các phƣơng thức truy cập và
các phƣơng thức thƣ mục mà các lớp tập tin
cung cấp
Lớp FileDescriptor
• Cung cấp việc truy cập tới các tập tin
mô tả
• Không cung cấp bất kỳ tính rõ nét nào
tới thông tin mà hệ điều hành duy trì.
• Cung cấp chỉ một phƣơng thức gọi là
„valid( )‟
Lớp FileInputStream
• Cho phép đầu vào đọc từ một tập tin
trong một mẫu của một dòng
• Các đối tƣợng đƣợc tạo ra sử dụng
chuỗi tên tập tin, tập tin, đối tƣợng
FileDescriptor nhƣ một tham số.
• Các phƣơng thức nạp chồng của lớp
InputStream. nó cung cấp phƣơng thức
„finalize( )‟ và „getFD( )‟
Lớp FileOutputStream
• Cho phép kết xuất để ghi ra một luồng
tập tin
• Các đối tƣợng cũng tạo ra sử dụng một
chuỗi tên tập tin, tạp tin, hay đối tƣợng
FileDescriptor nhƣ một tham số.
• Lớp này nạp chồng các phƣơng thức
của lớp OutputStream và cung cấp
phƣơng thức „finalize( )‟ và „getFD( )‟
Nhập xuất lọc
• Lọc:
– Là kiểu luồng sửa đổi cách điều quản một luồng
hiện có.
– về cơ bản đƣợc sử dụng để thích ứng các luồng
theo các nhu cầu của chƣơng trình cụ thể.
– Bộ lọc nằm giữa luồng nhập và luồng xuất.
– Thực hiện một số tiến trình đặt biệt trên các byte
đƣợc chuyển giao từ đầu vào đến kết xuất.
– Có thể phối hợp để thực hiện một dãy các tuỳ
chọn lọc.
Lớp FilterInputStream
• Là lớp trừu tƣợng.
• Là cha của tất cả các lớp luồng nhập đã lọc.
• Cung cấp khả năng tạo ra một luồng từ
luồng khác.
• Một luồng có thể đọc và cung cấp cung cấp
dƣới dạng kết xuất cho luồng khác.
• duy trì một dãy các đối tƣợng của lớp
„InputStream‟
• Cho phép tạo ra nhiều bộ lọc kết xích
(chained filters
• ).
Lớp FilterOutputStream
• Là dạng bổ trợ cho lớp
„FilterInputStream‟.
• Là cha của tất cả các lớp luồng kết
xuất.
• Duy trì đối tƣợng của lớp
„OutputStream‟ nhƣ là một biến „out‟.
• Dữ liệu ghi ra lớp này có thể sửa đổi để
thực hiện các thao tác lọc, và sau đó
phản hồi đến đối tƣợng „OutputStream‟.
Vùng đệm nhập/xuất
• Vùng đệm:
– Là kho lƣu trữ dữ liệu.
– Có thể cung cấp dữ liệu thay vì quay trợ lại nguồn
dữ liệu gốc ban đầu.
– Java sử dụng vùng đệm nhập và kết xuất để tạm
thời lập cache dữ liệu đƣợc đọc hoặc ghi vào một
luồng.
• Trong khi thực hiện vùng đệm nhập:
– Số lƣợng byte lớn đƣợc đọc cùng thời điểm, và
lƣu trữ trong một vùng đệm nhập.
– Khi chƣơng trình đọc luồng nhập, các byte nhập
đƣợc đọc vào vùng đệm nhập.
Vùng đệm nhập/xuất (tt)
• Trong trƣờng hợp vùng đệm kết xuất, một
chƣơng trình ghi ra một luồng.
• Dữ liệu kết xuất đựơc lƣu trữ trong một vùng
đệm kết xuất.
• Dữ liệu đƣợc lƣu trữ cho đến khi vùng đệm
trợ nên đầy, hay luồng kết xuất đƣợc xả
trống.
• Kết thúc, vùng đệm kết xuất đƣợc chuyển gửi
đến đích của luồng xuất.
Lớp BufferedInputStream
• Tự động tạo ra và duy trì vùng đệm để hổ trợ
vùng đệm nhập.
• bởi lớp „BufferedInputStream‟ là một bộ đệm,
nó có thể áp đụng cho một số các đối tƣợng
nhất định của lớp „InputStream‟.
• Cũng có thể phối hợp các tập tin đầu vào
khác.
• Sử dụng vài biến để triển khai vùng đệm
nhập.
Lớp BufferedInputStream
(Contd)
• Định nghĩa hai phƣơng thức thiết lập:
– Một chó phép chỉ định kích thƣớc của vùng đệm
nhấp.
– phƣơng thức kia thì không.
• Cả hai phƣơng thức thiết lập đều tiếp nhận
một đối tƣợng của lớp „InputStream‟ nhƣ một
tham số.
• Nạp chồng các phƣơng thức truy cập mà
InputStream cung cấp, và không đƣa vào bất
kỳ phƣơng thức mới nào.
Lớp BufferedOutputStream
• Thực hiện vùng đệm kết xuất theo cách
tƣơng ứng với lớp „BufferedInputStream‟.
• Định nghĩa hai phƣơng thức thiết lập. Nó
cho phép chúng ta ấn định kích thƣớc của
vùng đệm xuất trong một phƣơng thức thiết
lập, cũng giống nhƣ cung cấp kích thƣớc
vùng đệm mặc định.
• Nạp chồng tất cả phƣơng thức của lớp
„OutputStream‟ và không đƣa vào bất kỳ
phƣơng thức nào.
Lớp Reader và Writer
• Là các lớp trừu tƣợng.
• Chúng nằm tại đỉnh của hệ phân cấp
lớp, hỗ trợ việc đọc và ghi các luồng ký
tự unicode.
Lớp Reader
• Hỗ trợ các phƣơng thức sau:
– read( )
– reset( )
– skip( )
– mark( )
– markSupported( )
– close( )
– ready( )
Lớp Writer
• Hỗ trợ các phƣơng thức sau :
– write( )
– flush( )
– close( )
Nhập/xuất chuỗi và mảng ký
tự
• Hỗ trợ nhập và xuất từ các vùng đệm
bộ nhớ
• Hỗ trợ 8 bít ký tự nhập và kết xuất
• Lớp „CharArrayReader‟ không bổ sung
phƣơng thức mới vào các phƣơng
thức mà lớp „Reader‟ cung cấp.
Nhập/xuất chuỗi và mảng ký tự
(tt)
• Lớp „CharArrayWriter‟ bổ sung phƣơng
thức sau đây vào phƣơng thức của lớp
„Writer‟ cung cấp:
– reset( )
– size( )
– toCharArray( )
– toString( )
– writeTo( )
Nhập/xuất chuỗi và mảng ký tự
(tt)
• Lớp „StringReader‟ trợ giúp đọc các ký tự đầu
vào từ sâu chuỗi.
• Nó không bổ sung bất kỳ phƣơng thức nào
mà lớp Reader cung cấp.
• Lớp „StringWriter‟ trợ giúp để ghi luồng kết
xuất ký tự ra một đối tƣợng „StringBuffer‟.
• Lớp này bổ sung thêm các phƣơng thức sau:
– getBuffer( )
– toString( )
Lớp PrinterWriter
• Thực hiện một kết xuất.
• Lớp này có phƣơng thức bổ sung , trợ giúp
in các kiểu dữ liệu cơ bản .
• Lớp PrintWriter thay thế lớp „PrintStream‟
• Thực tế cải thiện lớp „PrintStream‟; lớp này
dùng một dấu tách dòng phụ thuộc nền tảng
điểm các dòng thay vì ký tự „\n‟.
• Cung cấp phần hỗ trợ cho các ký tự unicode
so với PrintStream.
• Các phƣơng thức:
– checkError( )
– setError( )
Giao diện DataInput
• Đƣợc sử dụng để đọc các byte từ luồng nhị
phân, và
• Is used to read bytes from a binary stream,
and xây dựng lại dữ liệu trong một số kiểu dữ
liệu nguyên thuỷ.
• Cho phép chúng ta chuyển đổi dữ liệu từ từ
khuôn dạng UTF-8 đƣợc sửa đổi Java đến
dạng chuỗi
• Định nghiã số phƣơng thức, bao gồm các
phƣơng thức để đọc các kiểu dữ liệu nguyên
thuỷ.
NHỮNG PHƢƠNG THỨC GIAO
DIỆN DATAINPUT
• boolean readBoolean(
)
• byte readByte( )
• char readChar( )
• short readShort( )
• long readLong( )
• float readFloat( )
• int readInt( )
• double readDouble( )
• String readUTF( )
• String readLine( )
Giao diện DataOutput
• Đƣợc sử dụng để xây dựng lại dữ liệu một số
kiểu dữ liệu nguyên thuỷ vào trong dãy các
byte
• Ghi các byte dữ liệu vào luồng nhị phân
• Cho phép chúng ta chuyển đổi một chuỗi vào
khuôn dạng UTF-8 đƣợc sửa đổi Java và viết
nó vào trong một dãy.
• Định nghĩa một số phƣơng thức và tất cả
phƣơng thức kích hoạt IOException trong
trƣờng hợp lỗi.
Các phƣơng thức giao diện
DataOutput
• void writeBoolean(boolean b)
• void writeByte( int value)
• void writeChar(int value)
• void writeShort(int value)
• void writeLong(long value)
• void writeFloat(float value)
• void writeInt(int value)
• void writeDouble(double value)
• void writeUTF(String value)
Lớp RandomAccessFile
• Cung cấp khả năng thực hiện I/O theo các vị
trí cụ thể bên trong một tập tin.
• dữ liệu có thể đọc hoặc ghi ngẫu nhiên ở
những vị trí bên trong tập tin thay vi một kho
lƣu trữ thông tin liên tục.
• phƣơng thức „seek( )‟ hỗ trợ truy cập ngẫu
nhiên.
• Thực hiện cả đầu vào và đầu ra dữ liệu.
• Hỗ trợ các cấp phép đọc và ghi tập tin cơ
bản.
• Kế thừa các phƣơng thức từ các lớp
„DataInput‟ và „DataOutput‟
Các phƣơng thức của lớp
RandomAccessFile
• seek( )
• getFilePointer( )
• length( )
Gói java.awt.print
• Gồm có các giao diện
– Pageable:
• Định nghĩa các phƣơng thức dùng để các đối tƣợng biểu
thị các trang sẽ đƣợc in.
• Chỉ định số trang đã đƣợc in, và trang hiện tại hay là
tranh giới trang đã đƣợc in
– Printable:
• Chi định phƣơng thức „print( )‟ sử dụng để in một trang
trên đối tƣợng „Graphics‟
– PrinterGraphics:
• Cung cáp khả năng truy cập đối tƣợng „PrinterJob‟
• Giao diê n „PrinterGraphics‟ cung cấp các lớp
sau:
– Paper
– Book
– PageFormat
– PrinterJob
• Gói „java.awt.print‟ kích hoạt các ngoại lệ:
– PrinterException
– PrinterIOException
– PrinterAbortException
Chƣơng IX
KẾT NỐI CSDL
Java Database Connectivity
Tổng quan
• JDBC cung cấp tập các lớp và interface
cho phép chƣơng trình Java có thể nói
chuyện đƣợc với hệ CSDL
• Tập các lớp của JDBC
có thể làm việc đƣợc với
mọi hệ csdl.
• Có 3 bƣớc chính để kết nối CSDL.
– Nạp database drivers
– Tạo nối kết, Tạo đối tƣợng Connection
– Tạo đối tƣợng Statement để thực thi các
lệnh sql..
Ví dụ
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:ATM");
Statement stmt = con.createStatement();
:
:
:
:
Database URL
• Database URL là một chuổi đƣợc dùng
để kết nối csdl.
• cú pháp :
• jdbc:subprotocol name:other_stuff
• The subprotocol name đƣợc dùng tuỳ
vào loại driver sử dụng để kết nối csdl.
• ví dụ : subprotocol name là odbc nếu
driver là cầu nối jdbcodbc
• Other_stuff cũng phụ thuộc vào loại
driver nào đƣợc sử dụng. ví dụ nếu
driver là cầu nối jdbcodbc thì thành
phần này là tên của đối tƣợng ODBC
Database Driver
• Bảo đảm ứng dụng java tƣơng tác với mọi
csdl dƣới một cách thức chuẩn và duy nhất.
• Bảo đảm những yêu cầu từ chƣơng trình sẽ
đƣợc biểu diễn trong csdl dƣới một ngôn ngữ
mà csdl hiểu đƣợc
• nhận các yêu cầu từ client, chuyển nó nó vào
định dạng mà csdl có thể hiểu đƣợc và thể
hiện trong csdl.
• Nhận các phản hồi, chuyển nó ngƣợc lại định
dạng dữ liệu java và thể hiện trong ứng dụng.
Nạp Driver
• Lớp DriverManager chịu trách nhiệm nạp driver
và tạo kết nối đến csdl.
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
• hoặc
Class.forName(String);
– This returns the object associated with the class with
the given string name.
– Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
• Equivalent to:
new sun.jdbc.odbc.JdbcOdbcDriver();
If you have a driver from another vendor, then
find out the class name of that driver and load it
instead.
JDBC Driver
• Có 4 loại JDBC Driver
– Loại 1: JDBC/ODBC
– Loại 2: Native-API
– Loại 3: Open Protocol-Net
– Loại 4: Proprietary-Protocol-Net
• Loại 2,3,4 nói chung đƣợc viết bởi nhà
cung cấp csdl. hiệu quả hơn loại 1
nhƣng thực hiện phức tạp hơn.
Loại I JDBC/ODBC
• jdk hỗ trợ cầu nối jdbc-odbc (jdbc-odbc
bridge).
• Mềm dẻo nhƣng không hiệu quả.
Database
Network Interface
Server
Aplication
JDBC Driver
ODBC Driver
Network Interface
Disk
Client
Loại 2: Native-API
• Tốt hơn loại 1, loại này cho phép JDBC giao
tiếp trực tiếp với các driver hay các hàm API
của CSDL.
Database
Network Interface
Server
Aplication
JDBC Driver
Native Database Library
Network Interface
Disk
Client
Loại 3: Open Protocol-Net
• Drivers
– Có thể chuyển các yêu cầu đến các csdl nằm ở
xa.
– Có thể giao tiếp với nhiều loại CSDL.
– Không phải của nhà cung cấp csdl
– Tất cả bằng mã java
Database
Network Interface
Server
Aplication
JDBC Driver Client
Network Interface
Disk
Client
JDBC Driver Server
Native Database Library
Loại 4: Proprietary-Protocol Net
• 100% java
• Có khả năng giao tiếp trực tiếp với hệ
CSDL không cần chuyển đổi
Database
Network Interface
Server
Aplication
JDBC Driver
Network Interface
Disk
Client
Gói Java.sql
• Cung cấp tập hợp các lớp và interface dùng
để trao đổi với CSDL.
• Các lớp
– DriverManager
– Date, Time
– Timestamp
– Types
• Các Interfaces
■ Driver
■ Connection
■ DatabaseMetaData
■ Statement
■ PreparedStatement
■ CallableStatement
■ ResultSet
■ ResultSetMetaData
Đối tƣợng Statement
• Đối tƣợng Connection chứa liên kết
trực tiếp đến csdl.
• Sử dụng đối tƣợng Connection để tạo
đối tƣợng Statement.
– Statement s = con.createStatement();
• Đối tƣợng này có nhiệm vụ gửi các câu
lệnh sql đến csdl.
• executeQuery(String) or
executeUpdate(String) method
• Cùng một đối tƣợng Statement có thể
sử dụng cho nhiều câu lệnh sql khác
nhau.
• Có 3 phƣơng thức thực thi
– executeQuery()
– executeUpdate()
– execute()
• The executeQuery()
– Nhận câu lệnh SQL (select) làm đối số, trả lại đối
tƣợng ResultSet
• ResultSet rs = s.executeQuery(“SELECT *
FROM Books”);
• Phƣơng thức executeUpdate()
– Nhận các câu lệnh sql dạng cập nhật
– Trả lại số nguyên biểu thị số hàng đƣợc
cập nhật.
– UPDATE, INSERT, or DELETE.
• Phƣơng thức execute()
– Đƣợc áp dụng cho trƣờng hợp không rõ
loại sql nào đƣợc thựƣc hiện.
– Đƣợc áp dụng cho trƣờng hợp câu lệnh
sql đwocj tạo ra tự động bởi chƣơng trình.
ResultSet
• Chứa một hoặc nhiều hàng dữ liệu từ việc
thực hiện câu lệnh truy vấn.
• Có thể lấy dữ liệu từng hàng dữ liệu một
trong ResultSet.
• Sử dụng phƣơng thức next() để di chuyển
đến hàng dữ liệu tiếp theo trong ResultSet.
• Hàm next() trả lại true chỉ rằng hàng chứa dữ
liệu, trả lại false hàng cuối không chứa dữ
liệu.
• Thực hiện
while (rs.next()){
// examine a row from the results
}
• Để lấy dữ liệu ở các cột trên mỗi hàng
của ResultSet, ta dùng các phƣơng
thức.
– get type(int | String)
• Đối số là chỉ số cột tính từ 1.
• Áp dụng cho các cột có kiểu dữ liệu là int, float,
Date.....
– Ví dụ :
• String isbn = rs.getString(1); // Column 1
• float price = rs.getDouble(“Price”);
ResultSet Metadata
• Đối tƣợng này cho biết thông tin về ResultSet
• ResultSet rs = stmt.executeQuery(SQLString);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
• getColumnName(int column)
Prepared Statements
• To execute a Statement object many times, it
will reduce execution time to use
PreparedStatement object
• PreparedStatement object
– unlike a Statement object, it is given an SQL
statement when it is created.
– The advantage to this is that in most cases, this
SQL statement will be sent to the DBMS right
away, where it will be compiled.
– As a result, the PreparedStatement object
contains not just an SQL statement, but an SQL
statement that has been precompiled.
– This means that when the PreparedStatement is
executed, the DBMS can just run the
PreparedStatement 's SQL statement without
having to compile it first
Các đối tƣợng Statement
khác
• Prepared Statements
• Callable Statement
Database Metadata
• Đối tƣợng này cho biết thông tin về
csdl.
Chƣơng trình mẫu
import java.sql.*;
class JDBCDemo1 {
public static void main(String[] args) {
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:Accserver");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(args[0]);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
for(int j=1; j<=numberOfColumns;j++) {
System.out.println(rsmd.getColumnLabel(j));
}
while(rs.next()) {
for(int i=1; i<=numberOfColumns;i++){
System.out.println(rs.getObject(i));
}}
rs.close();
stmt.close();
} catch(Exception e){ System.out.println("Error " + e);
}
}
}
Các file đính kèm theo tài liệu này:
- bai_giang_lap_trinh_java_huynh_cong_phap.pdf