Bài giảng ngôn ngữ lập trình Java
lượt xem 125
download
Java là một ngôn ngữ lập trình mạnh đang được sử dụng rất rộng rãi hiện nay trên toàn thế giới. Trên thực tế, Java được biết đến không chỉ là một ngôn ngữ lập trình mà là một platform – một môi trường và công nghệ phát triển – riêng biệt.
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng ngôn ngữ lập trình Java
- MỤC LỤC MỤC LỤC........................................................................................................................................1 Đề tài 0. Giới thiệu về Java............................................................................................................6 I. Lịch sử hình thành và phát triển ngôn ngữ lập trình Java.......................................................6 I.1. Giới thiệu về Java.............................................................................................................6 I.2 Tóm tắt lịch sử hình thành của Java ................................................................................. 6 II. Các đặc trưng của Java...........................................................................................................7 II.1. Tính đơn giản...................................................................................................................7 II.2. Tính hướng đối tượng..................................................................................................... 7 II.3. Tính phân tán.................................................................................................................... 7 II.4. Tính mạnh mẽ..................................................................................................................7 II.5. Tính an toàn...................................................................................................................... 7 II.6. Tính trung lập...................................................................................................................8 II.7. Tính di động..................................................................................................................... 8 II.8. Tính thông dịch.................................................................................................................9 II.9. Tính thực thi cao...............................................................................................................9 II.10. Tính đa luồng..................................................................................................................9 II.11. Tính động .......................................................................................................................9 III. Các loại ứng dụng của Java..................................................................................................9 IV. Công cụ và môi trường lập trình Java.................................................................................. 9 V. Cài đặt Java ..........................................................................................................................10 Đề tài 1. Ngôn ngữ mô hình hóa UML......................................................................................... 13 I. Xây dựng hệ thống phần mềm theo hướng đối tượng........................................................13 I.1 Các khái niệm căn bản của công nghệ hướng đối tượng.............................................. 13 I.2 Quy trình chung phát triển hệ thống phần mềm.............................................................14 I.3 Những thách thức của ngành công nghiệp phần mềm hiện nay....................................14 II. Lịch sử phát triển ngôn ngữ mô hình hóa UML...................................................................14 II.1. Tóm tắt lịch sử UML..................................................................................................... 14 II.2. Khái niệm về UML........................................................................................................15 II.3 Đặc trưng của UML........................................................................................................15 III. Ngôn ngữ UML....................................................................................................................16 III.1. Các thành phần của UML.............................................................................................16 III.2. Các hướng nhìn (view)..................................................................................................17 III.3 Ứng dụng UML trong quy trình làm phần mềm.......................................................... 24 IV. Quy trình Rational Unified Process (RUP) phát triển phần mềm dựa trên UML..............26 IV.1. Giới thiệu về RUP........................................................................................................26 IV.2. Các nguyên tắc chính của RUP:...................................................................................26 IV.3. Vòng đời của phần mềm theo quy trình RUP.............................................................26 IV.4. Các công cụ của RUP...................................................................................................28 Bài tập........................................................................................................................................28 Đề tài 2. Nhập môn Java...............................................................................................................29 I. Viết và thực hiện một chương trình Java ............................................................................ 29 I.1 Tìm hiểu mã nguồn một chương trình đơn giản............................................................ 29 I.2. Thực hiện chương trình Java.......................................................................................... 29 I.3. Một số chú ý khi lập trình Java.......................................................................................30 1
- I.4. Cấu trúc một chương trình Java..................................................................................... 30 II. Các kiểu dữ liệu trong Java..................................................................................................31 II.1 Các kiểu dữ liệu số nguyên............................................................................................31 II.2 Các kiểu số thực............................................................................................................. 32 II.3 Kiểu ký tự (character).....................................................................................................32 II.4 Kiểu logic (boolean)........................................................................................................32 II.5 Kiểu chuỗi.......................................................................................................................32 II.6 Chuyển đổi giữa các kiểu số..........................................................................................32 III. Khai báo biến và hằng trong Java.......................................................................................33 III.1 Quy tắc đặt tên biến......................................................................................................33 III.2 Khai báo biến................................................................................................................. 33 III.3 Biến kiểu mảng.............................................................................................................34 III.4 Hằng số (literal).............................................................................................................35 III.5 Phạm vi hoạt động của hằng và biến:......................................................................... 36 IV. Các toán tử và biểu thức..................................................................................................... 36 IV.1 Các toán tử và thứ tự ưu tiên.........................................................................................36 IV.2 Biểu thức....................................................................................................................... 37 V. Các lệnh điều khiển rẽ nhánh..............................................................................................38 V.1 Lệnh if.............................................................................................................................38 V.2. Lệnh switch …case........................................................................................................ 38 VI. Các lệnh lặp.........................................................................................................................39 VI.1. Vòng lặp for..................................................................................................................39 VI.2. Vòng lặp while..............................................................................................................40 VI.3. Vòng lặp do... while......................................................................................................41 VI.4. Phép nhảy......................................................................................................................41 VII. Vào dữ liệu từ bàn phím và xuất dữ liệu ra màn hình..................................................... 42 VII.1. Lấy giá trị nhập vào từ bàn phím............................................................................... 42 VII.2 Kết xuất dữ liệu ra màn hình..................................................................................... 43 Bài tập........................................................................................................................................44 Đề tài 3. Lập trình hướng đối tượng trong Java.......................................................................... 46 I. Khái niệm lập trình hướng đối tượng (Object-Oriented Programming - OOP)...................46 I.1. Khái niệm OOP............................................................................................................... 46 I.2 Cơ sở lý luận của OOP....................................................................................................46 I.3 Trừu tượng hóa.................................................................................................................46 II. Tính đóng gói trong Java....................................................................................................... 48 II.1 Khái niệm tính đóng gói..................................................................................................48 II.2 Mối quan hệ giữa các class.............................................................................................48 II.3 Một số gợi ý khi thiết kế class.......................................................................................48 IV. Sử dụng các Class xây dựng sẵn trong thư viện................................................................49 V. Xây dựng Class trong Java....................................................................................................50 V.1 Cấu trúc của class...........................................................................................................50 V.2 Các thuộc tính thành phần:............................................................................................. 51 V.3 Các phương thức thành phần......................................................................................... 52 V.4 Gọi và truyền tham số cho phương thức.......................................................................53 V.6 Các hàm và phương thức đặc biệt................................................................................. 53 V.7 Khai báo chồng các phương thức...................................................................................54 V.8 Lớp lồng nhau – lớp nội.................................................................................................55 2
- VI. Tính kế thừa trong Java.......................................................................................................56 VI.1 Sự kế thừa các thuộc tính và phương thức.................................................................. 56 VI.2 Sự kế thừa đối với các constructor...............................................................................59 VII. Tính đa hình trong Java.......................................................................................................60 VII.1 Sự ép kiểu và gán tham chiếu đối tượng....................................................................60 VII.2 Sự ràng buộc động –Dynamic Binding .......................................................................61 VIII. Lớp Object.........................................................................................................................62 IX. Giao diện..............................................................................................................................62 IX.1 Cấu trúc của giao diện..................................................................................................62 IX.2 Các tính chất của giao diện...........................................................................................64 X. Package..................................................................................................................................64 X.1 Sử dụng các package trong thư viện Java......................................................................64 X.2 Đặt lớp vào package....................................................................................................... 65 Bài tập........................................................................................................................................65 Đề tài 4. Lớp và phương thức trừu tượng....................................................................................67 I. Khái niệm lớp trừu tượng......................................................................................................67 II. Cài đặt lớp và phương thức trừu tượng trong Java.............................................................67 Bài tập........................................................................................................................................68 Đề tài 5. Lưu trữ và xử lý đối tượng............................................................................................69 I. Lớp Vector và giao diện Enumeration...................................................................................69 I.1 Lớp Vector........................................................................................................................69 I.2 Giao diện Enumeration.....................................................................................................70 II. Mảng trong Java và lớp ArrayList........................................................................................72 II.1 Mảng trong Java..............................................................................................................72 II.2. Các thuật toán cơ bản trên mảng.................................................................................. 73 II.3 Class Arrays.....................................................................................................................74 III Danh sách trong java và giao diện Lists ..............................................................................76 Bài tập........................................................................................................................................77 Đề tài 6. Các luồng vào ra dữ liệu với file...................................................................................78 I. Khái niệm luồng vào ra (I/O stream).....................................................................................78 II. Lớp InputStream:...................................................................................................................79 III. Lớp OutputStream................................................................................................................80 IV. Lớp FileInputStream............................................................................................................80 V. Lớp FileOutputStream...........................................................................................................80 VI. Lớp File................................................................................................................................80 VII. Nhập xuất lọc ................................................................................................................... 82 VII.1 Lớp FilterInputStream: ................................................................................................ 82 VII.2 Lớp FilterOutputStream................................................................................................82 VIII. Vào/ra có sử dụng bộ đệm ..............................................................................................82 VIII.1 Lớp BufferedInputStream:.......................................................................................... 82 VIII.2 Lớp BufferedOutputStream.........................................................................................82 IX. Lớp RandomAccessFile ......................................................................................................85 X. Đối tượng System.in.............................................................................................................85 XI. Truy cập file ở chế độ tuần tự...........................................................................................85 XII. Truy cập file nhị phân........................................................................................................ 89 Bài tập .......................................................................................................................................90 Đề tài 7. Xử lý ngoại lệ................................................................................................................ 91 3
- I. Các tình huống sử dụng ngoại lệ.......................................................................................... 91 II. Cơ sở quản lý ngoại lệ trong Java.......................................................................................91 III. Cấu trúc cây kế thừa các xử lý ngoại lệ............................................................................92 IV. Sử dụng ngoại lệ được kiểm soát......................................................................................93 V. Xây dựng một ngoại lệ........................................................................................................94 VI. Bài tập..................................................................................................................................95 Đề tài 8. Xử lý các sự kiện trong Java..........................................................................................96 I. Khái niệm và cơ sở xử lý sự kiện.........................................................................................96 II. Truy cập thông tin sự kiện................................................................................................. 102 III. Xử lý các sự kiện trên window......................................................................................... 103 IV. Các lớp thích nghi..............................................................................................................104 V. Xử lý các sự kiện chuột..................................................................................................106 Bài tập......................................................................................................................................107 Đề tài 9. Applet............................................................................................................................108 I. Xây dựng một Applet đơn giản...........................................................................................108 II. Cấu trúc cơ bản và vòng đời của một Applet................................................................... 108 III. An ninh và khả năng của Applet....................................................................................... 110 IV. Ứng dụng Applet với của sổ Popup................................................................................. 110 V. Các thẻ HTML của Applet................................................................................................. 111 VI. Các phương thức, lập trình đồ họa và bắt sự kiện của applet........................................112 Đề tài 10. Lập trình giao diện đồ họa GUI................................................................................114 I. Giới thiệu AWT .................................................................................................................. 114 II. Vật chứa (Container).......................................................................................................... 115 II.1 JFrame............................................................................................................................115 II.2 JPanel............................................................................................................................. 115 II.3 JDialog...........................................................................................................................116 II.4 JScrollPane.....................................................................................................................118 III. Giới thiệu về các thành phần GUI cơ bản.......................................................................118 III.1 Nút nhấn ......................................................................................................................118 III.2 Nhãn (Label).................................................................................................................118 III.3 Nút đánh dấu (checkbox).............................................................................................120 III.4 Nút chọn (radio button)................................................................................................122 III.5 Hộp thoại Combo ....................................................................................................... 122 III.6 Danh sách (Lists)..........................................................................................................123 III.7 Ô văn bản (text field) và vùng văn bản (text areas).................................................... 125 III.8 Thanh trượt (Scrollbar)................................................................................................ 128 IV. Thành phần Menu..............................................................................................................129 V. Bộ quản lý cách trình bày (Layout Manager).....................................................................132 V.1 Cách trình bày FlowLayout:.......................................................................................... 133 V.2 Cách trình bày GridLayout:...........................................................................................133 V.3 Cách trình bày BorderLayout........................................................................................ 133 VI. Các hộp thoại.....................................................................................................................133 VI.1 Hộp thoại thông báo.................................................................................................... 133 VI.2 Hộp thoại chọn File.....................................................................................................134 VI.3 Hộp thoại chọn màu....................................................................................................135 Bài tập......................................................................................................................................135 Đề tài 11. Threading.................................................................................................................... 137 4
- I. Khái niệm thread.................................................................................................................. 137 I.1 Khái niệm:...................................................................................................................... 137 I.2. Lớp Thread.....................................................................................................................137 I.3 Các bước để tạo một thread.......................................................................................... 138 II. Các trạng thái của thread....................................................................................................138 III. Các thuộc tính của thread..................................................................................................139 III.1 Độ ưu tiên của thread.................................................................................................. 139 III.2 Nhóm thread................................................................................................................. 140 III.3 Quản lý các ngoại lệ của thread................................................................................. 140 IV. Điều khiển các thread........................................................................................................141 IV.1 Interrupt một thread..................................................................................................... 141 IV.2 Dừng một thread..........................................................................................................142 IV.3 Tạm dừng và phục hồi một thread.............................................................................143 IV.4 Giải phóng thời gian cho CPU.................................................................................... 143 IV.5 Đợi một thread kết thúc công việc............................................................................. 143 V. Đồng bộ thread................................................................................................................... 144 V.1 Tình trạng “đua tranh”.................................................................................................. 144 V.2 Khóa đối tượng.............................................................................................................145 V.3 Đối tượng điều kiện.....................................................................................................146 Bài tập......................................................................................................................................148 Phụ lục A. Các từ khóa của Java................................................................................................ 149 Phụ lục B Một số hàm hay sử dụng...........................................................................................150 Tài liệu tham khảo.......................................................................................................................151 5
- Đề tài 0. Giới thiệu về Java I. Lịch sử hình thành và phát triển ngôn ngữ lập trình Java I.1. Giới thiệu về Java Java là một ngôn ngữ lập trình mạnh đang được sử dụng rất rộng rãi hiện nay trên toàn thế giới. Trên thực tế, Java được biết đến không chỉ là m ột ngôn ngữ lập trình mà là m ột platform – một môi trường và công nghệ phát triển – riêng bi ệt. Khi làm vi ệc v ới Java, ng ười lập trình được sở hữu một thư viện lớn, có tính m ở với m ột lượng mã ngu ồn tái s ử d ụng khổng lồ luôn có trên internet. Ngoài ra, các chương trình vi ết bằng Java có môi tr ường th ực thi riêng với các tính năng bảo mật, khả năng tri ển khai trên nhiều h ệ đi ều hành khác nhau và nhiều tính năng ưu việt khác chúng ta sẽ xem xét trong phần sau. I.2 Tóm tắt lịch sử hình thành của Java Năm 1991, một nhóm kỹ sư của hãng SUN bao gồm Patrick Naughton, Sun Fellow và James Gosling có ý tưởng phát minh ra một ngôn ngữ l ập trình nh ỏ g ọn có th ể th ực thi đ ược trên các thiết bị dạng như bộ chuyển kênh của truyền hình cáp vì các thi ết b ị ki ểu này có b ộ nhớ nhỏ. Bên cạnh đó, do các hãng khác nhau sử dụng các chíp xử lý (CPUs) khác nhau nên một đặc tính quan trọng mà ngôn ngữ này phải có là đ ộc l ập v ới các dòng CPUs khác nhau – gọi là đặc tính di động. Nhóm đã mở một dự án có tên là Green để hiện thực hóa ý tưởng này. Để giải quyết vấn đề di động, nhóm đã sử dụng ý tưởng c ủa k ỹ sư Niklaus Wirth – người sáng lập ngôn ngữ Pascal – về vi ệc sử dụng c ơ ch ế thông d ịch và máy ảo (virtual machine). Về nền tảng ngôn ngữ, do hãng SUN phát triển trên n ền UNIX nên h ọ s ử d ụng ngôn ngữ lập trình C++ là chủ yếu. Do đó, ngôn ngữ m ới thiên v ề h ướng đ ối t ượng (Object Oriented) của C++ hơn là hướng thủ tục như Pascal. Ban đầu nhóm đặt tên cho ngôn ngữ mới là “Oak” nhưng sau đó đ ược chuy ển thành Java do Oak cũng đã là tên một ngôn ngữ lập trình khác. Năm 1992, dự án Green cho ra đời sản phẩm đầu tiên có tên là “*7” nhưng đã không được chào đón như mong đợi. Sau đó nhóm đã phải m ất cả năm 1993 và n ửa đ ầu 1994 đ ể đi tiếp thị công nghệ của mình. Từ năm 1994, sự phát triển của Internet đã tạo c ơ h ội đ ể Java phát triển nhanh chóng. Nhóm đã phát triển một trình duyệt có tên là HotJava cho phép các chương trình Java nhúng được trong đó (applet). Đây chính là minh chứng rõ ràng về sức m ạnh của Java đã nhanh chóng được cộng đồng người sử dụng internet bi ết đ ến và là ti ền đ ề đ ể Java phát triển rực rỡ như ngày hôm nay. Phiên bản đầu tiên 1.0 của Java ra đời vào năm 1996, sau đó là phiên b ản 1.1 m ặc dù khá mạnh nhưng cũng còn nhiều hạn chế. Năm 1998 đánh đấu bước chuyển mình mạnh mẽ của Java với sự ra đời c ủa phiên bản 1.2 làm cho Java tiến gần tới mục tiêu “viết một lần, chạy khắp n ơi” (Write once, Run Anywhere). Các nhân viên tiếp thị của Java gọi đây là phiên b ản “Java 2 Standard Edition Software Development Kit Version 1.2” ý nói tới sự có mặt đồng th ời c ủa 2 phiên b ản “Standard Edition” là Micro Edition và Enterprise Edition trong Java. Các phiên bản 1.3, 1.4 là sự phát triển mở rộng tiếp theo của phiên bản 1.2. Phiên bản 1.5 (chuyển sang gọi là phiên bản 5.0) đánh dấu sự tích hợp đầy đủ nhất các công nghệ Java. Bảng sau cho thấy sự phát triển thư viện Java qua các phiên bản: 6
- Phiên Số các Class và Interface bản 1.0 211 1.1 477 1.2 1524 1.3 1840 1.4 2723 5.0 3270 Hiện tại, Java đã phát triển tới phiên bản 1.6. II. Các đặc trưng của Java Java được biết đến với các đặc trưng sau: II.1. Tính đơn giản Java được phát triển dựa trên C++ nhưng lược bớt đi hoặc thay thế các khái ni ệm khó hiểu như header file, con trỏ, structures, union, operator overloading, virtual base class. Trong Java chỉ có thừa kế đơn mà không có tính đa thừa kế như c ủa C++. Tuy nhiên tính đa th ừa k ế được biểu hiện thông qua việc sử dụng các Interface. II.2. Tính hướng đối tượng Như đã trình bày ở trên, Java được phát triển từ C++ nên nó là ngôn ngữ l ập trình hướng đối tượng. II.3. Tính phân tán Java cho phép lập trình truy cập các đối tượng từ xa thông qua các giao th ức HTTP, FTP bằng các phương thức như RMI hay Socket. Java hoàn toàn thích hợp cho các ứng dụng Internet. Các công ngh ệ JSP, Servlet cho phép xây dựng các website tương tác với các tính năng thực thi tối ưu II.4. Tính mạnh mẽ Việc loại bỏ con trỏ làm tăng độ tin cậy của chương trình. Lập trình viên không c ần quan tâm đến thao tác cấp phát và giải phóng bộ nhớ. Với Java, bộ nhớ được giải phóng tự động. II.5. Tính an toàn Ngôn ngữ Java được thiết kế để tránh các sự cố: • Nạp chồng stack lúc runtime. • Ảnh hưởng tới bộ nhớ nằm ngoài phạm vi được cấp phát. • Đọc và ghi file tự do 7
- II.6. Tính trung lập Các chương trình viết bằng Java không bị phụ thuộc vào hệ đi ều hành. Đi ều này có được là do mã nguồn chương trình không được biên dịch thành mã máy ngay mà thành mã Bytecode. Khi đem mã Bytecode này chạy trên hệ máy tính nào thì m ột trình thông d ịch virtual machine (Java Vitual Machine-JVM) sẽ thông dịch chúng sang mã máy tương ứng để thực thi. Mã nguồn -> ByteCodes -> machine code. Từ mã nguồn -> Bytecodes: Trình biên dịch Java. Từ Bytecodes -> machine code: Trình thông dịch Virtual machine. IBM Trình thông Bytecode dịch Sparc Java Trình biên (Java dịch Interpreter) Macintosh Java Virtual Machine – JVM Máy ảo là một phần mềm dựa trên cơ sở máy tính ảo. Nó có tập hợp các lệnh logic đ ể xác định các hoạt động của máy tính. Người ta có thể xem nó như một hệ đi ều hành thu nhỏ. JVM thiết lập các lớp trừu tượng cho phần cứng bên dưới, hệ điều hành, mã đã biên dịch. Trình biên dịch chuyển mã nguồn thành tập các lệnh c ủa máy ảo mà không ph ụ thu ộc vào phần cứng cụ thể. Trình thông dịch trên mỗi máy sẽ chuyển tập lệnh này thành ch ương trình thực thi. Máy ảo tạo ra một môi trường bên trong để thực thi các lệnh bằng cách: • Nạp các file .class • Quản lý bộ nhớ • Dọn “rác”, thu hồi bộ nhớ cấp cho các biến không còn được sử dụng. Việc không nhất quán của phần cứng làm cho máy ảo phải sử dụng ngăn xếp đ ể l ưu trữ các thông tin sau: • Các “Frame” chứa các trạng thái của các phương thức. • Các toán hạng của mã bytecode. • Các tham số truyền cho phương thức. • Các biến cục bộ. II.7. Tính di động Không giống C++ và C, các kiểu dữ liệu nguyên thủy của Java được c ấp phát m ột lượng bộ nhớ cố định. Chẳng hạn kiểu dữ liệu int của Java luôn là 4 byte (32 bit) trong khi kiểu int của C++ có thể hiểu là 2 byte hoặc 4 byte. Thiết kế này giúp cho trình biên d ịch luôn có số bytecode như nhau trên mọi hệ máy và sau đó phát sinh mã máy theo khuôn d ạng c ố định. Trong các phiên bản đầu của Java, vấn đề giao diện đồ họa cho người sử d ụng (GUI) chưa được xử lý triệt để và phụ thuộc vào hệ máy. Ngày nay, thư vi ện GUI c ủa Java đã đ ược 8
- viết lại hoàn toàn và có tính độc lập cao giúp cho ch ương trình Java có giao di ện gi ống nhau trên mọi hệ máy. II.8. Tính thông dịch Trình thông dịch Java sẽ thông dịch mã bytecode sang mã máy n ơi mà nó đ ược cài đ ặt. Quá trình này cũng làm các chương trình Java chạy chậm h ơn. Tuy nhiên đây l ại là gi ải pháp cho tính di động. II.9. Tính thực thi cao Java sử dụng công nghệ Just-In-Time (JIT) giúp quá trình thông d ịch th ực hi ện nhanh hơn. Với công nghệ này, những mã bytecode giống nhau sẽ chỉ c ần thông d ịch m ột l ần. Ngày nay, công nghệ này liên tục được cải tiến và cho kết quả vượt trội so với các trình thông d ịch truyền thống. Ví dụ như JIT có thể quản lý các đoạn mã được sử dụng thường xuyên trong chương trình, tối ưu chúng để nâng cao tốc độc thực hiện. II.10. Tính đa luồng Với chương trình Java, lập trình viên có thể cùng lúc quản lý nhi ều tiến trình khác nhau. Điều này giúp cho việc cài đặt các thuật toán song song bằng Java trên các máy tính nhiều CPU được dễ dàng hơn, đặc biệt trong các ứng dụng thời gian thực. II.11. Tính động Các chương trình Java có thể được nâng cấp mà không ảnh hưởng t ới người s ử d ụng. Các phương thức mới có thể được cài đặt thêm vào các lớp đối tượng hay các giao di ện trong thư viện của chương trình đang chạy. III. Các loại ứng dụng của Java • Ứng dụng console: Không có giao diện GUI. • Ứng dụng đồ hoạ: Có giao diện GUI. • Applet: Nhúng trong các trang Web. • Servlet: Các class thực thi phía web server. • JSP: Các file nhúng mã Java và HTML. • Ứng dụng EJB, RMI, JMS: Xây dựng ứng dụng bởi nhiều thành phần ghép l ại, giao tiếp từ xa. IV. Công cụ và môi trường lập trình Java Hiện nay có rất nhiều môi trường phát triển Java (Integrated Development Environment - IDE). Mỗi môi trường cung cấp cho lập trình viên những ti ện ích l ập trình ở m ức đ ộ khác nhau. Một số IDE thông dụng là: • Netbeans (miễn phí tại http://www.netbeans.org). • Jcreator (thương mại). • Jbuilder (thương mại). • Eclipse (miễn phí http://www.eclipse.org/). 9
- V. Cài đặt Java Java phiên bản Java mới nhất có thể download tại địa ch ỉ http://java.sun.com/j2se. Sau đó cài đặt như ứng dụng bình thường. Thư mục cài đặt mặc định của Java trên Windows là C:\Program Files\Java\jdk1.6.0_02 (nếu phiên bản cài là jdk1.6.0_02). Trong đó có chứa các thư mục với ý nghĩa sau: Chứa các công cụ và trình biên dịch Java bin Chứa các chương trình Java Demo demo Chứa các tài liệu mô tả thư viện của Java docs includes Chứa các file dùng để biên dịch các đoạn mã nguồn viết bằng ngôn ngữ khác (native). Chứa các file lưu thông tin môi trường lúc thực thi jre Chứa các file thư viện lib Chứa mã nguồn java src Trong thư mục \bin có chữa các công cụ chính của Java: Trình biên dịch, 'javac' Cú pháp:javac [options] sourcecodename.java Trình thông dịch, 'java' Cú pháp:java [options] classname Trình dịch ngược, 'javap' javap dịch ngược bytecode và in ra thông tin về các thuộc tính (các tr ường), các ph ương thức của một lớp. Cú pháp:javap [options] classname Công cụ sinh tài liệu, 'javadoc' Tiện ích này cho phép ta tạo ra tệp HTML dựa trên các lời gi ải thích trong mã ch ương trình (phần nằm trong cặp dấu /*.... */). Cú pháp:javadoc [options] sourcecodename.java Chương trình tìm lỗi - Debug, 'jdb‘ Cú pháp:jdb [options] sourcecodename.java hay jdb -host -password [options] sourcecodename.java Cài đặt đường dẫn mặc định. 1. Mở Control Panel 2. Chọn System 10
- 3. Chọn Tab Advanced 4. Chọn Environment Variables 5. Thêm đường dẫn C:\Program Files\Java\jdk1.6.0_02\bin vào biến môi trường Path - Chọn Variable Path 11
- - Chọn Edit 12
- Đề tài 1. Ngôn ngữ mô hình hóa UML I. Xây dựng hệ thống phần mềm theo hướng đối tượng I.1 Các khái niệm căn bản của công nghệ hướng đối tượng Hướng đối tượng là một công nghệ để sản sinh ra các mô hình phản ánh m ột cách t ự nhiên các nghiệp vụ thực tế. Xét cho cùng thì mọi quy trình nghi ệp v ụ trong th ực t ế đ ều là s ự tương tác của các đối tượng theo một trình tự nhằm đạt được một m ục đích c ụ th ể. Nói cách khác, các đối tượng và mối quan hệ giữa chúng phản ánh quy trình nghi ệp v ụ. Ví d ụ nh ư nghiệp vụ tuyển nhân sự cho một công ty có thể được tóm tắt qua một chuỗi các tương tác như sau: 1. Công ty đưa ra thông báo tuyển nhân sự tới các ứng viên có nhu cầu 2. Ứng viên gửi hồ sơ dự tuyển tới công ty 3. Công ty duyệt hồ sơ và gửi giấy hẹn phỏng vấn tới ứng viên 4. Công ty phỏng vấn ứng viên 5. Công ty ký hợp đồng với ứng viên hoặc từ chối Trong ví dụ trên có sự tham gia của hai đối tượng “công ty” và “ ứng viên”. S ự trao đ ổi thông tin giữa hai đối tượng này cho thấy mối quan hệ phụ thuộc giữa chúng (dependence). Một ví dụ khác là trong hệ thống quản lý nhân sự chúng ta có các đ ối t ượng nh ư: nhân viên, quản lý,…cho thấy mối quan hệ dạng khác: các nhân viên làm công việc qu ản lý t ất nhiên cũng là nhân viên của công ty nhưng có thêm các thu ộc tính riêng bi ệt – m ột quan h ệ k ế thừa (inheritance). Trong một hệ thống bán hàng, mỗi đơn hàng bao gồm trong nó các thông tin v ề khách hàng, ngày giờ, …và một danh mục các mặt hàng. Khi này ta nói r ằng gi ữa đ ơn hàng và m ặt hàng tồn tại một quan hệ bao gồm (aggregation) Mục tiêu của công nghệ hướng đối tượng chính là th ể hi ện đ ược các đ ối t ượng và mối quan hệ giữa chúng vào trong các hệ thống phần mềm. Vì vậy, các hệ thống phần m ềm theo công nghệ hướng đối tượng phản ánh một cách tự nhiên và trung th ực nghi ệp v ụ th ực t ế và có khả năng đáp ứng các thay đổi dễ dàng. Phát triển một hệ thống phần mềm theo hướng đối tượng dựa trên 5 khái ni ệm c ơ bản: Lớp (class), đối tượng (object), thông đi ệp (mesage), th ừa k ế (inheritance) và đa hình (polymorphism). Lớp là sự trừu tượng hóa các đối tượng thực tế theo ph ạm vi nghi ệp v ụ. L ấy ví d ụ v ề hệ thống quản lý sinh viên của trường ĐHBK Hà Nội cần qu ản lý rất nhi ều đ ối t ượng sinh viên khác nhau nhưng có thể chỉ được trừu tượng hóa thành một lớp đối tượng có tên SinhVien chẳng hạn. Sự trừu tượng hóa một lớp đối tượng cho ta kết quả m ột tập các thu ộc tính (attributes) và các hành vi (operations) đặc trưng cho bất kỳ đ ối t ượng nào thu ộc l ớp đó. Đối tượng thực tế thì có vô số thuộc tính và hành vi nhưng ch ỉ thu ộc tính và hành vi trong phạm vi nghiệp vụ là được xét đến. Sự chi tiết phụ thuộc vào phạm vi nghiệp vụ. Sự trừu tượng hóa diễn ra ở nhiều cấp độ. Lấy ví dụ: lớp động vật có vú bao gồm l ớp động vật 4 chân, lớp 4 chân lại bao gồm các lớp như lớp mèo, lớp trâu,… Mỗi đối tượng là một biểu hiện thực tế của một lớp. object = name + attributes + operations Hệ thống hướng đối tượng nếu được mô hình đúng sẽ rất linh ho ạt, d ễ hiệu ch ỉnh, được cài đặt dễ dàng bằng các ngôn ngữ hướng đối tượng. Các h ệ th ống ph ần m ềm h ướng đối tượng cũng được cài đặt bởi các ngôn ngữ lập trình hướng đối tượng. 13
- Hướng đối tượng không chỉ là một lý thuyết mà đã đ ược ch ứng minh b ằng nh ững ứng dụng rất thành công trong thực tế ở nhiều lĩnh vực khác nhau. Tuy nhiên, lĩnh vực này vẫn cần được chuẩn hóa hơn nữa. I.2 Quy trình chung phát triển hệ thống phần mềm Xây dựng một hệ thống phần mềm hướng đối tượng cũng tuân theo quy trình chung như mọi công nghệ khác: 1. Requirements : Thu thập yêu cầu 2. Analysis : Phân tích 3. Design: Thiết kế 4. Implementation: Cài đặt 5. Test: Kiểm thử 6. Deployment: Triển khai Theo nguyên tắc chung này, mỗi công ty lại ứng dụng những công ngh ệ khác nhau đ ể phát triển ứng dụng như các mô hình water fall, mô hình hướng chức năng,… I.3 Những thách thức của ngành công nghiệp phần mềm hiện nay Mặc dù đã ứng dụng các công nghệ tiến tiến và quy trình phát tri ển chuẩn hóa nh ưng ngành công nghiệp phần mềm vẫn phải đối mặt với những thách thức: 1. Sự gia tăng về quy mô từ nhỏ đến lớn của ứng dụng 2. Sức ép về thời gian hoàn thành 3. Sự phân tán về không gian làm việc 4. Đa dạng về nội dung 5. Sự thay đổi các yêu cầu của người sử dụng Những thách thức này có thể nói là gắn liền với m ọi công ty ph ần m ềm đ ặc bi ệt là ở Việt Nam, nơi mà vai trò của quá trình khảo sát, phân tích còn b ị xem nhẹ cũng nh ư các công ty còn đang bỡ ngỡ với sự mở rộng về quy mô và thi ếu nhân l ực chuyên môn v ề phân tích thiết kế. II. Lịch sử phát triển ngôn ngữ mô hình hóa UML II.1. Tóm tắt lịch sử UML Những năm 1980 là thời kỳ bùng nổ số lượng các công ty ph ần m ềm s ử d ụng ngôn ngữ lập trình hướng đối tượng(Object Oriented Programming - OOP) đ ể xây d ựng các ứng dụng. Điều này dẫn tới một đòi hỏi phải có một quy trình làm phần mềm tiếp cận theo hướng phân tích và thiết kế hướng đối tượng (Object Oriented Analyze and Design - OOAD). Nhi ều nhà nghiên cứu phương pháp trong đó có Booch, Rumbaugh và Jacobson đã làm vi ệc đ ộc l ập và đã đề xuất các quy trình thỏa mãn yêu cầu này. Mỗi m ột quy trình có m ột t ập ký hi ệu mô hình riêng để truyền đạt và diễn tả các kết quả phân tích và thiết kế. Vào đầu những năm 1990, các công ty khác nhau, thậm chí là các bộ phận khác nhau của cùng một công ty đã sử dụng các quy trình khác nhau. Thêm vào đó, các công ty này l ại muốn sử dụng các công cụ phần mềm hỗ trợ các quy trình c ủa h ọ. Với quá nhi ều quy trình khác nhau, các công ty phần mềm đã rất khó khăn trong việc cung cấp các công c ụ này. Đi ều này cho thấy việc cần thiết phải có một quy trình với tập ký hiệu thống nhất. Năm 1994, James Rumbaugh đã hợp tác cùng Grady Booch tại công ty phần m ềm Rational Software Corporation để cùng xây dựng một quy trình th ống nhất d ựa trên k ết qu ả 14
- của từng người. Sau đó Ivar Jacobson cũng sớm gia nhập nhóm này. Năm 1996, nhóm đã cho xuất bản phiên bản đầu tiên của UML tới cộng đồng phát tri ển ph ần m ềm và yêu c ầu ph ản hồi. Cũng cùng thời gian đó, một tổ chức có tên Object Management Group (OMG) đã m ời nhóm đệ trình một ngôn ngữ mô hình. OMG là một tổ chức phi lợi nhuận chuyên xúc tiến việc sử dụng công nghệ hướng đối tượng trong ngành công nghi ệp phần m ềm thông qua vi ệc đ ưa ra các hướng dẫn và đặc tả OOP. Các thành viên của OMG ban đầu là 3Com Corporation; American Airlines; Canon, Inc.; Data General; Hewlett-Packard; Philips Telecommunications N.V.; Sun Microsystems; và Unisys Corporation. Các tập đoàn lớn nh ư HP, IBM, Microsoft, Oracle và Rational Software đã nhận thấy lợi ích c ủa UML và đã nhận l ời tài tr ợ cho các d ự án về UML của OMG. Năm 1997, OMG tiếp tục xem xét lại UML và đ ến năm 2001 thì phiên bản UML 1.4 ra đời. Hiện nay OMG đã phát hành tới phiên bản UML 2.0 và đang nghiên c ứu phiên bản 2.1. II.2. Khái niệm về UML UML – Unified Modeling Language là một ngôn ngữ dùng các s ơ đ ồ và mô hình th ống nhất để mô hình các hệ thống phần mềm. Mục đích của UML là: • Trở thành ngôn ngữ mô hình mà tất cả mọi người làm mô hình có thể sử dụng • Tập trung hướng tới giải quyết các vấn đề tồn tại trong phát tri ển ph ần m ềm hiện nay. • Đơn giản nhất có thể trong khi vẫn mô hình được phần lớn các ứng dụng. • Nâng cao tính tái sử dụng các thành phần của một hệ thống phần mềm • UML là một ngôn ngữ diễn tả, UML không phải là một quy trình. Thuật ngữ “Unified” ở đây có một ý nghĩa quan trọng, nó nói lên các nguyên tắc của UML: • Thống nhất phương thức, ký hiệu, thuật ngữ • Gắn kết giữa các chu trình phát triển • Không phụ thuộc vào lĩnh vực ứng dụng • Không phụ thuộc vào ngôn ngữ lập trình và môi trường thực hiện • Không phụ thuộc vào quy trình phát triển • Gắn kết chặt chẽ các khái niệm nội tại của hệ thống. II.3 Đặc trưng của UML Hiện nay, UML là một ngôn ngữ đã được OMG chuẩn hóa và đ ược đặc t ả rõ ràng. T ất cả các mô hình, sơ đồ của UML đều theo hướng đối tượng. Các đặc tính của UML bao gồm: • Mô hình class (class diagrams) mô tả cấu trúc tĩnh c ủa h ệ th ống và m ối quan h ệ giữa các đối tượng • Mô hình tương tác (interaction diagrams), mô hình trạng thái (state diagrams), mô hình hoạt động (activity diagrams) mô tả các hành vi đ ộng c ủa các đ ối t ượng trong hệ thống cũng như các thông điệp giữa chúng. • Mô hình Use-case và mô hình hoạt động mô tả các yêu c ầu và các lu ồng công việc trong hệ thống. • Các mô hình cấu trúc hỗn hợp (composite structure diagrams) mô t ả s ự h ợp tác cũng như các đặc điểm về cài đặt. 15
- • Mô hình triển khai (deployment diagrams) mô tả việc triển khai phần m ềm trên một môi trường xác định. III. Ngôn ngữ UML III.1. Các thành phần của UML Xét trên khía cạnh ngôn ngữ diễn tả, UML có đầy đ ủ các mô hình và s ơ đ ồ đ ể th ể hiện hầu hêt các khía cạnh của hệ thống phần mềm. Các thành phần c ủa ngôn ngữ UML bao gồm: • Các Views (các hướng nhìn): Các view thể hiện các cách nhìn khác nhau t ới h ệ thống. Một hệ thống không thể chỉ được mô tả bởi một sơ đồ. Nhiều hướng nhìn khác nhau cho ta nhiều sơ đồ mô tả đầy đủ về hệ thống. Các hướng nhìn cũng liên kết ngôn ngữ mô hình với các quy trình đ ược ch ọn cho vi ệc phát tri ển hệ thống. • Các Diagrams (các sơ đồ): Các sơ đồ bao gồm các phần tử hình v ẽ dùng để mô tả nôi dung của các View. UML 2.0 bao gồm 13 loại sơ đồ khác nhau. • Các Model Elements (các phần tử mô hình): Các khái ni ệm được sử dụng trong các sơ đồ và các phần tử của sơ đồ diễn tả các khái ni ệm phổ bi ến c ủa công nghệ hướng đối tượng như class, object, message (thông đi ệp) và m ối quan h ệ giữa chúng bao gồm quan hệ dependence, inheritance và aggregation. M ột phần tử mô hình có thể được sử dụng trong nhiều sơ đồ nhưng chúng luôn có cùng ý nghĩa và ký hiệu giống nhau. 16
- • Các General Mechanisms (các đặc tả chung m ở rộng): Mô t ả các thông tin chú thích, ngữ nghĩa của các phần tử mô hình, thuật ngữ. III.2. Các hướng nhìn (view) Use-case view: Đây là hướng nhìn về mặt chức năng của hệ thống được thực hi ện bởi các tác nhân bên ngoài. ud Primary Use Cases HÖthèng b¸n qua m Interrnet hµng ¹ng Chän hµng Xem chi tiÕt s¶n phÈm CËp nhËt giá Kh¸ch hµng µng h Göi th«ng in ph¶n håi t § ¨ng ký LËp ® n m ua ¬ hµng kh¸ch hµng Qu¶n lý danh m ôc hµng hãa Qu¶n trÞhÖ thèng Tr¶ lêi kh¸chhµng CËp nhËt th«ng tin m t hµng Æ Nh© viªn dâi Theo n kinh ® n hµng ¬ doanh Các nguyên tắc cho việc xây dựng use-case view là: • Các use-case đượ hình trên ơ sở nhìn từ ngoài vào tronghệth ống c thành c bên (out-> in). • Các use-case ph i đầ đủ, chúng ược tổng h p theo ph ươngpháp đi từt ốiđa ả y đ ợ đến tối thiểu (ban đầu mở rộng tối đa các use-case có th ể sau đó thu h ẹp l ại theo nhucầu kháchhàng). • Các use-case cần có tính độc lập tương đối để dễ tổ chức nhóm làm vi ệc và có tính táisử ụngcao. d Bên cạnh sơ đồ, người làm mô hình có thể sử dụng mô tả b ằng văn bản chi ti ết cho mỗi use-case (text detail). Mỗimôtả cầnđ m ảo các thông sau: ả b tin 17
- 1. Tên use-case 2. Mục tiêu của use-case 3. Phạm vi của use-case 4. Các tác nhân chính 5. Tiền điều kiện 6. Dòng chính 7. Dòng phụ 8. Ngoại lệ 9. Hậu điều kiện Sau đây là một ví dụ về use-case text detail: Use-case: Đòi tiền bồi thường Phạm vi: Công ty Bảo hiểm PCM Actor chính: Người đòi bồi thường Dòng chính 1. Người đòi bồi thường gửi đơn yêu cầu với các dữ liệu bằng chứng về tai nạn 2. Công ty bảo hiểm xác nhận người viết đơn có quyền lợi bảo hiểm hợp lệ 3. Công ty bảo hiểm phân công cho một đại lý xác minh trường hợp này 4. Đại lý đối chiếu tất cả các chi tiết trong đơn theo chính sách b ảo hi ểm c ủa công ty 5. Công ty bảo hiểm trả tiền bảo hiểm Dòng phụ 1a. Bằng chứng tai nạn không đầy đủ 1a1. Công ty bảo hiểm yêu cầu dữ liệu thiếu 1a2. Người đòi bồi thường gửi lại các dữ liệu thiếu 2a. Người đòi bồi thường không có chính sách bảo hiểm hợp lệ 2a1. Công ty bảo hiểm từ chối yêu cầu, nhắc nhở, ghi lại và kết thúc xử lý vụ việc 3a. Không có đại lý nào rảnh rỗi 3a1. (Công ty bảo hiểm sẽ làm gì trong trường hợp này???) 4a. Vụ tai nạn vi phạm chính sách bảo hiểm cơ bản 4a1. Công ty bảo hiểm từ chối yêu cầu, nhắc nhở, ghi lại và kết thúc xử lý vụ việc 4b. Vụ tai nạn chỉ vi phạm chính sách bảo hiểm nhỏ 4b1. Công ty bảo hiểm điều đình với người đòi bảo hiểm và đồng ý trả bảo hiểm Trong trường hợp các use-case quá phức tạp và chưa đ ược mô t ả rõ ràng, chúng có th ể được tác ra thành các use-case nhỏ hơn theo hai dạng: • Include: use-case mới được tách ra và được bao gồm trong use-case chính một cách vô điều kiện 18
- uc Use Case Model Use Case Include «include» Use Case Principal • Extend: use-case mới xảy ra khi một điều kiện xảy ra trong use-case chính. uc Use Case Model Use Case Principal «extend» Use Case Extend Nói chung, use-case view giúp ta trả lời câu hỏi WHAT? về hệ thống. Logical views Đây là hướng nhìn cho biết các chức năng được thi ết kế vào trong hệ th ống nh ư th ế nào (HOW?) thông qua việc mô tả các cấu trúc tĩnh và các hành vi động của hệ th ống. Sau đây là một số sơ đồ quan trọng thường được sử dụng. Các cấu trúc tĩnh (static structure): Cấu trúc tĩnh được mô hình bằng UML chính là các class diagrams. Đây là sự mô hình các khái niệm trong ứng dụng, các đ ặc đi ểm n ội tại cũng như mối quan hệ giữa chúng. 19
- Classes Các khái niệm Mô hình hóa Attributes Operations Object Ví dụ về mô hình class: cd Jav a M odel StockItem LineItem Order A uthor: string - - quantity: int - date: Date - catalogNumber: string deliveryInstructions: String - property get -i costPrice: number tem - - orderNumber: String - listPrice: number + getItem() : StockItem «enumeration» t string - itle: + g int etQuantity() : checkForOutstandingOrders() :void + OrderStatus property set property get property get + s : void etItem(StockItem) enum getDate() : Date + getAuthor() : + string + setQuantity(int) : void -status - closed: int + getDeliveryInstructions() : String + getCatalogNumber() : string - delivered: int - dispatched: int getLineItem() :LineItem + getCostPrice(): number + + getOrderNumber() : String + getListPrice() : number - new: int + getStatus() : OrderStatus + getTitle() : string - packed: int set property property set + setDate(Date) : void + setAuthor(string) : void setDeliveryInstructions(String) :void + setCatalogNumber(string) :void + + setLineItem(LineItem) : void + setCostPrice(number) : void setOrderNumber(String) void + : setListPrice(number): + void + setStatus(OrderStatus) : void + setTitle(string) : void -account Account ShoppingBasket Transaction - billingAddress: String - shoppingBasketNumber: String - date: Date - c losed: boolean - d String eliveryAddress: a : - orderNumber: String + ddLineItem() void + createNewBasket() : void - emailAddress: String -basket + loadAccountHistory() : void + d : eleteItem() void - n + loadOpenOrders() :void ame: String + processOrder() : void property get + c reateNewAccount() : void property get + loadAccountDetails() void : + getAccount() Account : + getLineItem() : LineItem + getDate() : Date + markAccountClosed() : void property set s : + getLineItem(): LineItem + retrieveAccountDetails() :void + etLineItem(LineItem) void + getOrderNumber() : String + s ubmitNewAccountDetails() : void property set + v String) alidateUser(String, + setAccount(Account) : void property get -hi story -account + setDate(Date) : void + getBasket() : ShoppingBasket + s : etLineItem(LineItem) void + getBillingAddress() : String + setOrderNumber(String) : void + getClosed() : boolean + getDeliveryAddress(): String + getEmailAddress() : String + getName() String : + getOrder() : Order property set + s etBasket(ShoppingBasket) : void + s etBillingAddress(String) : void + s : etClosed(boolean) void + s etDeliveryAddress(String) : void + s void etEmailAddress(String) : + s etName(String) : void + s :void etOrder(Order) Các hành vi động: State machine: 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Ngôn ngữ lập trình Java căn bản
115 p | 351 | 104
-
Bài giảng Ngôn ngữ lập trình Java (115tr)
115 p | 114 | 28
-
Bài giảng Ngôn ngữ lập trình Java - Th.S Dương Thành Phết
11 p | 152 | 18
-
Bài giảng Ngôn ngữ lập trình Java: Phần 2 - TS. Vũ Hữu Tiến
65 p | 42 | 13
-
Bài giảng Ngôn ngữ lập trình Java: Phần 1 - TS. Vũ Hữu Tiến
66 p | 44 | 13
-
Bài giảng Ngôn ngữ lập trình Java: Chương 2 - TS. Phan Nguyên Hải
67 p | 11 | 6
-
Bài giảng Ngôn ngữ lập trình Java: Chương 6.1 - TS. Phan Nguyên Hải
74 p | 8 | 5
-
Bài giảng Ngôn ngữ lập trình Java: Chương 5 - TS. Phan Nguyên Hải
33 p | 13 | 5
-
Bài giảng Ngôn ngữ lập trình Java: Chương 4 - TS. Phan Nguyên Hải
56 p | 6 | 5
-
Bài giảng Ngôn ngữ lập trình Java: Chương 1.2 - TS. Phan Nguyên Hải
87 p | 8 | 5
-
Bài giảng Ngôn ngữ lập trình Java: Chương 1.1 - TS. Phan Nguyên Hải
36 p | 9 | 5
-
Bài giảng Ngôn ngữ lập trình Java: Chương 6.2 - TS. Phan Nguyên Hải
34 p | 13 | 4
-
Bài giảng Ngôn ngữ lập trình Java: Chương 3 - ĐH Giao thông Vận tải
24 p | 84 | 4
-
Bài giảng Ngôn ngữ lập trình Java: Chương 1 - ĐH Giao thông Vận tải
26 p | 59 | 3
-
Bài giảng Ngôn ngữ lập trình Java: Chương 2 - ĐH Giao thông Vận tải
25 p | 51 | 3
-
Bài giảng Ngôn ngữ lập trình Java: Chương 6 - ĐH Giao thông Vận tải
15 p | 72 | 3
-
Bài giảng Ngôn ngữ lập trình Java: Chương 5 - ĐH Giao thông Vận tải
9 p | 85 | 3
-
Bài giảng Ngôn ngữ lập trình Java: Chương 4 - ĐH Giao thông Vận tải
23 p | 57 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn