Giáo trình Mô đun Lập trình java - Thiết kế trang Web

Máy ảo Java (JVM - Java Virtual Machine).

Tất cả các chƣơng trình muốn thực thi đƣợc thì phải đƣợc biên dịch ra mã máy.

Mã máy của từng kiến trúc CPU của mỗi máy tính là khác nhau (tập lệnh mã máy của

CPU Intel, CPU Solarix, CPU Macintosh là khác nhau), vì vậy trƣớc đây một chƣơng

trình sau khi đƣợc biên dịch xong chỉ có thể chạy đƣợc trên một kiến trúc CPU cụ thể

nào đó. Đối với CPU Intel chúng ta có thể chạy các hệ điều hành nhƣ Microsoft

Windows, Unix, Linux, OS/2, Chƣơng trình thực thi đƣợc trên Windows đƣợc biên

dịch dƣới dạng file có đuôi .EXE còn trên Linux thì đƣợc biên dịch dƣới dạng file có

đuôi .ELF, vì vậy trƣớc đây một chƣơng trình chạy đƣợc trên Windows muốn chạy đƣợc

trên hệ điều hành khác nhƣ Linux chẳng hạn thì phải chỉnh sửa và biên dịch lại. Ngôn

ngữ lập trình Java ra đời, nhờ vào máy ảo Java mà khó khăn nêu trên đã đƣợc khắc

phục. Một chƣơng trình viết bằng ngôn ngữ lập trình Java sẽ đƣợc biên dịch ra mã của

máy ảo java (mã java bytecode). Sau đó máy ảo Java chịu trách nhiệm chuyển mã java

bytecode thành mã máy tƣơng ứng. Sun Microsystem chịu trách nhiệm phát triển các

máy ảo Java chạy trên các hệ điều hành trên các kiến trúc CPU khác nhau.Trang 6

Thông dịch:

Java là một ngôn ngữ lập trình vừa biên dịch vừa thông dịch. Chƣơng trình nguồn

viết bằng ngôn ngữ lập trình Java có đuôi *.java đầu tiên đƣợc biên dịch thành tập tin có

đuôi *.class và sau đó sẽ đƣợc trình thông dịch thông dịch thành mã máy.

Độc lập nền:

Một chƣơng trình viết bằng ngôn ngữ Java có thể chạy trên nhiều máy tính có hệ

điều hành khác nhau (Windows, Unix, Linux, ) miễn sao ở đó có cài đặt máy ảo java

(Java Virtual Machine). Viết một lần chạy mọi nơi (write once run anywhere).

Hƣớng đối tƣợng:

Hƣớng đối tƣợng trong Java tƣơng tự nhƣ C++ nhƣng Java là một ngôn ngữ lập

trình hƣớng đối tƣợng hoàn toàn. Tất cả mọi thứ đề cập đến trong Java đều liên quan

đến các đối tƣợng đƣợc định nghĩa trƣớc, thậm chí hàm chính của một chƣơng trình viết

bằng Java (đó là hàm main) cũng phải đặt bên trong một lớp. Hƣớng đối tƣợng trong

Java không có tính đa kế thừa (multi inheritance) nhƣ trong C++ mà thay vào đó Java

đƣa ra

khái niệm interface để hỗ trợ tính đa kế thừa. Vấn đề này sẽ đƣợc bàn chi tiết

trong chƣơng 3.

Đa nhiệm - đa luồng (MultiTasking - Multithreading):

Java hỗ trợ lập trình đa nhiệm, đa luồng cho phép nhiều tiến trình, tiểu trình có

thể chạy song song cùng một thời điểm và tƣơng tác với nhau.

Khả chuyển (portable):

Chƣơng trình ứng dụng viết bằng ngôn ngữ Java chỉ cần chạy đƣợc trên máy ảo

Java là có thể chạy đƣợc trên bất kỳ máy tính, hệ điều hành nào có máy ảo Java. “Viết

một lần, chạy mọi nơi” (Write Once, Run Anywhere).

Hỗ trợ mạnh cho việc phát triển ứng dụng:

Công nghệ Java phát triển mạnh mẽ nhờ vào “đại gia Sun Microsystem” cung

cấp nhiều công cụ, thƣ viện lập trình phong phú hỗ trợ cho việc phát triển nhiều loại

hình ứng dụng khác nhau cụ thể nhƣ: J2SE (Java 2 Standard Edition) hỗ trợ phát triển

những ứng dụng đơn, ứng dụng client-server; J2EE (Java 2 Enterprise Edition) hỗ trợ

phát triển các ứng dụng thƣơng mại, J2ME (Java 2 Micro Edition) hỗ trợ phát triển các

ứng dụng trên các thiết bị di động, không dây,

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 1

Trang 1

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 2

Trang 2

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 3

Trang 3

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 4

Trang 4

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 5

Trang 5

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 6

Trang 6

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 7

Trang 7

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 8

Trang 8

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 9

Trang 9

Giáo trình Mô đun Lập trình java - Thiết kế trang Web trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 98 trang duykhanh 7580
Bạn đang xem 10 trang mẫu của tài liệu "Giáo trình Mô đun Lập trình java - Thiết kế trang Web", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Mô đun Lập trình java - Thiết kế trang Web

Giáo trình Mô đun Lập trình java - Thiết kế trang Web
trị int đƣợc xác định bởi val. 
void 
writeLong (long val) 
 Ghi xuống luồng một giá 
trị long đƣợc xác định bởi val. 
void 
writeShort (int val) 
 Ghi xuống luồng một giá 
trị short đƣợc xác định bởi val. 
Contructor: DataOutputStream(OutputStream outputStream) 
OutputStream: là luồng xuất dữ liệu. Để ghi dữ liệu ra file thì đối tƣợng 
outputStream có thể là FileOutputStream. 
DataInputStream: hiện thực interface DataInput. Interface DataInput có các 
phƣơng thức cho phép đọc tất cả những kiểu dữ liệu cơ sở của java (theo định dạng nhị 
phân). 
 Phƣơng thức Ý nghĩa 
boolean 
readBoolean( ) 
 Đọc một giá trị boolean 
Byte 
readByte( ) 
 Đọc một byte 
char 
readChar( ) 
 Đọc một Char 
double 
readDouble( ) 
 Đọc một giá trị Double 
float 
readFloat( ) 
 Đọc một giá trị float 
int readInt( ) Đọc một giá trị int 
Long 
readLong( ) 
 Đọc một giá trị long 
short 
readShort( ) 
 Đọc một giá trị short 
 Contructor: DataInputStream(InputStream inputStream) InputStream: là luồng nhập 
dữ liệu. Đểđọ dữ liệu từ file thì đối tƣợng InputStream có thể là FileInputStream. 
Trang 85 
Ví dụ: dùng DataOutputStream và DataInputStream để ghi và đọc những kiểu dữ 
liệu khác nhau trên file.import java.io.*; 
class RWData 
{ 
 public static void main(String args[]) throws IOException 
 { 
 DataOutputStream dataOut; DataInputStream dataIn; 
 int i = 10; double d = 1023.56; 
 boolean b = true; try 
 { 
dataOut = new DataOutputStream( 
 new FileOutputStream("D:\\testdata")); 
 } 
 catch(IOException exc) 
 { 
 System.out.println("Cannot open file."); 
 return; 
 } 
 try 
 { 
 System.out.println("Writing " + i); 
 dataOut.writeInt(i); 
 System.out.println("Writing " + d); 
 dataOut.writeDouble(d); 
 System.out.println("Writing " + b); 
 dataOut.writeBoolean(b); 
 System.out.println("Writing " + 12.2 * 7.4); 
 dataOut.writeDouble(12.2 * 7.4); 
 } 
 catch(IOException exc) 
 { 
 System.out.println("Write error."); 
 } 
 dataOut.close(); System.out.println(); 
 // Now, read them back. try 
 { 
 dataIn = new DataInputStream( 
 new FileInputStream("D:\\testdata")); 
 } 
 catch(IOException exc) 
 { 
 System.out.println("Cannot open file."); 
 return; 
 } 
 try 
Trang 86 
 { 
 i = dataIn.readInt(); 
 System.out.println("Reading " + i); 
 d = dataIn.readDouble(); 
 System.out.println("Reading " + d); 
 b = dataIn.readBoolean(); 
 System.out.println("Reading " + b); 
 d = dataIn.readDouble(); 
 System.out.println("Reading " + d); 
 } 
 catch(IOException exc) 
 { System.out.println("Read error."); 
 } 
 dataIn.close(); 
 } 
} 
Kết quả thực thi chƣơng trình: 
Dữ liệu ghi xuống file D:\\testdata 
Hình 5.4 Dữ liệu ghi xuống file D:\\testdata 
Kết quả đọc và xuất ra Console: 
Hình 5.5 Kết quả đọc và xuất ra Console 
5.4.File truy cập ngẫu nhiên (Random Access Files) 
 Bên cạnh việc xử lý xuất nhập trên file theo kiểu tuần tự thông qua các luồng, 
java cũng hỗ trợ truy cập ngẫu nhiên nội dung của một file nào đó dùng 
RandomAccessFile. RandomAccessFile không dẫn xuất từ InputStream hay 
OutputStream mà nó hiện thực các interface DataInput, DataOutput (có định 
nghĩa các phƣơng thức I/O cơ bản). RandomAccessFile hỗ trợ vấn đềđịnh vị con trỏ file 
bên trong một file dùng phƣơng thức seek(long newPos). 
Ví dụ: minh họa việc truy cập ngẫu nhiên trên file. Chƣơng trình ghi 6 số kiểu 
double xuống file, rồi đọc lên theo thứ tự ngẫu nhiên. 
import java.io.*; 
class RandomAccessDemo 
{ 
 public static void main(String args[]) throws IOException 
Trang 87 
 { 
 double data[] = {19.4, 10.1, 123.54, 33.0, 87.9, 74.25}; double d; 
 RandomAccessFile raf; 
 try 
 { 
raf = new RandomAccessFile("D:\\random.dat", 
"rw"); 
 } 
 catch(FileNotFoundException exc) 
 { 
 System.out.println("Cannot open file."); 
 return ; 
 } 
 // Write values to the file. 
 for(int i=0; i < data.length; i++) 
 { try 
 { 
 raf.writeDouble(data[i]); 
 } 
 catch(IOException exc) 
 { 
 System.out.println("Error writing to file."); 
 return ; 
 } 
 } 
 try 
 { 
 // Now, read back specific values raf.seek(0); 
// seek to first double d = raf.readDouble(); 
 System.out.println("First value is " + d); 
 raf.seek(8); // seek to second double 
 d = raf.readDouble(); 
 System.out.println("Second value is " + d); 
 raf.seek(8 * 3); // seek to fourth double 
 d = raf.readDouble(); 
 System.out.println("Fourth value is " + d); 
 System.out.println(); 
 // Now, read every other value. 
 System.out.println("Here is every other value: "); 
 for(int i=0; i < data.length; i+=2) { 
 raf.seek(8 * i); // seek to ith double 
 d = raf.readDouble(); 
 System.out.print(d + " "); 
 } 
Trang 88 
 System.out.println("\n"); 
 } 
 catch(IOException exc) 
 { 
 System.out.println("Error seeking or reading."); 
 } 
 raf.close(); 
 } 
} 
Kết quả thực thi chƣơng trình: 
HÌnh 5.6 ghi 6 số kiểu double xuống file, rồi đọc lên theo thứ tự ngẫu nhiên 
5.5.Sử dụng luồng ký tự 
 Chúng ta đã tìm hiểu và sử dụng luồng byte để xuất/nhập dữ liệu. Tuy có thể 
nhƣng trong một số trƣờng hợp luồng byte không phải là cách “lý tƣởng” để quản lý 
xuất nhập dữ liệu kiểu character, vì vậy java đã đƣa ra kiểu luồng character phục vụ cho 
việc xuất nhập dữ liệu kiểu character trên luồng. 
 Mức trên cùng là hai lớp trừu tƣợng Reader và Writer. Lớp Reader dùng cho 
việc nhập dữ liệu của luồng, lớp Writer dùng cho việc xuất dữ liệu của luồng. Những 
lớp dẫn xuất từReader và Writer thao tác trên các luồng ký tự Unicode. 
Những phƣơng thức định nghĩa trong lớp trừu tƣợng Reader và Writer 
 Phƣơng 
thức 
Ý nghĩa 
 Reader 
abstract void 
close( ) 
Đóng luồng 
void mark(int 
numChars) 
Đánh dấu vị trí hiện tại 
trên luồng 
boolean 
markSupported( ) 
Kiểm tra xem luồng có 
hỗ trợ thao tác đánh dấu mark() 
không? 
int read( ) 
Đọc một ký tự 
int read(char 
buffer[ ]) 
Đọc buffer.length ký tự 
cho vào buffer 
Trang 89 
abstract int 
read(char 
buffer[ ], int 
offset, 
int numChars) 
Đọc numChars ký tự 
cho vào vùng đệm buffer tại vị 
trí buffer[offset] 
boolean ready( ) 
Kiểm tra xem luồng có 
đọc đƣợc không? 
void reset( ) 
Dời con trỏ nhập đến vị 
trí đánh dấu trƣớc đó 
long skip(long 
numChars) 
Bỏ qua numChars của 
luồng nhập 
 Writer 
abstract void 
close( ) 
Đóng luồng xuất. Có lỗi 
ném ra IOException 
abstract void 
flush( ) 
Dọn dẹp luồng (buffer 
xuất) 
void write(int ch) Ghi một ký tự 
void write(byte 
buffer[ ]) 
Ghi một mảng các ký tự 
abstract void 
write(char 
buffer[ ], int 
offset, 
int numChars) 
Ghi một phần của mảng 
ký tự 
void write(String 
str) 
Ghi một chuỗi 
void write(String 
str, int 
offset, 
int numChars) 
Ghi một phần của một 
chuỗi ký tự 
5.5.1.Nhập Console dùng luồng ký tự 
 Thƣờng thì việc nhập dữ liệu từ Console dùng luồng ký tự thì thuận lợi hơn dùng 
luồng byte. Lớp tốt nhất đểđọc dữ liệu nhập từ Console là lớp BufferedReader. Tuy 
nhiên chúng ta không thể xây dựng một lớp BufferedReader trực tiếp từSystem.in. Thay 
vào đó chúng ta phải chuyển nó thành một luồng ký tự. Để làm điều này chúng ta dùng 
InputStreamReader chuyển bytes thành ký tự. 
Để có đƣợc một đối tƣợng InputStreamReader gắn với System.in ta dùng 
constructor của InputStreamReader. InputStreamReader(InputStream inputStream) 
 Tiếp theo dùng đối tƣợng InputStreamReaderđã tạo ra để tạo ra một 
BufferedReader dùng constructor BufferedReader. BufferedReader(Reader inputReader) 
Ví dụ: Tạo một BufferedReader gắn với Keyboard 
 BufferedReader br = new BufferedReader(new 
InputStreamReader(System.in)); 
Sau khi thực hiện câu lệnh trên, br là một luồng ký tự gắn với Console thông qua 
System.in. 
Trang 90 
Ví dụ: Dùng BufferedReader đọc từng ký tự từ Console. Việc đọc kết thúc khi 
gặp dấu chấm (dấu chấm để kết thúc chƣơng trình). 
import java.io.*; class ReadChars 
{ 
 public static void main(String args[]) throws IOException 
 { 
 char c; 
 BufferedReader br = newBufferedReader( 
 new InputStreamReader(System.in)); 
 System.out.println("Nhap chuoi ky tu, 
 gioi han dau cham."); 
 // read characters 
 do 
 { 
 c = (char) br.read(); 
 System.out.println(c); 
 } while(c != '.'); 
 } 
} 
Kết quả thực thi chƣơng trình: 
Hình 5.7 Nhập Console dùng luồng ký tự 
Ví dụ: Dùng BufferedReader đọc chuỗi ký tự từ Console. Chƣơng trình kết thúc 
khi gặp chuỗi đọc là chuỗi “stop” 
import java.io.*; class ReadLines 
{ 
 public static void main(String args[]) throws IOException 
 { 
 // create a BufferedReader using System.in 
 BufferedReader br = new BufferedReader(new 
 InputStreamReader(System.in)); 
 String str; 
 System.out.println("Nhap chuoi."); 
System.out.println("Nhap 'stop' ket thuc chuong trinh."); 
 do 
 { 
 str = br.readLine(); 
 System.out.println(str); 
 } while(!str.equals("stop")); 
 } 
} 
Trang 91 
Kết quả thực thi chƣơng trình: 
Hình 5.8 Dùng BufferedReader đọc chuỗi ký tự từ Console 
5.5.2.Xuất Console dùng luồng ký tự 
 Trong ngôn ngữ java, bên cạnh việc dùng System.outđể xuất dữ liệu ra Console 
(thƣờng dùng để debug chƣơng trình), chúng ta có thể dùng luồng PrintWriterđối với 
các chƣơng trình “chuyên nghiệp”. PrintWriter là một trong những lớp luồng ký tự. Việc 
dùng các lớp luồng ký tựđể xuất dữ liệu ra Console thƣờng đƣợc “ƣa chuộng” hơn. 
Để xuất dữ liệu ra Console dùng PrintWriter cần thiết phải chỉđịnh System.out 
cho luồng xuất. 
Ví dụ: Tạo đối tƣợng PrintWriter để xuất dữ liệu ra Console 
PrintWriter pw = new PrintWriter(System.out, true); 
 Ví dụ: minh họa dùng PrintWriterđể xuất dữ liệu ra Console import java.io.*; 
public class PrintWriterDemo 
{ 
 public static void main(String args[]) 
 { 
 PrintWriter pw = new PrintWriter(System.out, true); int i = 10; 
 double d = 123.67; 
 double r = i+d 
 pw.println("Using a PrintWriter."); 
 pw.println(i); pw.println(d); 
 pw.println(i + " + " + d + " = " + r); 
 } 
} 
Kết quả thực thi chƣơng trình: 
Hình 5.9 Xuất Console dùng luồng ký tự 
5.5.3.Đọc/ghi File dùng luồng ký tự 
 Thông thƣờng đểđọc/ghi file ngƣời ta thƣờng dùng luồng byte, nhƣng đối với 
luồng ký tự chúng ta cũng có thể thực hiện đƣợc. Ƣu điểm của việc dùng luồng ký tự là 
chúng thao tác trực tiếp trên các ký tự Unicode. Vì vậy luồng ký tự là chọn lựa tốt nhất 
khi cần lƣu những văn bản Unicode. 
 Hai lớp luồng thƣờng dùng cho việc đọc/ghi dữ liệu ký tự xuống file là 
FileReader và FileWriter. 
Ví dụ: Đọc những dòng văn bản nhập từ bàn phím và ghi chúng xuống file tên là 
“test.txt”. Việc đọc và ghi kết thúc khi ngƣời dùng nhập vào chuỗi “stop”. 
Trang 92 
import java.io.*; class KtoD 
{ 
 public static void main(String args[]) throws IOException 
 { 
 String str; 
 FileWriter fw; 
 BufferedReader br = new BufferedReader( 
 new InputStreamReader(System.in)); 
 try 
 { 
 fw = new FileWriter("D:\\test.txt"); 
 } 
 catch(IOException exc) 
 { 
 System.out.println("Khong the mo file."); 
 return ; 
 } 
System.out.println("Nhap ('stop' de ket thuc chuong trinh)."); 
 do 
 { 
 System.out.print(": "); str = 
br.readLine(); if(str.compareTo("stop") == 0) break; 
 str = str + "\r\n"; fw.write(str); 
 } while(str.compareTo("stop") != 0); 
 fw.close(); 
 } 
} 
Kết quả thực thi chƣơng trình Dữ liệu nhập từ Console: 
Hình 5.11 Đọc File dùng luồng ký tự 
Dữ liệu ghi xuống file: 
Hình 5.12 Ghi File dùng luồng ký tự 
Ví dụ: đọc và hiển thị nội dung của file “test.txt” lên màn hình. 
Trang 93 
 import java.io.*; class DtoS 
{ 
 public static void main(String args[]) throws Exception 
 { 
 FileReader fr = new FileReader("D:\\test.txt"); 
 BufferedReader br = new BufferedReader(fr); 
 String s; 
 while((s = br.readLine()) != null) 
 { 
 System.out.println(s); 
 } 
 fr.close(); 
 } 
} 
Kết quả thực thi chƣơng trình Nội dung của file test.txt: 
Hình 5.13 đọc và hiển thị nội dung của file “test.txt” lên màn hình 
Kết quả đọc file và hiển thị ra Console: 
Hình 5.14 đọc file và hiển thị ra Console 
5.6.Lớp File 
 Lớp File không phục vụ cho việc nhập/xuất dữ liệu trên luồng. Lớp File thƣờng 
đƣợc dùng để biết đƣợc các thông tin chi tiết về tập tin cũng nhƣ thƣ mục (tên, ngày giờ 
tạo, kích thƣớc, ) 
java.lang.Object +--java.io.File 
Các Constructor: 
Tạo đối tƣợng File từđƣờng dẫn tuyệt đối public File(String pathname) ví dụ: 
File f = new File(“C:\\Java\\vd1.java”); 
Tạo đối tƣợng File từ tên đƣờng dẫn và tên tập tin tách biệt public File(String 
parent, String child) ví dụ: File f = new File(“C:\\Java”, “vd1.java”); 
Tạo đối tƣợng File từ một đối tƣợng File khác public File(File parent, String 
child) 
ví dụ: File dir = new File (“C:\\Java”); 
 File f = new File(dir, “vd1.java”); 
 Một số phƣơng thức thƣờng gặp của lớp File (chi tiết về các phƣơng thức đọc 
thêm trong tài liệu J2SE API Specification) 
Trang 94 
public 
StringgetName() 
Lấy tên của đối 
tƣợng File 
public 
StringgetPath() 
Lấy đƣờng dẫn của 
tập tin 
public boolean 
isDirectory() 
Kiểm tra xem tập 
tin có phải là thƣ mục 
không? 
public boolean 
isFile() 
Kiểm tra xem tập tn 
có phải là một file không? 
public String[] 
list() 
Lấy danh sách tên 
các tập tin và thƣ mục con 
của đối tƣợng File đang 
xét và trả về trong một 
mảng. 
Ví dụ: 
import java.awt.*; import java.io.*; 
public class FileDemo 
{ 
 public static void main(String args[]) 
 { 
 Frame fr = new Frame ("File Demo"); fr.setBounds(10, 10, 300, 200); 
 fr.setLayout(new BorderLayout()); 
 Panel p = new Panel(new GridLayout(1,2)); 
 List list_C = new List(); 
 list_C.add("C:\\"); 
 File driver_C = new File ("C:\\"); 
 String[] dirs_C = driver_C.list(); 
 for (int i=0;i<dirs_C.length;i++) 
 { 
 File f = new File ("C:\\" + dirs_C[i]); 
 if (f.isDirectory()) 
 list_C.add("" + dirs_C[i]); 
 else 
 list_C.add(" " + dirs_C[i]); 
 } 
 List list_D = new List(); 
list_D.add("D:\\"); 
File driver_D = new File ("D:\\"); 
String[] dirs_D = driver_D.list(); 
for (int i=0;i<dirs_D.length;i++) 
Trang 95 
{ 
 File f = new File ("D:\\" + dirs_D[i]); 
 if (f.isDirectory()) 
 list_D.add("" + dirs_D[i]); 
 else 
 list_D.add(" " + dirs_D[i]); 
 } 
 p.add(list_C); 
 p.add(list_D); 
 fr.add(p, BorderLayout.CENTER); 
 fr.setVisible(true); 
 } 
 } 
Kết quả thực thi chƣơng trình: 
Hình 5.15 FileDemo 
Trang 96 
Tài liệu tham khảo 
[1] java.sun.com 
[2] Herbert Schildt. Java 2. A Beginner’s Guide. Second Edition. McGraw-Hill - 
2003. 
[3] Dr. Harvey M. Deitel - Paul J. Deitel. Java How to 
Program, 4th Ed (Deitel). Prentice Hall - 2002 
[4] Simon Roberts – Philip Heller – Michael Ernest. Complete Java 2 Certification 
– study guide. BPB Publications – 2000. 
[5] Cay S. Horstmann – Gary Cornell. Core Java Volum 1 - 
Fundamentals. The Sun Microsystems press. 1997 
[6] Cay S. Horstmann – Gary Cornell. Core Java Volum 2 – Advanced Features. 
The Sun Microsystems press. 1997 

File đính kèm:

  • pdfgiao_trinh_mo_dun_lap_trinh_java_thiet_ke_trang_web.pdf