cả đối với một số thư viện dùng hệ thống máy tính để phục vụ tra cứu và quản lý cũng còn nhiều nhược điểm như: giao diện người sử dụng phức tạp, phần mềm chỉ sử dụng trên máy đơn hoặc mạ
Trang 1MỤC LỤC
MỤC LỤC 1
CHƯƠNG 1 3
GIỚI THIỆU NỘI DUNG ĐỀ TÀI 3
1.1 Hệ thống quản lý thư viện 3
1.1.1 Nhiệm vụ của một hệ thống quản lý thư viện 3
1.1.3 Hướng phát triển của hệ thống thư viện hiện đại 5
1.2 Hướng thực thi của đề tài 5
CHƯƠNG 2 7
PHÂN TÍCH VÀ LỰA CHỌN MÔ HÌNH SỬ DỤNG 7
2.1 Các cấu hình cơ sở dữ liệu Client/Server 7
2.1.1 Mô hình cơ sở dữ liệu tập trung (Centralized database model) 7
2.1.2 Mô hình cơ sở dữ liệu theo kiểu file– server (File– server database model) 8
2.1.3 Mô hình xử lý từng phần cơ sở dữ liệu (Database extract processing model) 8 2.1.4 Mô hình cơ sở dữ liệu Client/Server (Client/Server database model) 9
2.1.5 Mô hình cơ sở dữ liệu phân tán (Distributed database model) 10
2.2 Mô hình được sử dụng 10
2.2.1 Server 11
2.2.2 Database 11
CHƯƠNG 3 12
CƠ CHẾ TRUYỀN NHẬN TRONG JAVA 12
3.1 Các kiến thức cơ bản về Networking 12
3.2 Networking 16
3.2.1 Giao tiếp giữa phần hiện thực client và Browser ở máy local 16
3.2.2 Sockets 17
3.2.3 Threads, Synchronization và Exceptions 23
CHƯƠNG 4 28
CƠ SỞ DỮ LIỆU 28
4.1 JDBC 28
4.1.1 JDBC là gì ? 28
4.1.2 Cấu trúc JDBC 28
4.1.3 ODBC và JDBC 29
4.1.4 Sử dụng JDBC driver 30
4.2 Sử dụng JDBC để truy suất cở sở dữ liệu 30
4.3 Kết nối tới cơ sở dữ liệu 31
4.4 Truy Suất Cơ sở dữ liệu 31
4.5 Đối Tượng ResultSet 32
4.6 Đối Tượng ResultSetMetaData 34
4.7 Đối Tượng DatabaseMetaData 35
4.8 Lấy Thông Tin Trên Table 36
CHƯƠNG 5 38
PHÂN TÍCH VÀ THIẾT KẾ 38
5.1 Giới thiệu công cụ hỗ trợ thiết kế UML 38
5.2 Xác định các Use Case 38
5.2.1 Độc giả 38
5.2.4 Root 52
Trang 25.4 Biểu đồ tuần tự “Đăng nhập hệ thống” 53
5.5 Biểu đồ tuần tự “Xét độc giả đăng ký” 54
5.6 Biểu đồ tuần tự “Cập nhật sách” 54
5.7 Biểu đồ tuần tự “Cập nhật User” 55
5.8 Xây dựng biểu đồ lớp 55
5.9 Biểu đồ cài đặt 56
5.9.1 Biểu đồ thành phần “Gói Giao Diện” 56
5.9.2 Biểu đồ thành phần “Gói Thực Thể” 56
5.10 Biểu đồ triển khai 57
5.11 Biều đồ hoạt động của “Độc giả” 57
5.12 Biểu đồ hoạt động của “Thủ thư” 58
CHƯƠNG 6 59
CHƯƠNG TRÌNH QUẢN LÝ THƯ VIỆN 59
6.1 Nguyên tắc hoạt động: 59
6.1.1 Các loại User và quyền, cách đăng ký 59
6.1.2 Cơ chế login 60
6.1.3 Cơ chế mượn sách 60
6.1.4 Cơ chế xử lý vi phạm 60
6.2 Mô tả cơ sở dữ liệu 61
6.3 Mô tả chương trình 64
6.3.1 Tổng quan 64
6.3.2 Mô tả chi tiết về cơ chế và quá trình cập nhật dữ liệu 66
6.3.3 Mô tả chi tiết các dữ liệu đặc biệt 80
6.3.4 Cơ chế timeout 81
6.3.5 Server 82
6.3.6 Client 83
6.3.7 Giao tiếp giữa client và server 84
CHƯƠNG 7 86
HƯỚNG PHÁT TRIỀN CHƯƠNG TRÌNH 86
7.1 Kiến trúc mới RMI 86
7.1.1 Đặc điểm RMI 86
7.1.2 Phát triển mã cho RMI 86
7.2 Kết quả chương trình 87
7.2.1 Những điểm chương trình làm được 87
7.2.2 Những điểm chưa làm được và hướng giải quyết 88
7.3 Hướng phát triển chương trình 88
TÀI LIỆU THAM KHẢO 90
NHẬN XÉT CỦA GIÁO VIÊN 91
Trang 3CHƯƠNG 1 GIỚI THIỆU NỘI DUNG ĐỀ TÀI
1.1 Hệ thống quản lý thư viện
1.1.1 Nhiệm vụ của một hệ thống quản lý thư viện
Một hệ thống quản lý thư viện có nhiệm vụ quản lý kho tư liệu mà thư viện hiện có, phục vụ công tác tra cứu, nghiên cứu của độc giả Hệ thống quản lý thư viện phải nắm giữ được số lượng sách trong thư viện, phân loại sách theo từng chương mục cụ thể để có thể dễ dàng mã hoá, tiện cho việc truy tìm Ngoài
ra hệ thống cũng phải biết được tình trạng tài liệu hiện tại, phải được cập nhật thông tin mỗi khi bổ sung các tư liệu mới hoặc thanh lý các tư liệu không có giá trị Đối với việc phục vụ tra cứu, hệ thống phải đưa ra mục lục phân loại các sách
có trong thư viện, sao cho độc giả dễ dàng tìm được những tư liệu cần thiết, bên cạnh đó hệ thống cũng phải quản lý được những độc giả có yêu cầu mượn tư liệu Thông thường việc phân loại sách và quản lý độc giả là những công việc phức tạp nhất trong hệ thống quản lý thư viện
1.1.2 Tổ chức của đa số hệ thống thư viện hiện nay
Các hệ thống thư viện của chúng ta hiện nay thường được tổ chức và hoạt động theo cách như sau:
a Bổ sung, bảo quản và thanh lý sách
Sách nhập về được đăng ký tại phòng phân loại – biên mục Tại đây cuốn sách sẽ được xem xét nội dung, thể loại qua đó phân loại cuốn sách theo chuyên mục sẵn có trong thư viện Đồng thời cuốn sách cũng được gắn với một mã số để tiện cho việc tìm kiếm, qua mã số này nhân viên thư viện có thể biết được cuốn sách nằm ở vị trí nào trong kho lưu trữ Đôi khi một cuốn sách có hai loại mã số, một để phục vụ cho việc sắp xếp và tìm kiếm trong kho, một để quản lý về thời gian sách nhập vào thư viện, tiện cho việc bảo quản, thanh lý Sau khi cuốn sách
có mã số, nó sẽ được cung cấp một thẻ mục lục, trên đó thường có tên sách, nội
Trang 4công, thẻ mục lục là một tấm cạc được đặt trong hệ thống mục lục của thư viện Với các hệ thống có trang bị máy tính, đó là những record trong cơ sở dữ liệu của thư viện Theo thời gian, những cuốn sách bị hư hỏng hoặc nội dung không còn phù hợp nữa sẽ được đem ra thanh lý, loại bỏ khỏi hệ thống
b Phục vụ bạn đọc
Khi có nhu cầu tìm hiểu tư liệu, độc giả sẽ đăng ký làm thẻ với thư viện và
sẽ được cấp phiếu đăng ký Sau khi điền một số thông tin cá nhân và được chứng nhận của cơ quan có thẩm quyền, phiếu đăng ký sẽ được thư viện xác nhận và lưu giữ, đồng thời độc giả cũng được cấp thẻ thư viện Trên thẻ thư viện có mã số bạn đọc, qua đó thư viện có thể tìm lại thông tin về độc giả nhanh chóng khi cần thiết, và thư viện sẽ quản lý bạn đọc qua mã số này
Khi có nhu cầu nghiên cứu, bạn đọc sẽ dò tìm mã số của tư liệu mình muốn qua hệ thống mục lục theo chủ đề, nội dung, tác giả bằng tay hoặc bằng máy tính (nếu có) Tiếp theo bạn đọc phải đăng ký mượn sách với thư viện qua phiếu mượn sách Trên đó phải ghi rõ tên và mã số bạn đọc, tên và mã số sách mượn, ngày mượn và ngày trả Sau khi xác nhận tính đúng đắn của phiếu, nhân viên thư viện sẽ căn cứ vào mã số cuốn sách để tìm ra cuốn sách trong kho tư liệu
và đem cho độc giả Định kỳ, nhân viên thư viện phải kiểm tra lại các phiếu mượn sách để thống kê số sách mượn, sách còn trong thư viện, qua đó thông báo cho độc giả biết cuốn sách nào đã hết, lúc nào sẽ có khi độc giả yêu cầu Nhân viên cũng phải kiểm tra những độc giả nào vi phạm quy chế, chẳng hạn đã mượn quá số lượng sách cho phép, sách mượn quá hạn trả, làm mất sách để có biện pháp xử lý thích ứng
c Nhược điểm của hệ thống quản lý thư viện trên :
Hệ thống trên dùng nhiều đến giấy tờ, vì vậy việc bảo quản, truy tìm mất nhiều thời gian Hệ thống dễ mắc phải sai sót cũng như chưa tiện lợi với bạn đọc Công việc quản lý độc giả rất khó khăn khi số lượng bạn đọc lớn, bởi việc kiểm tra thời gian mượn trả sách, số lượng sách mượn là thủ công, vì vậy rất dễ thất thoát tư liệu Việc phân loại sách và tạo ra mục lục cần khá nhiều thời gian Ngay
Trang 5cả đối với một số thư viện dùng hệ thống máy tính để phục vụ tra cứu và quản lý cũng còn nhiều nhược điểm như: giao diện người sử dụng phức tạp, phần mềm chỉ sử dụng trên máy đơn hoặc mạng cục bộ, tổ chức cơ sở dữ liệu thường bị hạn chế về dung lượng cũng như về tốc độ vì đa số không phải là những cơ sở dữ liệu chuẩn của các hãng phần mềm Mặc dù có máy tính thì việc đăng ký mượn sách cũng phải tiến hành bằng tay do đó chưa tận dụng hết được các ưu điểm của máy tính
1.1.3 Hướng phát triển của hệ thống thư viện hiện đại
Ngày nay cùng với sự phát triển của máy tính, sự ra đời của mạng Internet, các hệ thống thư viện sẽ có nhiều đổi mới Đa số các công việc sẽ được tiến hành trên máy tính, từ việc phân loại, tra cứu cho đến mượn sách sẽ được tiến hành trên máy tính với các ưu điểm là nhanh hơn, chính xác hơn và thuận lợi hơn Người ta có thể không cần phải đến thư viện để tra cứu sách mà có thể phải làm tại nhà, với điều kiện là máy tính phải được kết nối vào mạng có hệ thống máy tính của thư viện Việc quản lý bạn đọc tiến hành bằng máy tính sẽ đơn giản và chính xác hơn nhiều Thậm chí, có thể thực hiện một thư viện "từ xa", nghĩa là bạn đọc có thể đọc cuốn sách mà mình thích ngay tại nhà, thông qua mạng vi tính Mặt khác, với sự hỗ trợ của công nghệ mutlimedia trên máy tính, độc giả có thể sẽ không còn cảm thấy khô khan khi đọc những trang sách trên máy tính nữa,
mà có thể có các đoạn nhạc, phim, ảnh và từ điển thuật ngữ liên kết, tương tự như các trang Web sống động…
1.2 Hướng thực thi của đề tài
Hiện nay có rất nhiều các phần mềm phục vụ cho việc quản lý thư viện được viết bằng nhiều ngôn ngữ khác nhau Từ những phần mềm đầu tiên chỉ có thể sử dụng trên máy đơn, nghĩa là cả cơ sở dữ liệu là chương trình truy xuất phải được cài đặt trên cùng một máy đến các phần mềm sử dụng trên mạng, nghĩa là các máy truy xuất tới cùng một cơ sở dữ liệu được cài đặt sẵn trên một máy thì những phần mềm này đều mắc phải những nhược điểm là phải có phần mềm đi
Trang 6kèm mới sử dụng được Và thường thì những phần mềm này do thư viện quản lý,
vì thế độc giả muốn sử dụng thì phải đến thư viện
Nếu như chúng ta có thể truy xuất cơ sở dữ liệu của thư viện thông qua mạng máy tính mà không cần phải cài đặt bất cứ phần mềm chuyên biệt nào thì thật thuận tiện Ngày nay nhờ sự tiến bộ của các ngôn ngữ lập trình và các tiện ích trên mạng, chúng ta có thể làm được điều này Và đề tài sẽ đưa ra một hướng thực thi việc truy xuất cơ sở dữ liệu từ xa thông qua một công cụ hổ trợ sẵn của mạng Internet là các trình duyệt Web Việc hiện thực sẽ được áp dụng đối với hệ thống thư viện như là một thí dụ điển hình
Trang 7CHƯƠNG 2 PHÂN TÍCH VÀ LỰA CHỌN MÔ HÌNH SỬ DỤNG
2.1 Các cấu hình cơ sở dữ liệu Client/Server
Nhìn chung mọi ứng dụng cơ sở dữ liệu đều bao gồm các phần
Thành phần xử lý ứng dụng (Application processing components)
Thành phần phần mềm cơ sở dữ liệu (Database software components)
Bản thân cơ sở dữ liệu (The database itself)
Các mô hình về xử lý cơ sở dữ liệu khác nhau là bởi các trường hợp của ba loại thành phần nói trên định vị ở đâu Thông thường có năm mô hình kiến trúc dựa trên cấu hình phân tán về truy nhập dữ liệu của hệ thống máy tính Client/Server:
Mô hình cơ sở dữ liệu tập trung (Centralized database model)
Mô hình cơ sở dữ liệu theo kiểu file-server (File – server database model)
Mô hình xử lý từng phần cơ sở dữ liệu (Database extract processing model)
Mô hình cơ sở dữ liệu Client/Server (Clent/Server database model)
Mô hình cơ sở dữ liệu phân tán (Distributed database model)
2.1.1 Mô hình cơ sở dữ liệu tập trung (Centralized database model)
Trong mô hình này các thành phần xử lý ứng dụng, phần mềm cơ sở dữ liệu
và bản thân cơ sở dữ liệu đều ở trên cùng một bộ xử lý
Hầu hết công việc xử lý luồng thông tin chính được thực hiện bởi nhiều tổ chức mà vẫn phù hợp với mô hình tập trung
Trang 82.1.2 Mô hình cơ sở dữ liệu theo kiểu file– server (File– server database model)
Trong mô hình cơ sở dữ liệu theo kiểu file – server các thành phần ứng dụng và phần mềm cơ sở dữ liệu ở trên một hệ thống maý tính và các file vật lý tạo nên cơ sở dữ liệu nằm trên hệ thống máy tính khác, thường được dùng trong môi trường cục bộ, trong đó một hay nhiều hệ thống máy tính đóng vai trò của server, lưu dữ các file dữ liệu cho hệ thống máy tính khác thâm nhập tới Trong môi trường file– server, phần mềm mạng được thi hành và làm cho phần mềm ứng dụng cũng như phần mềm cơ sở dữ liệu trên hệ thống của người dùng cuối coi các file hoặc cơ sở dữ liệu trên file server thực sự như là trên máy tính chính
họ
Mô hình file server rất giống với mô hình tập trung Các file cơ sở dữ liệu nằm trên máy khác với các thành phần ứng dụng và phần mềm cơ sở dữ liệu Tuy nhiên các thành phần ứng dụng và các phần mềm cơ sở dữ liệu có thể có cùng một thiết kế để vận hành một môi trường tập trung Thực chất phần mềm mạng
đã làm cho phần mềm ứng dụng và phần mềm cơ sở dữ liệu tưởng rằng chúng đang truy xuất cơ sở dữ liệu trong môi trường cục bộ Một môi trường như vậy
có thể phức tạp hơn mô hình tập trung bởi vì phần mềm mạng có thể phải thực hiện cơ chế đồng thời cho phép nhiều người sử dụng cuối có thể truy nhập vào cùng cơ sở dữ liệu
2.1.3 Mô hình xử lý từng phần cơ sở dữ liệu (Database extract processing model)
Trong một mô hình khác trong do một cơ sở dữ liệu ở xa có thể được truy cập bởi phần mềm cơ sở dữ liệu, được gọi là xử lý dữ liệu từng phần Với mô hình này, người sử dụng có thể tại một máy tính cá nhân kết nối với hệ thống máy tính ở xa nơi có dữ liệu mong muốn Người sử dụng sau đó có thể tác động trực tiếp đến phần mềm chạy trên máy ở xa và tạo yêu cầu để lấy dữ liệu từ cơ sở
dữ liệu đó Người sử dụng cũng có thể chuyển dữ liệu từ máy tính ở xa về chính
Trang 9máy tính của mình và vào đĩa cứng và có thể thực hiện việc sao chép bằng phần mềm cơ sở dữ liệu trên máy cá nhân
Với cách tiếp cận này, người sử dụng phải biết chắc chắn là dữ liệu nằm ở đâu và làm như thế nào để truy nhập và lấy dữ liệu từ một máy tính ở xa Phần mềm ứng dụng đi kèm cần phải có trên cả hai hệ thống máy tính để kiểm soát để kiểm soát sự truy cập và chuyển dữ liệu giữa hai hệ thống Tuy nhiên, phần mềm
cơ sở dữ liệu chạy trên hai máy không cần biết rằng việc xử lý cơ sở dữ liệu từ xa đang diễn ra vì người sử dụng tác động tới chúng một cách độc lập
2.1.4 Mô hình cơ sở dữ liệu Client/Server (Client/Server database model)
Trong mô hình cơ sở dữ liệu Client/Server, cơ sở dữ liệu nằm trên một máy khác với một máy có thành phần xử lý ứng dụng Những phần mềm cơ sở dữ liệu được tách ra giữa hệ thống Client chạy các chương trình ứng dụng và hệ thống Server lưu trữ dữ liệu
Mới nhìn, mô hình cơ sở dữ liệu Client/Server có vẻ giống như mô hình file-server, tuy nhiên mô hình Client/Server có rất nhiều thuận lợi hơn mô hình file-server Với mô hình file- server, thông tin gắn với sự truy cập cơ sở dữ liệu vật lý phải chạy trên toàn mạng Một giao tác yêu cầu nhiều sự truy cập dữ liệu
có thể gây ra tắc nghẽn lưu lượng truyền trên mạng
Fron-end software
Front-end software được chạy trên một máy tính cá nhân hoặc một workstation và đáp ứng yêu cầu đơn lẽ riêng biệt, phần mềm này đóng vai trò của Client trong ứng dụng cơ sở dữ liệu Client/Server và thực hiện các chức năng hướng tới nhu cầu người dùng cuối cùng
Back-end software
Phần mềm này bao gồm phần mềm cơ sở dữ liệu Client/Server và phần mềm mạng chạy trên máy đóng vai trò là Server cơ sở dữ liệu
Trang 102.1.5 Mô hình cơ sở dữ liệu phân tán (Distributed database model)
Cả hai mô hình File – Server và Client/Server đều giả định là dữ liệu nằm trên một bộ xử lý và chương trình ứng dụng truy nạp dữ liệu nằm trên một máy khác, còn mô hình cơ sở dữ liệu phân tán lại giả định bản thân cơ sở dữ liệu có ở trên nhiều máy khác nhau
2.2 Mô hình được sử dụng
Qua các mô hình cơ sở dữ liệu trên, dễ thấy mô hình Client/Server là mô hình phù hợp các yêu cầu đặt ra nhất Vấn đề ở đây là chúng ta sẽ hiện thực mô hình này bằng ngôn ngữ gì và hiện thực như thế nào Các ngôn ngữ lập trình có thể xây dựng những giao diện đẹp và thuận tiện thì thường không có cơ sở dữ liệu tốt đi kèm, và thường hạn chế khả năng khi sử dụng trên mạng diện rộng Các phần mềm về cơ sở dữ liệu có thể sử dụng mô hình Client/Server thì thường đòi hỏi có tính chuyên nghiệp cao
Hầu hết các biện pháp này thì đều có nhược diểm là phải có sự cài đặt trên máy đơn trước khi móc nối với Server Ngôn ngữ Java đưa ra một hướng giải quyết đơn giản các vấn đề trên Với việc thực thi các Apllet nhúng trong trang Web, chúng ta không cần có bất cứ một sự cài đặt nào mà vẫn sử dụng được các tính năng của chương trình (Với điều kiện là có một trình duyệt Web và máy tính
đã được nối mạng) Do tính năng mạng là được cung cấp sẵn nên Java có thể dùng trên mạng Internet dễ dàng Với tính độc lập nền, người sử dụng không phải e ngại việc phần mềm không tương thích với hệ điều hành của mình Đặc biệt là Java có thể kết nối với hầu hết các cơ sở dữ liệu chuẩn của các hãng phần mềm thông qua JDBC, vì vậy cơ sở dữ liệu của hệ thống có thể xây dựng bằng
hệ cơ sở dữ liệu chuẩn, chẳng hạn Oracle để quản lý dữ liệu một cách chặt chẽ (Ở đây chúng ta sẽ dùng cơ sở dữ liệu là Ms Access trong môi trường Window)
Mô hình quản lý thư viện được xây dựng như sau: người quản lý thư viện sẽ thông qua một Applet để quản lý hệ thống thư viện Chương trình này sẽ cho phép administrator bổ sung sách vào thư viện, hủy bỏ sách, đăng ký bạn đọc, quản lý việc mượn sách của bạn đọc Nếu thực hiện việc đọc sách từ xa, thì
Trang 11chương trình này sẽ tạo ra "tài khoản" để độc giả có thể truy cập tư liệu qua mạng Cũng có thể đưa chức năng quản lý, phân loại các trang Web vào hệ thống
dữ liệu của thư viện Người sử dụng sẽ tra cứu hệ thống mục lục của thư viện thông qua một applet trên một trang Web Như vậy chỉ cần một trình duyệt hiểu Java là người đọc có thể tra cứu mục lục thư viện tại bất cứ đâu Applet này sẽ tạo ra hệ thống menu cho phép người độc lựa chọn cách thức tra cứu sách: theo tên sách, theo tác giả, nhà xuất bản, theo nội dung,… Tuy nhiên nếu người đọc muốn mượn sách về nhà, thì phải liên hệ với người quản lý thư viện và thực hiện việc làm thủ tục mượn sách thông qua Applet của Administrator đã nói ở trên Tương lai nếu chúng ta lưu trữ tất cả các tư liệu trên đĩa từ thì có thể cho phép người đọc đọc tư liệu từ xa qua applet này sau khi người đọc đã đăng ký và được cấp một mật khẩu cho phép truy cập
2.2.1 Server
Đây là một chương trình Server đúng nghĩa Chương trình này có nhiệm vụ
sẽ lắng nghe và phục vụ các yêu cầu của User và Administrator, là cầu nối trung gian tới cơ sở dữ liệu
2.2.2 Database
Cơ sở dữ liệu sẽ gồm hai phần : một dùng để quản lý sách và một dùng quản lý độc giả Với việc sử dụng Access để tạo ra cơ sở dữ liệu thì nói chung không có vấn đề gì phức tạp Việc thiết kế chi tiết cơ sở dữ liệu sẽ được đưa ra trong phần sau
Trang 12CHƯƠNG 3
CƠ CHẾ TRUYỀN NHẬN TRONG JAVA
3.1 Các kiến thức cơ bản về Networking
Các máy tính chạy trên mạng Internet truyền thông với nhau dùng các Protocol TCP, UDP Mô hình mạng 4 lớp được mô tả bằng hình vẽ dưới đây:
Application (HTTP,ftp,telnet) Transport (TCP/IP,UDP) Network (IP,…) Link (device driver)
Hình 3.1: Mô hình mạng
Khi viết các chương trình Java có truyền thông qua mạng, điều này có nghĩa là ta đang lập trình ở lớp application Nhìn chung, ta không cần quan tâm tới các protocol TCP và UDP Thay vì vậy, có thể dùng các lớp trong package java.net Các lớp này cung cấp việc truyền thông qua mạng độc lập hệ thống Tuy nhiên, cần hiểu rõ sự khác biệt giữa TCP và UDP để xác định rõ những lớp nào trong thư viện Java sẽ sử dụng
Khi hai chương trình muốn truyền dữ liệu cho nhau một cách đáng tin cậy, chúng thiết lập một connection và gửi data qua lại thông qua connection đó Giống như các công ty điện thoại, TCP đảm bảo rằng data được gửi từ một đầu connection tới đầu kia không mất mát và đúng thứ tự (nếu không, một lỗi sẽ được thông báo)
Trang 13Định nghĩa: TCP là một protocol dựa trên connection, cung cấp các data flow tin cậy giữa 2 máy tính
Những ứng dụng yêu cầu một kênh truyền point-to-point, đáng tin cậy đều dùng TCP Hyper Text Transfer Protocol (HTTP), File Transfer Protocol (ftp), và Telnet (telnet) là những ứng dụng đòi hỏi một kênh truyền đáng tin cậy Thứ tự gửi và nhận phải đảm bảo là điều kiện buộc phải có đối với những ứng dụng này khi dùng HTTP để đọc từ một URL, dữ liệu cần phải nhận được theo đúng thứ tự
mà nó được gửi đi, nếu không mọi thứ sẽ đảo lộn cả lên
UDP protocol cung cấp việc truyền thông không đảm bảo giữa hai ứng dụng trên mạng UDP không dựa trên connection như TCP UDP gửi những package độc lập với nhau, gọi là datagrams, từ ứng dụng này tới ứng dụng kia Việc gửi những datagram giống như việc gửi thư thông qua bưu điện Thứ tự phân phát không quan trọng và khộng đảm bảo, và các message độc lập với nhau Định nghĩa: UDP là một protocol, gửi những package độc lập, gọi là các datagrams, từ máy này tới máy khác, không đảm bảo chắc chằn sẽ thành công UDP không dựa trên connection như TCP
Ports: Nói một cách tổng quát, một máy tính nối mạng là một connection vật lý đối với mạng đó Tất cả dữ liệu gửi cho một máy tính thông qua conection
đó Tuy nhiên, dữ liệu có thể được gửi cho những ứng dụng khác nhau trên máy
đó Vậy thì làm cách nào máy tính biết ứng dụng nào sẽ nhận dữ liệu được gửi đến? Điều này được giải quyết thông qua việc sử dụng Ports, mỗi ứng dụng mạng
có một port tương ứng
Dữ liệu truyền qua mạng có kèm theo thông tin địa chỉ nhằm xác định máy tính và port đích Mỗi máy tính được xác định bằng một địa chỉ IP 32-bits, IP protocol dùng địa chỉ này để phân phát dữ liệu đúng cho từng máy Port được xác định bằng một số 16-bits, các protocol TCP và UDP dùng port number để phân phát data tới đúng cho từng ứng dụng
Trong việc truyền nhận data dựa trên connection, một ứng dụng thiết lập
Trang 14number Điều này có ý nghĩa đăng ký ứng dụng với hệ thống để ứng dụng có thể nhận tất cả data được gửi đến cho port đó Không thể có hai ứng dụng dùng chung một port Mọi cố gắng gắn một socket với một port đã dùng đều sẽ thất bại
Trong việc truyền nhận data dựa trên datagram, datagram chứa port number của ứng dụng đích mà nó gửi tới
Định nghĩa: Các protocol TCP và UDP dùng ports để map incoming data cho một quá trình đang chạy trên một máy tính
Port number nằm trong khoảng 0-65535 (vì ports được biểu diễn bằng số nguyên 16-bits) Những port nằm trong khoảng 0-1023 là những port dành riêng cho những dịch vụ quen thuộc như HTTP, FTP và các dịch vụ của hệ thống (những port này gọi là các well-known port) Những ứng dụng mạng của bạn không nên dùng những port trong khoảng này
Hình 3.2: Mô hình TCP/IP
Thông qua những lớp trong package java.net, những chương trình Java có thể dùng TCP hay UDP để truyền nhận data qua Internet Các lớp URL, URLConnection, Socket và ServerSocket dùng TCP Các lớp DatagramPacket và DatagramServer dùng UDP
Java sử dụng HTTP để phân phát các Applet đa nền, có thể chạy trong môi trường Browser Nhìn chung, đây là công dụng chính của Java: tạo ra các trang HTML có nội dung động Tuy nhiên, đây chỉ là mặt ngoài của cái mà Java có thể làm được thực sự Các Net-package và kiến trúc Java cho phép nó được dùng
packet
TCP/IP port port port port
port data
Trang 15như một kiến trúc động, có thể chủ động dùng nguồn code, data, và input thông qua Internet Bằng cách tổng hợp các Java-package, programmers có thể phối hợp chương trình của mình cùng các protocol Telnet, FTP, NNTP, WWW để tạo
ra các ứng dụng mạng, thay vì chỉ chạy trên một máy như trước đây
Java tương tác với Internet theo cách riêng của nó, dữ liệu kéo về dưới dạng các file bytecode (.class), các file khác như ảnh, audio hay input từ việc tương tác với các user khác Chức năng này được giao tiếp chính thông qua mội trường Browser support Java, mặc dù vậy interpreter cũng có thể sử dụng các connection mạng Nhằm đáp ứng hai khả năng quan trọng là tính có thể mở rộng và tính đa nền, Java đã cung cấp một kiến trúc hướng đôí tượng không bị ràng buộc bởi việc hiện thực chương trình được compile từ trước khi thực thi (dạng file.EXE) Ngoài ra, để đáp ứng được những yêu cầu của người sử dụng, Java phải đảm bảo tính an toàn, hiệu xuất cao Tuy nhiên, cho đến thời điểm hiện tại, tốc độ thực thi một chương trình Java còn quá chậm Hy vọng điều này sẽ được cải thiện hơn khi có những phần cứng support Java riêng biệt
Các tính chất an toàn, đa nền, của ngôn ngữ Java được giải quyết bằng interpreted design Bằng cách Compile code ra dạng máy ảo, và tạo ra memory layout tại thời điểm chạy chương trình thay vì tại thời điểm compile, Java có khả năng truy xuất điều kiện của code trước khi nó được thực thi trên một máy client Tất cả những ưu điểm trên phải trả giá cho hiệu suất thực thi chương trình thấp Tuy nhiên, điều này đã được khắc phục phần nào bằng cách tạo code trung gian dưới dạng bytecode, cung cấp khả năng thực hiện chương trình Multithread khá dễ dàng, và đặc biệt hơn là chiến lược quản lý bộ nhớ với việc dọn rác tự động Sau đây là một số hiểu biết cơ bản về networking, Threads, Synchronization, Exceptions và Java-Security do ngôn ngữ Java cung cấp
Trang 163.2 Networking
Việc sử dụng những khả năng networking do Java support khá dễ dàng so với C và C++ Applet được nhúng trong các file HTML Để chạy những Applet qua mạng, việc trước tiên cần là là load các trang HTML này về máy cục bộ Các applet được nhúng trong các trang HTML thông qua phần khai báo APPLET Ngoài những lớp được hiện thực bới applet, những lớp thư viện khác do Browser cung cấp
Việc load các file ảnh và file audio được thực hiện thông qua lớp URL (package java.net) Lớp này biểu hiện một Uniform Resource Locator, là địa chỉ của tài nguyên nào đó trên mạng Lấy ví dụ, để load một file ảnh từ mạng, chương trình Java đầu tiên cần tạo một URL chứa địa chỉ chỉ tới file ảnh đó, sau
đó dùng một số hàm cần thiết để connect và truy xuất file ảnh đó
Nhìn chung, điểm nổi bật của Networking do Java mang lại là tính tiện lợi
và dễ sử dụng Điều này có thể hiểu rõ hơn trong phần giới thiệu về URLs, Socket ở những phần sau của tài liệu này
3.2.1 Giao tiếp giữa phần hiện thực client và Browser ở máy local
URLs
URL là từ viết tắt của Uniform Resource Locator, là một tham chiếu (một địa chỉ) tới một tài nguyên trên Internet Có thể tạm hiểu URL là tên của một file trên mạng vì hầu hết các URL tham chiếu tới 1 file trên máy nào đó trên mạng Tuy nhiên, bạn nên nhớ rằng URL có thể tham chiếu tới bất kỳ tài nguyên mạng nào, chẳng hạn như database queries và command output
Sau đây là một ví dụ về URL :http://java.sun.com/
Tất cả các URL đều có 2 phần tử chính :
1.Kiểu Protocol
2.Tên tài nguyên
Trang 17Cách dễ nhất để tạo một URL là dùng một chuỗi làm đối số cho URL constructor:
URL u = new URL("http://java.sun.com");
Đây là một URL tuyệt đối vì nó đặc tả toàn bộ tên tài nguyên Một constructor hữu dụng khác là một URL tương đối :
URL data = new URL(u,"conference/conference.html");
URL này đặc tả file conference.html, nằm trong thư mục conference của URL u
Trong chương trình, URL được sử dụng để load file chứa các nhóm hiện đang tồn tại, file chứa danh sách các user trong một nhóm, log file (file chứa thời điểm các user login, logout, các nhóm được tạo ra, delete), file help Để phát triển đề tài này thành các đề tài khác yêu cầu thêm một số chức năng như truyền nhận file, truy xuất cơ sở dữ liệu và cập nhật ngay ở client khi dữ liệu ở server
có thay đổi, cần phải có những kiến thức thêm nữa về cách sử dụng URL trong Java
Applet Context
Một applet chạy trong một browser như Netscape hay Apllet viewer Một applet có thể yêu cầu browser làm việc gì đó cho nó, ví dụ như, fetch một file audio, show một trang Web khác, Tùy vào loại browser mà có thể thực hiện yêu cầu này hoặc không Để liên kết với browser, applet gọi hàm getAppletContext Hàm này trả về một đối tượng kiểu AppletContext
3.2.2 Sockets
Ta sử dụng các URLs và URLConnections để truyền thông qua mạng ở cấp cao và dành cho một mục đích đặc biệt: truy xuất tài nguyên trên Internet Đôi khi chương trình của ta đòi hỏi việc truyền thông qua mạng ở mức thấp hơn, ví
dụ như khi ta viết một ứng dụng Client/Server (cụ thể là phần mềm này đã thực hiện điều đó)
Trang 18Trong những ứng dụng client/server, server cung cấp một dịch vụ nào đó, chẳng hạn như xử lý các database queries, gửi giá cả chứng khoán hiện tại, Client dùng dịch vụ do server cung cấp để hiển thị kết quả cho User, tạo ra những chỉ dẫn cần thiết cho người đầu tư, Việc truyền dữ liệu giữa client và server phải đáng tin cậy, không bị mất và không được tới sai thứ tự do server gửi Một Socket là một end-point của một liên kết giữa hai chương trình chạy trên mạng Các lớp socket được sử dụng để thể hiện connection giữa một chương trình client và một chương trình Server Package java.net cung cấp hai lớp: Socket và ServerSocket tương ứng với client và server
Chương trình Server thường listen ở một port riêng biệt, đợi các connection request từ các chương trình client Khi có một connection request, client và server thiết lập một connection mà qua đó chúng sẽ trao đổi dữ liệu với nhau Suốt quá trình connecton, client được gán cho một port number cục bộ, và bind một socket cho nó Client truyền (nhận) dữ liệu cho server bằng các ghi (đọc) socket Tương tự, server nhận một port number local mới (nó cần một port number mới để nó có thể tiếp tục listen các connetion request khác ở port ban đầu) Server cũng bind một socket cho port cục bộ của nó và liên lạc với client tương ứng thông qua socket này
Nhìn chung, các bước cần tiến hành để dùng socket ở phía client như sau:
1 Mở một socket
2 Mở input stream và outputstream ứng với socket đó
3 Read và write tới stream tùy thuộc vào nghi thức của server
Trang 19read, write dữ liệu Điều này hoàn toàn giống như cách thức đã mô tả ở phần sử dụng soclet ở Client được mô tả ở phần trên
Cụ thể là các việc sau :
1 Mở một input và output stream ứng với socket
2 Read và write tới socket
Trong đề tài, có nhiều client đồng thời đưa ra các connection request với server tại port mà server listen (port 4444) Có 2 cách để giải quyết vấn đề này :
1 Các connection request được xếp hàng, và Server phải accept các connection tuần tự
2 Phục vụ các connection request đồng thời bằng việc dùng các thread, Mỗi thread xử lý một connection
Đề tài đã chọn cách thứ hai để hiện thực vì nó hợp lý hơn: mọi user cần phải được xử lý bình đẳng như nhau
Giải thuật cho phần này như sau :
Trang 20 Lớp Socket
public Socket(String host, int port) throws UnknownHostException, IOException
Hàm constructor, tạo ra một stream socket và connect nó với port được đặc
tả bởi thông số port, trên host đặc tả bởi thông số host Ngầm định là tạo ra stream socket (ngoài ra có thể tạo ra datagram socket nếu đặc tả thêm thông số) Trong chương trình, thông số InetAddress được lấy bằng việc gọi hàm gethost sau khi có chuỗi URL chứa chương trình Client
public InetAddress getInetAddress()
Trả về remote IP address mà socket này connect với Từ trị trả về này, có thể gọi hàm getHostName từ lớp InetAddress để lấy hostName tương ứng Hàm này được gọi trong chương trình khi server cần lấy hostName của client connect với nó
public InputStream getInputStream() throws IOException
Trả về một input stream thực hiện việc đọc dữ liệu từ socket này
public OutputStream getInputStream() throws IOException
Trả về một output stream thực hiện việc ghi dữ liệu tới socket này Lớp
ServerSocket
public ServerSocket(int port) throws IOException
Tạo ra một server socket trên port được đặc tả bởi thông số port Nếu port =
0 thì tạo ra một server socket trên bất kỳ port nào trống
Chiều dài hàng đợi lớn nhất cho các yếu cầu connection là 50 Nếu một yêu cầu connection đến trong khi hàng đợi đầy, thì yêu cầu đó sẽ bị từ chối
public Socket accept() throws IOException
Listen một yêu cầu connection đối với socket này và chấp nhận nó Phương thức này bị block cho tới khi connection được thực hiện
Trang 21Public void close() throws IOException
Close socket lại (áp dụng cho cả Socket và ServerSocket)
Các Stream
Class BufferedInputStream
Là một input stream Public BufferedInputStream(InputStream in)
Hàm constructor, tạo ra một input stream có đệm để đọc data từ input stream được khai báo Kích thước beffer ngầm định là 512-byte Ta có thể khi báo kích thước buffer bằng constructor khác
Class DataInputStream
Ứng dụng sử dụng một data input stream để đọc các kiểu dữ kiệu nguyên thủy của Java từ một input stream lớp dưới , với đặc tính độc lập máy Ứng dụng dùng data out put stream để ghi data mà sau này sẽ được đọc bởi một data input stream
public DataInputStream(InputStream in)
Hàm constructor, tạo ra một data input stream để đọc data từ input stream được khai báo Trong chương trình, sử dụng thông InputStream là một BufferedInputStream được sinh ra từ input stream nhận được từ socket tương ứng
public final String readLine() throws IOException
Đọc hàng text kế từ data input stream gọi nó Phương thức này đọc thành công các bytes từ input stream lớp dưới cho đến khi hết một hàng Ký hiệu chấm dứt dòng được xác định bằng các ký tự sau: ký tự CR ('\r'), ký tự newline ('\n'), một ký tự CR theo sau bởi một ký tự newline, hay kết thúc của stream input Phương thức này bị block khi xảy ra một trong ba tình huống sau: một ký tự newline được đọc, một ký tự CR và byte đi liền sau nó được đọc (để xem có phải
là ký tự newline hay không), dò thấy dấu hiệu chấm dứt một stream, hay mot IOException được sinh ra
Trang 22Class PrintStream
Một print stream hiện thực một output stream filter, cung cấp các phương thức tiện lợi cho việc print các kiểu dữ liệu khác nhau
public PrintStream(OutputStream out)
Xây dựng một print stream mà sẽ viết output của nó tới một output stream lớp dưới được đặc tả
public void println(String s)
Print một chuỗi tới output stream lớp dưới của Print Stream gọi hàm này
Java Security
Các Java-application không thực hiện tính bảo mật như Java-applet Với một Java-application, nó có thể đọc và ghi file, giao tiếp với thiết bị, connect với các socket, Nhưng với Java-applet thì không như vậy Có nhiều việc mà Java-applet không được phép làm, và nhiều tài nguyên mà Java-applet chỉ nên hạn chế truy xuất
Các applet có thể quan hệ tới mô hình Client/Server cổ điển theo cách : Web server là server của applet Nó gửi applet tới máy client Máy client là máy trên đó client chạy thực sự Điều đó có nghĩa là khi ta browse một trang HTML
có nhúng applet, máy của ta là client Điều này làm rõ việc xác định những việc
mà applet không được phép làm
Nếu một applet được load qua mạng, nó không được phép :
1 Đọc , ghi , xóa, đổi tên file, tạo thư mục, liệt kê nội dung thư mục , kiểm tra sự tồn tại của file, trên client file system
2 Khai báo bất kỳ hàm điều khiển mạng nào, định nghĩa các lớp trên client file system, thiết lập connection với một chương trình chạy trên một máy khác máy chứa applet đó
Những điều trên dẫn đến hạn chế của chương trình: chỉ có thể đặt Server cùng một máy với Client, và cũng là máy chạy Web server
Trang 233.2.3 Threads, Synchronization và Exceptions
Multithread
Có lẽ ta đã quen thuộc với khái niệm multitasking: khả năng có nhiều hơn một chương trình hoạt động dường như cùng một thời điểm Những chương trình multithreaded mở rộng khái niệm mutitasking ở một mức thấp hơn: một chương trình có thể có thể chạy nhiều đoạn tính toán dường như cùng lúc (mỗi đoạn tính toán thường được gọi là một thread) Mỗi thread coi như chạy trong một ngữ cảnh riêng biệt: mỗi thread dường như có CPU của riêng nó, với các thanh ghi,
bộ nhớ và code cho riêng nó Cũng cần phân biệt khác nhau quan trọng giữa multiple processes và multiple threads: mỗi thread có tập các biến của riêng nó, còn các thread dùng chung data trong chương trình mà chúng thuộc về Điều này nghe có vẻ mạo hiểm Tuy nhiên, nó cho phép tạo ra overhead thấp hơn khi tạo
và xóa các thread so với việc sinh ra các process mới Điều này cũng giải thích tại sao tất cả các hệ điều hành hiện đại đều support multithreading
Có lẽ trong Java sức mạnh lớn nhất ngoài việc hướng đối tượng là khả năng multithreading Điều đặc biệt là do support multithreading trong cả ngôn ngữ và các thư viện lớp nên việc sử dụng đặc tính này dễ dàng hơn rất nhiều
Khi dùng một ứng dụng single-thread, chỉ có thể tiến hành duy nhất một việc trong chương trình Chương trình chiếm dụng tất cả tài nguyên của Java run-time system (dĩ nhiên điều này không có nghĩa là chương trình của ta là chương trình duy nhất chạy trên toàn bộ hệ thống, tuy nhiên đối với Java run-time system, chương trình của ta là thread duy nhất chạy trên máy ảo) Việc chạy các chương trình single-thread chỉ thích hợp cho những chương trình nhỏ, chỉ làm một nhiệm vụ đơn, còn trong thực tế yêu cầu của bài tóan conference là không thể: chương trình không thể đợi User nhập một câu Chat, chọn các User để gửi câu chat đi rồi mới listen message đến từ Server (ví dụ: tín hiệu logout, câu chat của user khác) Điều này cần được thực hiện đồng thời Chính vì lý do đó mà việc sử dụng multithreading để hiện thực chương trình là bắt buộc
Trang 24Trong Java, có hai cách để tạo một lớp hiện thực như một thread :
- Tạo một lớp là extends của lớp Thread
class className extends Thread{public void run(){
//những phương thưc xú lý bên trong} }
Khi gọi phương thức start(), phương thức run() tự động được gọi :
className myClass = new className();
myClass.start();
- Tạo một lớp implements Runnable interface
class className implements Runnable{
public void run(){
// những phuong thức xử lý bên trong} }
Để chạy thread loại này, cần pass một instance của lớp cho một đối tượng Thread mới:
className myClass = new className();
Trang 25Mỗi thread có một mức ưu tiên Theo ngầm định, một thread thừa hưởng mức ưu tiên của thread cha Ta có thể tăng hoặc giảm mức ưu tiên của bất kỳ thread nào bằng cách dùng phương thức setPriority Mức ưu tiên có thể được đặt trong khoảng giá trị từ MIN_PRIORITY (được định nghĩa là một trong lớp Thread) và MAX_PRIORITY (bằng 10) NORM_PRIORITY được định nghĩa là
Synchronization (xử lý crictical section)
Khả năng multithread do Java support mang lại nhiều lợi điểm Tuy nhiên, điều gì sẽ xảy ra nếu hai thread truy xuất và làm thay đổi cùng một đối tượng? Lý thuyết chung của vấn đề này vẫn là: phải đảm bảo trong quá trình một thread truy xuất và sửa đổi đối tượng dùng chung, nó không bị interrupted
Để giải quyết vấn đề này (crictical section), môn hệ điều hành có một số phương pháp: dùng semaphore, các giải thuật của Peterson, monitors, TESTANDSET Tuy nhiên, Java xử lý vấn đề này bằng synchronize access tới các đối tượng dùng chung, đây là hình thức sử dụng monitors, tuy nhiên việc sử dụng trong Java lại rất dễ dàng, hầu như chỉ là vấn đề khai báo
Đơn giản là ta chỉ việc khai báo phương thức mà các thread gọi để truy xuất đối tượng dùng chung với từ khóa: synchronized
public synchronized void changeObject(
){
}
Trang 26Sau đây là cơ cấu làm việc của synchronization:
1 Nếu một lớp có một hay nhiều phương thức synchronized, mỗi đối tượng của lớp nhận một hàng đợi, hàng đợi này giữ tất cả các thread đang đợi tới lượt thực thi một trong các phương thức synchronized
2 Có 2 khả để một thread xếp vào hàng: gọi phương thức synchronized trong khi thread khác đang sử dụng đối tượng dùng chung, hoặc chính thread đó gọi wait trong khi đang dùng đối tượng
3 Khi một lần gọi phương thức synchronozed trả về, hay một phương thức khác gọi wait, thread khác nhận quyền truy xuất tới đối tượng
4 Scheduler luôn chọn thread có mức ưu tiên cao nhất trong các thread đang trong hàng
5 Nếu một thread bị đặt vào hàng do gọi wait, nó cần được "unfrozen" bởi việc gọi notify trước khi nó được scheduled để thực thi tiếp
Các qui luật schedule khá phức tạp, nhưng sử dụng chúng lại khá đơn giản Chỉ cần thực hiện ba qui tắc sau:
1 Nếu hai hay nhiều thread sửa đổi một đối tượng, khai báo các phương thức thực hiện việc sửa đổi với từ khóa synchronized
2 Nếu một thread cấn đợi sự thay đổi trạng thái của một đối tượng, nó nên đợi bên trong đối tượng, không phải bên ngoài, bằng cách vào phần thực thi của phương thức synchronized và gọi wait
3 Bất cứ khi nào một phương thức thay đổi trạng thái của một đối tượng,
nó nên gọi notify Điều này làm các thread đang đợi có cơ hội
Vấn đề này buộc phải xử lý trong đề án ở một số phương thức Trong phần hiện thực Server, mỗi connection ứng với một client do một thread quản lý Giả
sử như có user_1 (client_1) thoát khỏi nhóm hiện hành của mình, khi đó thread_1
xử lý connection ứng với client này cần gọi hàm để xóa user khỏi nhóm Nếu trong quá trình hàm xóa user khỏi nhóm đang thực thi mà thread bị interrupted, bởi một thread khác, thread_2, ứng với client_2 (user_2) cùng nhóm với user_1,
Trang 27muốn gửi một câu chat cho user_1 Sau đó thread_1 lại dành quyền điều khiển của thread_1, thực hiện xóa user_1 khỏi nhóm cũ Thread_2 sau đó lại tiếp tục gửi câu chat cho user_1 lúc này không còn cùng nhóm với mình nữa Vì thế buộc phải khai báo synchronized cho hàm xóa user khỏi nhóm Còn một số tình huống khác trong phần hiện server buộc phải sử dụng synchronization, được mô tả kỹ hơn trong phần hiện thực chi tiết (phần 2)
Exceptions
Mặc dù hệ điều hành có thể đóng chương trình của ta mà không ảnh hưởng đến những ứng dụng khác, nhưng điều này không phải luôn đúng 100% Việc quản lý exception được chú tâm đặc biệt khi hiện thực Server, vì Server là một chương trình cần phài chạy background, không thể bị down
Java code có thể dò lỗi và chỉ cho run-time system lỗi đó là gì Thường thì một exception được throw sẽ làm cho thread gây ra lỗi đó kết thúc, và một thông báo lỗi được in ra Nếu bạn muốn tự quản lý excetion, bạn có thể sử dụng phát biểu catch để bẫy exception
Đoạn code để bẫy một exception có thể xảy ra có dạng như sau:
Try{
// some code which might throw an exception
}catch (exceptionType name){
//Handle the exception
}
Trang 28sở dữ liệu
4.1.1 JDBC là gì ?
Java định nghĩa mọi hướng cho việc nhận dữ liệu của applicaton và applet driver của JDBC cấp thấp tiến hành việc chuyển cơ sở dữ liệu riêng biệt đến giao diện JDBC cấp cao hơn Giao diện này được sử dụng bởi người phát triển và không cần lo lắng về cú pháp cơ sở dữ liệu đặc trưng khi tiến hành kết nối và query những cơ sở dữ liệu khác nhau JDBC là một gói (package), giống như những gói khác của Java Nhưng thông thường nó không phải là một phần của bộ phát triển phần mềm chuẩn, chẳng hạn như JDK Các hướng hiện có của JDBC là những driver cần thiết cho việc kết nối những cơ sở dữ liệu mà không đòi hỏi bất
cứ sự cài đặt nào trên client
4.1.2 Cấu trúc JDBC
Cấu trúc JDBC bao gồm những khái niệm sau :
Mục tiêu của JDBC là giao tiếp độc lập DBMS, một "cơ cấu truy xuất cơ sở
dữ liệu SQL chung", và một giao tiếp giống nhau cho tất cả các tài nguyên dữ liệu khác nhau Người lập trình chỉ viết một giao diện cơ sở dữ liệu duy nhất: sử dụng JDBC, chương trình có thể truy xuất bất cứ tài nguyên dữ liệu nào
Lớp DriverManager được sử dụng để mở một kết nối tới cơ sở dữ liệu qua JDBC driver, driver này phải đăng ký với DriverManger trước khi việc kết nối hình thành Khi một kết nối được gắn vào, DriverManager lựa chọn từ một danh
Trang 29sách các driver có thể tương thích với kiểu chính xác của cơ sở dữ liệu đã kết nối Sau khi việc kết nối được hình thành, việc gọi query và lấy kết quả là được làm trực tiếp với JDBC driver JDBC sử dụng cú pháp URL cho việc chỉ định một cơ
sở dữ liệu Ví dụ một kết nối tới một cơ sở dữ liệu mSQL sẽ có dạnh như sau :
jdbc : msql://mydatabase.server.com:1112/testdb
Câu lệnh này chỉ định "phương tiện" được sử dụng (jdbc), kiểu cơ sở dữ liệu (msql), tên server, cổng (1112), và cơ sở dữ liệu được kết nối tới (testdb) Kiểu dữ liệu trong SQL được ánh xạ vào kiểu nội bộ Java bất cứ khi nào có thể Khi một kiểu nội bộ là không miêu tả trong Java, một lớp là có sẵn trong việc nhận dữ liệu kiểu đó Một người phát triển có thể gán một field ngày trong
cơ sở dữ liệu với lớp ngày JDBC, sau đó người phát triển có thể sử dụng phương thức trong lớp Date để hiển thị hay tiến hành các thao tác JDBC cũng bao gồm các đối tượng nhị phân, do đó chúng ta có thể nhận và lưu trữ ảnh, nhạc, tài liệu, hay những dữ liệu nhị phân khác trong cơ sở dữ liệu với JDBC
tự như JDBC driver Trên thực tế JDBC–ODBC Brigde thật sự là một JDBC driver chuyển đến và từ ODBC ở cấp thấp Khi JDBC driver cho cơ sở dữ liệu sẵn có, chúng ta có thể dễ dàng bật từ ODBC driver đến JDBC driver với một vài thay đổi, nếu có, sự thay đổi đoạn mã của chương trình Java
Trang 30Đăng ký và gọi JDBC driver: Sau khi cài đặt những lớp JDBC, muốn sử dụng JDBC driver chúng ta phải import java.sql.* vào chương trình Java của mình Những lớp JDBC căn bản có chứa những thành phần cần thiết cho JDBC driver, và chúng phục vụ như người đứng giữa chúng ta và mã cấp thấp trong JDBC driver JDBC API cung cấp chúng ta với một giao diện dễ sử dụng cho việc giao tiếp với tài nguyên dữ liệu, độc lập với driver mà chúng ta sử dụng
4.2 Sử dụng JDBC để truy suất cở sở dữ liệu
Đăng ký Cơ sở dữ liệu với JDBC
Trước khi có thể truy suất tới cơ sở dữ liệu ODBC dưới nền Window95 hay WinNT, ta phải đăng ký nó với một bảng điều khiển driver ODBC Dưới nền Window95, đó là một icon ODBC trong chương trình Control Panel Còn trong WinNT, nó được tìm thấy trong Start menu
Nhấp đôi chuột vào biểu tượng ODBC, sau đó chọn mục “Add” Sau đó chọn một driver cơ sở dữ liệu (ở đây ta chọn Microsoft dBase Driver) và nhấp vào “OK” Đánh tên cơ sở dữ liệu vào Data Source Name và Description, rồi
Trang 31chọn mục “Select” để cập nhật và chọn nó Sau khi cập nhật cơ sở dữ liệu, màn hình sẽ hiển thị như ở hình bên dưới
4.3 Kết nối tới cơ sở dữ liệu
Tất cả các đối tượng cơ sở dữ liệu và phương thức được đặt trong gói java.sql, và do đó ta phải import java.sql.* vào chương trình đang sử dụng JDBC
Để kết nối tới một cơ sở dữ liệu ODBC, trước tiên ta phải load cầu nối driver JDBC_ODBC:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
Phát biểu này sẽ load driver và tạo ra một đối tượng của lớp đó Sau đó, để kết nối tới tới một phần của cơ sở dữ liệu, ta phải tạo ra một đối tượng của lớp Connection, và quy cho cơ sở dữ liệu sử dụng cú pháp URL:
String url=”jdbc:odbc:Subname”);
Connection conn=create.getConnection(url);
Subname chính là Data Source Name mà ta đăng ký trong Control Panel
Cú pháp URL có thể biến đổi hoàn toàn cho các kiểu khác của cơ sở dữ liệu
jdbc.Subprotocol.Subname
Những chữ đầu tiên minh họa cho protocol kết nối và luôn luôn là JDBC Subprotocol ở đây được ghi rõ là ODBC Nó định nghĩa cơ chế kết nối cho một lớp cơ sở dữ liệu Nếu ta kết nối tới một Server cơ sở dữ liệu trên một máy khác,
ta có thể ghi rõ tên máy, Subprotocol đó cũng như user name, password như một phần của chuỗi Connection
4.4 Truy Suất Cơ sở dữ liệu
Một khi đã kết nối được tới cơ sở dữ liệu, điều ta đòi hỏi là các thông tin trên những tên bảng, tên cột, nội dung của các cột, và ta có thể chạy SQL mà không cần phải truy vấn đến cơ sở dữ liệu, hoặc thêm vào, hoặc sửa chữa lại nội
Trang 32dung của nó Các đối tượng mà ta có thể sử dụng để thu được các thông tin từ cơ
sở dữ liệu là:
DatabaseMetaData: thông tin đầy đủ về cơ sở dữ liệu: tên bảng, tên các chỉ mục của bảng, tên sản phẩm cơ sở dữ liệu, version và các hoạt động được cung cấp bởi cơ sở dữ liệu
ResultSet: thông tin về một bảng hay kết quả của một truy vấn Ta có thể truy xuất tới hàng dữ liệu bởi một hàng, nhưng có thể truy suất tới các cột bằng nhiều cách khác
ResultSetMetaData: thông tin về một tên cột, các kiểu của cột trong đối tượng ResultSet
Trong khi mỗi đối tượng này có một số lượng lớn các phương thức hướng dẫn
ta lấy được các thông tin chi tiết chính về các phần tử của cơ sở dữ liệu Có một vài phương thức chính trong mỗi đối tượng này cho ta những thông tin đầy ý nghĩa nhất về cơ sở dữ liệu của ta
4.5 Đối Tượng ResultSet
Đối tượng ResultSet là một đối tượng rất quan trọng trong JDBC Nó là một sự trừu tượng hóa rất cần thiết của một bảng được tổ chức về chiều rộng và
có chiều dài không được biết trước Hầu như tất cả các phương thức, kết quả của các truy vấn đều trả về dữ liệu như một ResultSet Nó liên quan đến số tên cột
mà ta có thể truy vấn bởi tên Nó còn gồm cả tên của các hàng mà ta có thể di chuyển suốt từ trên xuống dưới của dãy trong một lần
Trước khi dùng ResultSet, ta cần phải biết xem có bao nhiêu có bao nhiêu cột liên quan đến Thông tin này được cất trong đối tượng ResultSetMetaData
ResultSet results;
ResultSetMetaData rsmd;
rsmd=results.getMetaData();
numcols=rsmd.getColumnCount();
Trang 33Khi ta thu được một ResultSet, nó chỉ tới hàng đầu tiên Ta sử dụng phương thức next( ) để thu thêm các hàng còn lại, và phương thức trả về False khi không còn hàng nào nữa Từ khi đem dữ liệu từ một cơ sở dữ liệu, có thể, nó
sẽ phát ra những biệt lệ Ta phải luôn đặt hàm lấy kết quả trong một khối try
try{
rsmd= results.getMetaData(); //lấy dữ liệu từ kho MetaData
ResultSetMetaData rsmd=results.getMetaData();
int numCols=rsmd.getColumnCount();//tạo biến đếm số cột
boolean more=results.next(); //tạo biến cho biết cột đã hết chưa while(more)
Các bước của chương trình:
- Lấy dữ liệu từ kho MetaData
- Đếm số cột sử dụng getColumnCount() trong ResultSetMetaData
- Tạo biến đối tượng xem xét số cột đã hết chưa (true còn, false hết)
- Trong khi còn các cột:
- Tạo vòng lặp đếm số cột
- Lấy giá trị tại cột thứ j
Trang 34- Đóng đối tượng results
- Bắt biệt lệ hết cột xảy ra
- Trả dữ liệu về kho ResultSetMetaData
Ta có thể thu được dữ liệu trong ResultSet theo nhiều dạng, phụ thuộc vào kiểu dữ liệu được cất trong mỗi cột Do đó, ta có thể thu được nội dung của cột
mà không cần biết đến số cột hay tên cột
Chú ý rằng số cột bắt đầu bàng một (1), không phải là không (0)
Một vài phương thức minh họa cho đối tượng ResulSet sau:
- getInt(int): trả về nội dung của cột được đánh số như là một số integer
- getInt(String): Trả về nội dung của cột được đặt tên như là một số integer
- getFloat(int): Trả về nội dung của cột được đánh số như là một số float
- getFloat(String): Trả về nội dung của cột được đặt tên như là một số float
- getDate(int): Trả về ngày tạo lập của cột được đánh số
- getDate(String): Trả về ngày tạo lập của cột được đặt tên
- next(): Chuyển con trỏ tới hàng kế tiếp và trả về false khi hết hàng
- close(): Đóng đối tượng ResultSet
4.6 Đối Tượng ResultSetMetaData
Ta thu được đối tượng ResultSetMetaData từ đối tượng ResulSet khi sử dụng phương thức getMetaData() Ta có thể sử dụng đối tượng này để tìm số và kiểu của cột cũng như tên của mỗi cột
- getColumnCount(): Trả về số cột trong ResultSet
- getColumnName(int): Trả về tên của cột được đánh số
- getColumnLabel(int): Trả về nhãn của cột được đánh số
- Iscurrency(int): Trả về true nếu cột này chứa một số trong Currency Unit
- IsReadOnly(int): Trả về true khi nội dung trong cột là read only
Trang 35- IsAutoIncrement(int): Trả về true nếu cột tự động tăng lên Các cột này thường là khóa và là read only
- getColumnTypes(int): Trả về kiểu dữ liệu SQL cho cột này Những kiểu
dữ liệu này bao gồm: BIGINT, BINARY, BIT, CHAR, DATE, DECIMAL, DOUBLE, FLOAT…
4.7 Đối Tượng DatabaseMetaData
Đối tượng này cho ta thông tin về cơ sở dữ liệu hiện hành Ta sử dụng nó một cách chính thức để lấy tên của bảng trong cơ sở dữ liệu, và tên của cột trong bảng Do có nhiều cơ sở dữ liệu khác nhau nên chúng cung cấp nhiều sự khác biệt của SQL Sau đây là một số phương thức mà nó có thể truy vấn đến cơ sở dữ liệu như những gì mà nó cung cấp cho SQL:
- getCatalogs(): Trả về danh sách ctaloge của các thông tin trong cơ sở dữ liệu Với cầu driver JDBC_ODBC ta đã có một danh sách của cơ sở dữ liệu được ghi bằng ODBC Rất hiếm khi Catalog được sử dụng trong cơ sở dữ liệu JDBC_ODBC
- getTables(catalog, schema, tablename, columnname): Trả về diện mạo của tất cả các bảng được gom trong tablename, và tất cả các cột gom lại trong tên cột
- getColumns(catalog, schema, tablename, columnname)
- getURL(): Lấy tên của URL mà ta kết nối tới
- getDriverName(): Lấy tên của driver mà ta kết nối tới
Trang 364.8 Lấy Thông Tin Trên Table
Ta có thể lấy thông tin trên một bảng trong cơ sở dữ liệu bằng cách dùng phương thức getTables() trong kho DatabaseMetaData() Phương thức này có bốn thông số:
results=dma.getTables(catalog, schema, tablemask, type[]);
- Catalog: Tên catalog để tìm tên bảng trong đó
- Schema: Giản đồ tóm lược cơ sở dữ liệu Nhiều cơ sở dữ liệu không cung cấp Schema Một số trường hợp khác, nó là username của người chủ cơ sở dữ liệu Nó thường được đặt là null
- Tablemask: Một mask thì minh họa cho tên một bảng mà ta muốn lấy ra Nếu ta muốn lấy tất cả tên bảng, ta đặt nó trong một ký tự wildcard % Ký tự wildcard trong SQL là % chứ không giống như ký tự wildcard trong các chương trình khác là *
- type[]: Một dãy String minh họa kiểu của bảng mà ta muốn lấy ra Nếu type[] là null, ta sẽ lấy toàn bộ những thông tin trên bảng đó Nếu ta để vào chỗ này một một phần tử dãy chứa tên bảng kiểu String, ta sẽ chỉ thu được bảng mà
//lấy ra tên của table trong CSDL
String[] types =new String[1];
types[0]="Table";
Trang 37//chú ý dấu hiệu % của wild card
Trang 38CHƯƠNG 5 PHÂN TÍCH VÀ THIẾT KẾ
5.1 Giới thiệu công cụ hỗ trợ thiết kế UML
UML là công cụ hỗ trợ việc phân tích thiết kế hướng đối tượng, UML cho phép ta tạo ra những mô hình, biểu đồ đồng thời cho phép điều khiển, thể hiện các mối quan hệ các thuộc tính trên các mô hình thành phần đó UML sử dụng phân tích thiết kế hướng đối tượng, để xây dựng những mô hình hệ thống hướng đối tượng Những mô hình này sau đó có thể được dùng để phát triển mã cho hệ thống UML được dùng để phát triển bởi Grandy Booch, James Rumbangh và Ivar Jacobson, sử dụng các khái niệm từ phương thức Booch, OMT và OOSE, những ý tưởng không liên kết từ những phương pháp khác nhau Bằng việc kết hợp các khái niệm từ phương thức chủ đạo hướng đối tượng UML mong rằng sẽ cung cấp một chuẩn định cho việc phân tích thiết kế hướng đối tượng
Xem thông tin
và, mượn sách
Xem kết quả mượn sách
Xem thông tin sách Độc giả
Trang 39Hinh 5.2: Biểu đồ Use Case các chức năng của Độc giả
Biểu đồ ca sử dụng “Đăng ký làm thẻ”
Hinh 5.3: Biểu đồ ca sử dụng “Đăng ký làm thẻ”
Những user chưa có account trong hệ thống Nhóm này khi muốn vào hệ thống phải đăng ký account
Để trở thành Độc giả thì NewUser phải tiến hành nhập đầy đủ các thông cá nhân: UserID, Password, Họ và tên, ngày sinh, giới tính, địa chỉ và chờ sự xét duyệt của User có thẩm quyền
Trang 40hệ thống Hành động của tác
Tên/Mật khẩu sai Nếu trong Dòng sự kiện chính, tác nhân nhập sai tên
hoặc sai mật khẩu hệ thông sẽ hiển thị thông báo lỗi Actor có thể trở về đầu dòng sự kiện chính hoặc hủy bỏ việc đăng nhập, lúc này Use case kết thúc
Điều kiện thoát Nếu use case thành công, actor lúc này đã đăng nhập
vào hệ thống Nếu không trạng thái hệ thống không thay đổi