Đề tài Quản lý phòng máy thư viện bằng mã vạch

Sau khi cài đặt xong chạy Enterprise Manager tạo database tên là lvtn, mởSQL Service Manager stop tạm dừng SQL Server. Copy 2 file: lvtn_Log.LDF và lvtn_Data.MDF vào thưmục C:\Program Files\Microsoft SQL Server\MSSQL\Data. Cuối cùng mởlại SQL Service Manager và start SQL Server.

pdf137 trang | Chia sẻ: lylyngoc | Lượt xem: 2732 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Quản lý phòng máy thư viện bằng mã vạch, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Khi trình chủ nạp servlet vào bộ nhớ, phương thức init() chỉ có thể được gọi duy nhất một lần, trong khi phương thức service() có thể được triệu gọi nhiều lần ứng với mỗi yêu cầu servlet phát sinh từ client. Trong phương thức service() bạn có thể sử dụng đối tượng tham số ServletRequest, ServletResponse để tiếp nhận dữ liệu từ trình khách chuyển lên và xuất kết quả trở lại trình khách. Vd: public void service(ServletRequest request, ServletResponse response) throws IOException QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 31 { response.setContentType(“text/html”); PrintWriter out = response.getWriter(); out.println(“”); out.println(“”); out.println(“Chao moi nguoi! ”); … } I.2.2.3. Phương thức huỷ destroy(): Khi servlet không còn dùng đến nữa hay hết thời gian qui định lưu trữ trong bộ nhớ của Web Server, nó sẽ bị trình chủ giải phóng. Trước khi servlet bị huỷ phương thức destroy() sẽ được gọi. Phương thức này có thể dùng để dọn dẹp tài nguyên mà các biến chiếm giữ, đóng các kết nối mà phương thức init() đã mở. I.2.2.4. Phương thức getServletConfig() và getServletInfo(): public String getServletInfo(); public ServletConfig getServletConfig(); Hai phương thức này nhằm mục đích cung cấp thông tin. Phương thức getServletConfig() giúp người sử dụng servlet có được đối tượng servletConfig chứa các thông tin khởi tạo từ môi trường ngoài đưa vào servlet. Phương thức getServletInfo() trả về một chuỗi thông tin mô tả ý nghĩa và mục đích của servlet. I.2.3. Chu trình sống của servlet: Chu trình sống của servlet được tính từ khi servlet bắt đầu được hệ thống lưu tâm đến (như việc gọi nạp vào bộ nhớ) cho đến khi nó bị loại ra khỏi trình chủ Web server vì không còn cần nữa. Chu trình sống của servlet trải qua các giai đoạn sau: ‰ Nạp servlet ‰ Khởi tạo servlet ‰ Thực thi servlet ‰ Dọn dẹp servlet QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 32 I.2.3.1. Nạp servlet: Tuy theo điều kiện, một servlet có thể được nạp vào bộ nhớ ở ba thời điểm khác nhau: khi server khởi động, khi người quản trị yêu cầu, hoặc khi trình duyệt triệu gọi servlet từ máy khách. Hầu hết các Web server đều cho phép bạn chọn danh sách servlet sẽ được ưu tiên nạp lúc Web server khởi động. Để nạp servlet, trình chủ Web server cần phải biết tên lớp của servlet. Thông thường tên lớp của servlet (tên tập tin .class) cũng là tên mà trình duyệt dùng để triệu gọi servlet. Chúng ta thường gọi servlet với địa chỉ URL bắt đầu với tiếp đầu ngữ /servlet. Ví dụ địa chỉ sau Cách mà trình chủ Web server sử dụng ở đây là khi nhận được chuỗi URL triệu gọi servlet, nó sẽ phân tích chuỗi này và nhận ra tiếp đầu ngữ /servlet. Đây chính là tên ánh xạ dùng để gọi các servlet mặc định. Khi đó Web server sẽ truy tìm tiếp các servlet sau bí danh /servlet (ở đây là servlet helloWorld) và triệu gọi nó thực thi. Tuy nhiên, bạn cũng có thể ánh xạ đổi tên servlet khác với tên tập tin .class của nó thậm chí đối với cả tiếp đầu ngữ dùng để triệu gọi servlet và vị trí thư mục chứa servlet. Khi có một yêu cầu triệu gọi servlet, trình chủ Web server sẽ xem xét servlet đã nạp vào bộ nhớ hay chưa, nếu chưa nó sẽ nạp servlet vào bộ nhớ. Một khi servlet đã nạp, Web server sẽ tiến đến giai đoạn khởi tạo servlet. I.2.3.2. Khởi tạo servlet: Trình chủ Web server khởi tạo servlet bằng cách gọi đến phương thức init() mà servlet cài đặt. Phương thức này chỉ gọi một lần duy nhất. Bạn có thể lợi dụng cơ hội này để khởi tạo các biến toàn cục mà servlet sẽ sử dụng sau này. I.2.3.3. Thực thi servlet: Khi trình duyệt hoặc các trang JSP triệu gọi servlet thông qua địa chỉ URL, trình chủ Web server sẽ chính thức gọi servlet thực thi thông qua các phương thức như doGet(), doPost(), hoặc service(). Lưu ý, sau khi các phương thức này được gọi thực thi xong, servlet vẫn giữ lại trong bộ nhớ để phục vụ cho lần triệu gọi tiếp theo. Đây cũng chính là ưu điểm làm cho servlet thực thi nhanh hơn các ứng dụng CGI. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 33 I.2.3.4. Dọn dẹp servlet: Servlet không giữ lại trong bộ nhớ vĩnh viễn, sẽ đến lúc cần loại servlet khỏi bộ nhớ. Trước khi chấm dứt, Web server sẽ gọi đến phương thức huỷ destroy() của servlet. Đây là cơ hội để servlet thực hiện một số thao tác dọn dẹp cần thiết như lưu dữ liệu xuống đĩa, ghi nhớ trạng thái của servlet để phục vụ cho lần khởi động sau, đóng kết nối với cơ sở dữ liệu… Và mặc dù Java có thể tự động thu gom rác trong bộ nhớ nhưng nếu bạn đã cấp phát một khối lượng bộ nhớ lớn cho servlet trong quá trình làm việc, bạn nên thực hiện giải phóng chúng trong phương thức destroy() này. I.3. So sánh giữa JSP và Servlet: Do mã trang JSP khi thực thi đều được biên dịch ra servlet cho nên tất cả những gì servlet làm được cũng đồng nghĩa với trang JSP làm được. Viết trang JSP đôi lúc đơn giản hơn viết servlet vì không cần phải qua bước đăng kí và biên dịch thủ công. Tuy nhiên bạn cũng nên biết một số trường hợp cần phải phân biệt giữa JSP và Servlet và cách sử dụng chúng. JSP có thể trộn lẫn mã Java với các thẻ HTML, cho nên việc thiết kế trang JSP thường đơn giản và dễ bổ sung hơn so với servlet. Tuy nhiên, đây cũng là yếu tố không nên lạm dụng đối với JSP. Nếu bạn tập trung tất cả mã Java vào cùng với mã HTML, một khi dự án mở rộng và trở nên phức tạp, việc bảo trì và nâng cấp ứng dụng Web với hàng trăng trang JSP sẽ rất khó khăn. Trong quá trình phát triển ứng dụng Web theo nhóm, việc trộn lẫn mã Java và HTML trong trang JSP cho thấy không hiệu quả. Với servlet, tuy phải biên dịch và đăng kí thủ công với trình chủ, nhưng bù lại tính bảo mật cao hơn. Bạn chỉ cần cung cấp cho trình chủ Web server bản servlet nhị phân (tập tin .class) đã qua bước biên dịch mà không cần đến mã nguồn của servlet ban đầu. Mặt khác, các servlet có thể tương tác với nhau để tạo nên những kết xuất tuỳ biến và đa dạng trước khi trả kết quả về cho trình khách. Servlet có thể phân rã các đơn thể của dự án và phát triển độc lập như các thành phần riêng rẽ để ráp lại thành một tổng thể chung. Tuy nhiên, việc kết xuất trong servlet thương dựa vào phương thức print() hay println(). Công việc quyết định giao diện cho kết xuất hoàn toàn phụ thuộc vào lập trình viên với hàng loạt các câu lệnh print() hay println() rất khó quản lý. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 34 II. JDBC: II.1. Giới thiệu: Máy tính ra đời do nhu cầu điều tác và lưu trữ thông tin của con người. Thông tin này thường được truy cập từ trong một môi trường cơ sở dữ liệu. Do đó quả là không đúng nếu ta giới thiệu một ngôn ngữ mới mà không cung cấp vài kiểu giao diện cho một ngân hàng dữ liệu. Và Java cũng không ngoại lệ. Các nhà phát triển Java đã thấy rằng họ cần một khung sườn để có thể xây dựng một giao diện đồng nhất nằm trên nhiều hệ thống giao kết cơ sở dữ liệu khác nhau. Một khung sườn như vậy sẽ cho phép các nhà phát triển viết một giao diện cơ sở dữ liệu đơn lẻ trên nhiều nền tảng. Khung sườn với những tính năng như trên được mang tên JDBC (Java Database Connection). II.2. Khái quát: JDBC là trình điều khiển thông dụng của Java. JDBC giúp cho JSP và Servlet tiếp cận với các hệ quản trị cơ sở dữ liệu một cách dễ dàng thông qua ngôn ngữ SQL. JDBC không phân ngữ chuỗi văn bản cho người dùng, nó đơn giản tác động như cầu nối giữa người dùng và cơ sở dữ liệu, cho phép cơ sở dữ liệu phân ngữ chuỗi. Như vậy, mọi lỗi ngoại lệ phát sinh đều bắt nguồn từ cơ sở dữ liệu, chứ không phải từ tầng JDBC. API JDBC bao gồm bốn lớp chính: ‰ java.sql.DriverManager ‰ java.sql.Connection ‰ java.sql.Statement ‰ java.sql.ResultSet II.2.1. java.sql.DriverManager java.sql.DriverManager là một lớp rất quan trọng. Mục đích chính của nó là quản lý các tiểu trình điều khiển cơ sở dữ liệu JDBC khác nhau. Khi chạy một ứng dụng, QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 35 chính DriverManager sẽ có trách nhiệm nạp tất cả các trình điều khiển có trong tính chất hệ thống jdbc.drivers. II.2.2. java.sql.Connection Khi thiết lập một tuyến nối với cơ sở dữ liệu, lớp java.sql.Connection biểu thị ví dụ minh họa của một phiên làm việc cụ thể. Khi nào tuyến nối vẫn còn mở, ta vẫn có thể thi hành các truy vấn SQL và có thể có các kết quả. Có thể dùng giao diện này để truy lục thông tin liên quan đến các phần mô tả bảng và các thông tin khác về cơ sở dữ liệu đang kết nối. II.2.3. java.sql.Statement Giao diện java.sql.Statement chuyển đến cơ sở dữ liệu mà chuỗi SQL cần thi hành. Nó cũng truy lục các kết quả từ cơ sở dữ liệu dưới dạng một ResultSet. Mỗi câu lệnh chỉ có thể mở một ResultSet vào cùng một thời điểm. Ví dụ, hai ResultSet không thể được so sánh với nhau nếu cả hai đều bắt nguồn từ cùng câu lệnh SQL. Nếu một câu lệnh SQL được phát lại vì một lý do nào đó, ResultSet cũ tự động được đóng. II.2.4. java.sql.ResultSet Một java.sql.Resultset biểu thị cho dữ liệu được truy lục từ một câu lệnh SQL đang được thi hành. Dữ liệu từ bộ hỏi được chuyển giao dưới dạng một bảng kết quả. Các hàng của bảng được tuần tự trả về cho chương trình, nhờ đó các cột dữ liệu có thể được truy cập. Một biến con trỏ sẽ lưu giữ mẩu tin hiện đang được được truy cập. Một ResultSet không thể quay lui. Để đọc lại một hàng được truy lục trước đó, chương trình phải đóng ResultSet và phát lại câu lệnh SQL. Sau khi truy lục hàng chót, câu lệnh xem như là đã được đóng, điều này có nghĩa là ResultSet tự động đóng. Có thể truy lục các cột từ hàng hiện hành theo thứ tự bất kì. Một chương trình có thể thu thập các giá trị bằng một số chỉ mục của cột (bắt đầu từ 1), hoặc phát biểu rõ ràng tên cột . Về khả năng cơ động và hiệu năng, các cột nên được truy lục từ trái sang phải và chỉ được đọc một lần. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 36 II.3. Các kiểu JDBC: Theo đặc tả của Sun có 4 kiểu JDBC sau: II.3.1. Kiểu 1:JDBC sử dụng cầu nối ODBC (JDBC-ODBC Bridge) ODBC (Open Database Connectivity) là cách kết nối tổng quát nhất đến mọi hệ cơ sở dữ liệu thông qua trình quản lý ODBC của Windows. Mỗi hệ cơ sở dữ liệu sẽ cung cấp một trình điều khiển (driver) có khả năng đọc hiểu được cơ sở dữ liệu của chúng. Trình điều khiển này sẽ được đăng kí với bộ quản lý ODBC. Tất cả các lệnh truy xuất cơ sở dữ liệu đều được thực thi bằng lệnh SQL. Java cung cấp cho bạn khả năng sử dụng JDBC để gọi ODBC. Bằng cách này bạn có thể kiểm soát được nhiều hệ quản trị CSDL khác nhau. Mã Java Mã đặc thù II.3.2. Kiểu 2:JDBC kết nối trực tiếp với các trình điều khiển cơ sở dữ liệu JDBC kết nối trục tiếp với trình điều khiển đặc thù của mỗi hệ cơ sở dữ liệu (native database driver) mà không cần phải qua trung gian ODBC của Windows. Do đó kiểu kết nối này sẽ nhanh và hiệu quả hơn kiểu 1. Tuy nhiên phải có các trình điều khiển cơ sở dữ liệu đặc thù do những nhà phát triển cơ sở dữ liệu hay nhà phân phối cung cấp. Java Application, Applet, Servlet JDBC Driver ODBC Database Driver QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 37 Mã Java Mã đặc thù II.3.3. Kiểu 3:JDBC kết nối thông qua các ứng dụng mạng trung gian Theo mô hình lập trình phân tán, ứng dụng trung gian trên máy chủ sẽ chịu trách nhiệm kết nối với cơ sở dữ liệu. Nhiệm vụ của trình khách là sử dụng những trình điều khiển JDBC gọn nhẹ, có khả năng giao tiếp với ứng dụng trung gian qua Internet để truy vấn dữ liệu. Mã Java internet Mã Java Java Application, Applet, Servlet JDBC Driver Database Driver Java Application, Applet, Servlet JDBC Driver Java Middle_Ware Java Native Driver QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 38 II.3.4. Kiểu 4:JDBC kết nối thông qua các trình điều khiển đặc thù ở xa Kiểu này cho phép máy khách sử dụng các trình điều khiển gọn nhẹ kết nối vào trình điều khiển cơ sở dữ liệu đặc thù (thuần Java) trên máy chủ từ xa thông qua mạng Internet. Mã Java internet Mã Java II.4. Truy xuất cơ sở dữ liệu: Hầu hết các ứng dụng JDBC đều theo cùng các bước cơ bản sau: II.4.1. Kết nối với cơ sở dữ liệu: Để thiết lập kết nối, JDBC đòi hỏi 2 yếu tố là trình điều khiển (tương ứng với các kiểu kết nối) và thông tin để kết nối (địa chỉ máy chủ, tên tài khoản đăng nhập, mật khẩu...). Đối với cơ chế truy xuất thông qua ODBC, sử dụng trình điều khiển do Sun cung cấp mang tên JdbcOdbcDriver. Chúng ta khai báo tên lớp này như sau: String drivername = “sun.jdbc.odbc.JdbcOdbcDriver”; Tiếp đến ta gọi phương thức forName của lớp Class để nạp và khởi tạo trình điều khiển: Class.forName(drivername).new Instance(); Kể từ lúc này bạn đã hoàn toàn có khả năng sử dụng trình điều khiển JDBC- ODBC để truy xuất dữ liệu. Tuy nhiên, trình điều khiển của bạn cần biết thêm những Java Application, Applet, Servlet JDBC Driver Java Native Driver QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 39 thông tin cụ thể như tài khoản đăng nhập, địa chỉ máy chủ chứa cơ sở dữ liệu. Trong trường hợp sử dụng ODBC những thông tin này được chúng ta thiết lập trước đó khi cấu hình cho chuỗi kết nối cơ sở dữ liệu lvtn bằng ODBC Driver của Windows. Bạn đặt thông tin này trong chuỗi kết nối như sau: String connectionURL = “jdbc:odbc:lvtn”; String username=”sa”; String password=””; Ở đây chuỗi jdbc:odbc: là bắt buộc đối với trình điều khiển JDBC-ODBC. Phía sau chuỗi này là thông tin kết nối cụ thể đến cơ sở dữ liệu lvtn của chúng ta do ODBC quy định. Cuối cùng đối tượng Connection sẽ thể hiện kết nối đến cơ sở dữ liệu. Bạn gọi phương thức getConnection của lớp DriverManager để yêu cầu trình điều khiển nạp bởi Class.forName() trước đây tiếp nhận thông tin và thực thi kết nối. Connection con = null; con = DriverManager.getConnection(connectionURL, username, password); Với ODBC, nếu khi thiết lập thông số cho lvtn bạn đã chỉ định rõ thông tin đăng nhập username/ password thì có thể gọi đối tượng Connection để thực hiện kết nối đến cơ sở dữ liệu gọn hơn như sau: Connection con = DriverManager.getConnection(connectionURL); II.4.2. Truy vấn dữ liệu: Chúng ta truy vấn dữ liệu bằng các câu lệnh truy vấn SQL. JDBC truy vấn dữ liệu dựa vào đối tượng Statement (dùng thực thi câu lệnh SQL). Truy vấn thành công thì Statement sẽ trả về kết quả là tập dữ liệu truy vấn có kiểu ResultSet. Ngoài đối tượng Statement, đối tượng PreparedStatement có thể được sử dụng. Điều này tạo ra cơ hội đơn giản hóa đối tượng Statement: Cho những câu truy vấn có tính chất lặp lại rất giống nhau ngoại trừ vài giá trị đối số, chúng hiệu quả hơn rất nhiều vì câu SQL được biên dịch một lần và sau đó được thực thi rất nhiều lần, với giá trị đối số được thay thế cho từng câu truy vấn. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 40 Cơ chế cho việc chèn những đối số quy định các kí tự đặc biệt theo một cách thức cần thiết cho việc hiệu chỉnh cơ sở dữ liệu đã kết nối. PreparedStatement có tập những câu SQL khi nó được khởi tạo. Những đối số được xác định bởi những kí tự “?”. Sau khi xây dựng xong, những đối số có thể được xoá đi sử dụng clearParameters và thiết lập sử dụng những phương thức setInt, setString, … và câu truy vấn có thể được thực thi sử dụng những phương thức execute, executeUpdate, hay executeQuery như đối với Statement. II.4.3. Trích xuất dữ liệu: Sau khi nhận được kết quả trả về là tập ResultSet, gọi phương thức next() để đi đến từng mẩu tin và in ra kết quả của các cột. Dùng phương thức getString(column) để lấy dữ liệu của các cột (các cột được đánh số thứ tự từ 1). Nếu bạn không biết chính xác cấu trúc bảng của ResultSet, bạn có thể thu được nó trực tiếp thông qua đối tượng ResultSetMetaData. Một khi đã thu được ResultSet , bạn có thể từng bước thu được từng dòng của nó, cụ thể hơn là trường của từng dòng. Chú ý rằng số cột bắt đầu từ 1 chứ không phải 0 như trong mảng của Java. Tiện dụng hơn nữa là có phương thức getObject cho ResultSet để lấy đối số chuỗi chứa trong cột. Cũng có phương thức getxxx để lấy tên của cột thay vì số cột. II.4.4. Đóng kết nối: Một khi bạn làm việc với các đối tượng ResultSet, Connection, Statement thì dùng phương thức close() để giải phóng tất cả các liên kết đến các nguồn. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 41 III. Java Media Framework (JMF): III.1. Tổng quan: Java Media Framework (JMF) là một bộ thư viện lớn và linh hoạt của Sun được sử dụng để xử lý media dựa trên thời gian. Hình 3.2 – Tổng quan JMF Phiên bản hiện hành của JMF là 2.1. Phiên bản này cho phép bạn thực hiện mọi thao tác với media mà bạn có thể hình dung được. JMF có thể: ‰ Thực thi những tập tin media khác nhau trên Java applet hay ứng dụng độc lập. Những định dạng được cung cấp là AU, AVI, MIDI, MPEG, QuickTime, và WAV. ‰ Điều khiển media theo luồng từ Internet. ‰ Thu audio và video với micro và máy quay phim, sau đó lưu trữ dữ liệu theo chuẩn được cung cấp. ‰ Thực thi media dựa theo thời gian và thay đổi định dạng nội dung. ‰ Truyền audio và video theo thời gian thực trên Internet. ‰ Truyền radio trực tiếp hay những chương trình truyền hình. Tuy nhiên, trước khi bạn viết một ứng dụng JMF, bạn cần hiểu kĩ về kiến trúc JMF, những interface và class của nó. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 42 III.2. Kiến trúc JMF: Kiến trúc của JMF có thể được thể hiện theo những phần sau: ‰ Dữ liệu nguồn ‰ Thiết bị thu ‰ Máy chơi nhạc ‰ Processor ‰ DataSink ‰ Format ‰ Manager Hình 3.3 – Kiến trúc JMF III.2.1. Dữ liệu nguồn: Dữ liệu nguồn chứa các luồng media tương tự như một đĩa Compact Disk. Trong JMF, đối tượng DataSource đại diện cho audio media, video media, hay kết hợp của cả hai. DataSource có thể thu được từ nhiều nguồn khác nhau: những tập tin cục bộ, mạng, hay những chương trình Internet trực tiếp. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 43 III.2.1.1. Dữ liệu nguồn kéo: Trình khách khởi tạo việc truyền dữ liệu và điều khiển luồng dữ liệu từ nguồn. Ví dụ: HTTP và FILE là những phương thức được thiết lập cho dạng dữ liệu này. III.2.1.2. Dữ liệu nguồn đẩy: Trình chủ khởi tạo việc truyền dữ liệu và điều khiển luồng dữ liệu từ dữ liệu nguồn đẩy. Ví dụ dữ liệu nguồn đẩy bao gồm việc truyền media và video theo yêu cầu. Hình 3.4 – Dữ liệu nguồn JMF Như chúng ta đã đề cập ở trên, một số dữ liệu nguồn có thể được kết hợp thành một. Ví dụ, nếu bạn thu trực tiếp một cảnh, khả năng là bạn có hai nguồn dữ liệu là audio và video. Trong tình huống này, nhu cầu đặt ra là bạn cần kết hợp cả hai để dễ dàng cho việc điều khiển. III.2.2. Thiết bị thu: Thiết bị thu đại diện cho những thiết bị dùng để thu dữ liệu như micro, máy chụp hình hay máy quay phim. Dữ liệu media thu được có thể được chuyển cho đối tượng Player để trình diễn, thực thi, chuyển đổi kiểu dữ liệu, hay lưu trữ cho việc sử dụng sau này. Những thiết bị thu cũng có thể được phân loại thành nguồn kéo hay đẩy. Với nguồn kéo, người sử dụng điều khiển nó khi thu hình. Ví dụ máy chụp hình, người QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 44 dùng nhấn nút để chụp hình. Ngược lại, micro đóng vai trò như nguồn đẩy vì nó liên tục cung cấp luồng dữ liệu audio. III.2.3. Player: Player thực hiện công việc là nhập luồng dữ liệu audio hay video và trình diễn nó ra loa hay màn hình, tương tự như chương trình chơi đĩa nhạc: đọc đĩa nhạc và phát nhạc ra loa. Player cũng có những trạng thái tồn tại thông thường bởi vì Player phải tự chuẩn bị và chuẩn bị dữ liệu nguồn cho bản thân nó trước khi nó có thể bắt đầu thực thi media. Hình 3.5 – JMF Player Để hiểu điều này, bạn hãy cho đĩa nhạc vào máy nghe nhạc và chọn bài thứ tư trong đĩa nhạc. Điều gì xảy ra? Chương trình nghe nhạc không phát bài nhạc ngay lập tức. Đầu tiên nó phải tìm ra vị trí track nơi mà bài thứ tư bắt đầu và thực hiện một số bước chuẩn bị. Sau khoảng nửa giây (tuỳ thuộc vào chương trình chơi nhạc), bạn có thể nghe được bài nhạc. Bình thường, Player phải tiến hành theo từng bước, theo từng trạng thái cho đến khi đạt đến trạng thái cuối cùng. JMF xác định sáu trạng thái trong Player: III.2.3.1. Không nhận biết: Trong trường hợp này, đối tượng Player đã bị instantiate. Player bị instantiate không biết gì về media mới của nó. III.2.3.2. Nhận biết: Player chuyển từ trạng thái không nhận biết sang trạng thái nhận biết khi bạn gọi phương thức realize() của Player. Trong trạng thái nhận biết, Player xác định những yêu cầu về tài nguyên phục vụ cho việc xử lý. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 45 III.2.3.3. Đã nhận biết: Chuyển tiếp từ trạng thái nhận biết, Player chuyển sang trạng thái đã nhận biết. Trong trạng thái này Player biết tài nguyên nào nó cần và có thông tin về loại media để biểu diễn. Nó cũng có thể cung cấp những thành phần và điều khiển trực quan, cùng những kết nối của nó cho những đối tượng khác trong hệ thống. III.2.3.4. Tìm kiếm: Khi phương thức prefetch() được gọi, Player chuyển từ trạng thái đã nhận biết sang trạng thái tìm kiếm. Player ở trạng thái tìm kiếm chuẩn bị để trình diễn media. III.2.3.5. Đã tìm kiếm: Trạng thái khi Player đã chấm dứt tìm kiếm dữ liệu media và nó sẵn sàng bắt đầu. III.2.3.6. Bắt đầu: Trạng thái này đạt được khi bạn gọi phương thức start(). Player bây giờ đã sẵn sàng trình diễn dữ liệu media. Hình 3.6 – Sơ đồ trạng thái Player III.2.4. Processor: Processor là một dạng của player. Trong JMF API, interface Processor kế thừa từ Player. Như vậy, Processor chấp nhận những điều khiển trình bày như Player. Không QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 46 như Player, Processor điều khiển thông qua những thứ đang trình diễn trong luồng media. Hình 3.7 – Xử lý JMF Ngoài việc trình bày dữ liệu nguồn, Processor cũng có thể xuất dữ liệu media thông qua DataSource, vì vậy nó có thể được trình bày bởi một Player hay Processor khác, hay được chuyển đổi sang một vài định dạng khác. Bên cạnh sáu trạng thái Player đã nói trên, Processor bao gồm hai trạng thái bổ sung xảy ra trước khi Processor vào trạng thái nhận biết nhưng sau trạng thái không nhận biết: III.2.4.1. Định hình: Processor vào trạng thái định hình từ trạng thái không nhận biết khi phương thức configure() được gọi. Processor tồn tại trong trạng thái định hình khi nó kết nối vào DataSource, phức hợp lại luồng nhập, truy nhập thông tin định dạng của dữ liệu nhập. III.2.4.2. Đã định hình: Từ trạng thái định hình, Processor chuyển sang trạng thái đã định hình khi nó được kết nối vào DataSource và đã xác định được định dạng của dữ liệu. Tương tự như Player, Processor chuyển tiếp sang trạng thái đã nhận biết khi phương thức realize() được gọi. III.2.5. DataSink: DataSink là một interface chuẩn dành cho những đối tượng chứa nội dung media được chuyển tới bởi DataSource và nó có thể trình bày media theo một số mục tiêu. III.2.6. Format: QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 47 Đối tượng Format trình bày chính xác định dạng media của đối tượng. Bản thân định dạng không mang những đối số mã hóa xác định hay thông tin thời gian toàn cục, nó mô tả tên mã hóa của định dạng và loại dữ liệu định dạng yêu cầu. Lớp con Format bao gồm AudioFormat và VideoFormat. VideoFormat chứa sáu lớp con trực tiếp: Hình 3.8 – Các định dạng JMF ‰ H261Format ‰ H263Format ‰ IndexedColorFormat ‰ JPEGFormat ‰ RGBFormat ‰ YUVFormat III.2.7. Manager: Manager là một đối tượng trung gian được sử dụng giúp phối hợp để khởi tạo những đối tượng Player, Processor, DataSource và DataSink cho phép những ứng dụng quen thuộc của những interface JMF này được sử dụng một cách không ráp nối với JMF. Khi một trong những phương thức create() được gọi, Manager sử dụng cơ chế để xác định vị trí và khởi tạo đối tượng được yêu cầu. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 48 Hình 3.9 – JMF Manager Với Manager bạn có thể tạo Player từ DataSource. JMF cung cấp 4 manager: III.2.7.1. Manager: Sử dụng Manager để tạo ra Player, Processor, DataSource, và DataSink. Ví dụ, nếu bạn muốn trình diễn DataSource, bạn có thể sử dụng Manager để tạo ra Player. Manager này cung cấp bảo đảm của những gói chứa những lớp JMF, như Player thông thường, Processor, DataSource, và DataSink. III.2.7.2. CaptureDeviceManager: Manager này cung cấp bảo đảm của những thiết bị thu có sẵn. III.2.7.3. PlugInManager: Manager này cung cấp bảo đảm của những thành phần xử lý cắm JMF có sẵn. III.3. Các phương thức thực hiện: III.3.1. Tạo ra Player: QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 49 Với việc lập trình multimedia sử dụng JMF, một trong những công việc khó khăn nhất là tạo ra Player. Bạn tạo ra Player bằng cách gọi phương thức createPlayer() của Manager. Manager sử dụng URL của media hay MediaLocator mà bạn chỉ định để tạo ra Player thích hợp. Một khi bạn có Player, bạn có thể thu được những thành phần trực quan của đối tượng Player. Sau đó, bạn có thể thêm những thành phần trực quan này vào cửa sổ ứng dụng của bạn hay applet. Để trình bày thành phần trực quan của đối tượng Player, bạn phải: ‰ Thu được thành phần trực quan bằng cách gọi phương thức getVisualComponent() ‰ Thêm thành phần trực quan vào cửa sổ ứng dụng hay applet. Player cũng có thể bao gồm bảng điều khiển với những nút quen thuộc trong chương trình nghe nhạc như bắt đầu, kết thúc, và tạm dừng luồng media. Rất nhiều phương thức của Player chỉ có thể được gọi khi Player trong trạng thái đã nhận biết. Để bảo đảm rằng nó trong trạng thái này, bạn có thể sử dụng phương thức createRealizedPlayer() của đối tượng Manager để tạo ra Player. Phương thức này cung cấp một phương cách thuận tiện để tạo và nhận biết Player chỉ trong một bước. Khi phương thức này được gọi, nó sẽ chặn mọi thứ lại cho đến khi Player được nhận biết. III.3.2. Thu dữ liệu media Thu media là một công việc quan trọng khác trong lập trình JMF. Bạn có thể thu dữ liệu media sử dụng các thiết bị thu như micro hay máy quay phim. Sau đó nó có thể được xử lý và trình diễn, hay được lưu trữ theo định dạng media. Để thu dữ liệu, bạn cần phải: ‰ Xác định vị trí thiết bị thu bạn muốn sử dụng bằng cách sử dụng đối tượng CaptureDeviceManager ‰ Lấy được đối tượng CaptureDeviceInfo cho thiết bị ‰ Lấy MediaLocator từ đối tượng CaptureDeviceInfo và sử dụng nó để tạo ra DataSource ‰ Tạo ra một Player hay một Processor nữa sử dụng DataSource ‰ Bắt đầu Player hay Processor để tạo ra quá trình xử lý thu dữ liệu. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 1 Bạn sử dụng CaptureDeviceManager để truy cập vào những thiết bị thu tương thích trong hệ thống. Manager này đóng vai trò như một trung tâm bảo đảm cho tất cả những thiết bị thu tương thích với JMF. Bạn có thể lấy được danh sách những thiết bị tương thích bằng cách gọi phương thức getDeviceList(). Thiết bị thu được đại diện bởi đối tượng CaptureDeviceInfo. Bạn sử dụng phương thức getDevice() của CaptureDeviceManager để lấy CaptureDeviceInfo đối với thiết bị thu cụ thể. Sử dụng thiết bị thu để thu dữ liệu media, sau đó bạn cần lấy MediaLocator của thiết bị từ đối tượng CaptureDeviceInfo của nó. Bạn cũng có thể sử dụng MediaLocator để khởi tạo Player hay Processor trực tiếp, hay sử dụng MediaLocator để khởi tạo DataSource mà bạn có thể sử dụng như đầu vào cho Player hay Processor. Sử dụng phương thức start() của Player hay Processor để khởi động quá trình xử lý thu dữ liệu. I.1. Lấy hình ảnh từ webcam sử dụng JMF: Hình 3.10 – JMF API I.1.1. Giới thiệu: Bộ thư viện JMF được tạo ra tương thích với nhiều định dạng audio, video, và nhiều loại phương tiện truyền thông dựa theo thời gian, được sử dụng bởi những ứng dụng độc lập và applet được xây dựng theo kĩ thuật Java. Kể từ phiên bản 2.0, bộ thư viện JMF thêm vào khả năng thu, luồng, và chuyển đổi giữa rất nhiều định dạng. Phần này trình bày cách sử dụng JMF để lấy những hình ảnh từ một webcam. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 2 Do khả năng tương thích đối với phần cứng, phần ví dụ được xây dựng và chạy thử trong nền Microsoft Windows sử dụng Logitech USB Webcam. I.1.2. Tên thiết bị : Để sử dụng một thiết bị truyền thông cụ thể, đầu tiên bạn phải biết tên mà gói JMF chỉ đến thiết bị. Có hai cách tìm tên tương ứng, tuỳ thuộc vào ứng dụng mà bạn đang xây dựng. Cách dễ nhất là chạy chương trình JMStudio đi cùng với JMF API. Một khi chương trình thực thi, chọn Capture từ mục File. Khi đó, một cửa sổ sẽ hiện ra cho phép bạn có một số lựa chọn để xác định những thiết bị video và sound. Trong Microsoft Windows, tên thông thường cho webcam có dạng tương tự như vfw:Logitech USB Video Camera:0. Cách thứ hai để lấy thông tin này là bằng lập trình (cách này có thể tiện dụng hơn nếu bạn muốn người sử dụng ứng dụng chọn thiết bị sử dụng). Lớp CaptureDeviceManager trong thư viện JMF cho phép truy cập vào một danh sách những thiết bị thu tín hiệu tương thích trong hệ thống. Để lấy thông tin về một loại thiết bị cụ thể, truyền vào đối số cho phương thức getDeviceList() là một đối tượng định dạng. Ví dụ 1 trình bày đoạn mã sẽ in danh sách những thiết bị RGB video tương thích trong hệ thống. Ví dụ 1: public void printRGBDevices() { /* t•o ••i t••ng ••nh d•ng RGB m•c ••nh m•i (xem tài li•u JMF •• bi•t thêm nh•ng ••nh d•ng khác). */ RGBformat rgbFormat = new RGBFormat(); /* S• d•ng ••i t••ng Format •• l•y Vector nh•ng ••i t••ng CaptureDeviceInfo t• CaptureDeviceManager*/ Vector videoDevs = CaptureDeviceManager.getDeviceList(rgbFormat); /*Th•c hi•n vòng l•p trong k•t qu• và l•y k•t qu• ra cho ng••i dùng*/ for (int i = 0; i … Để sử dụng thiết bị bạn cần đối tượng CaptureDeviceInfo. Đối tượng này hoặc có thể được lấy ra từ danh sách thu được trong đoạn mã ví dụ hoặc thông qua phương thức getDeviceName() của CaptureDeviceManager nếu sử dụng tên thiết bị xác định. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 3 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 4 I.1.3. Lấy định dạng đúng: Hầu hết webcam tương thích với nhiều định dạng khác nhau; những thành phần như độ nét, màu, và mỗi giây có bao nhiêu frame có thể được điều chỉnh. Những định dạng tương thích với một thiết bị cụ thể có thể được xác định bằng cách sử dụng phương thức getFormats() của lớp CaptureDeviceInfo. Ví dụ 2 trình bày đoạn mã cho phép chọn định dạng. Ví dụ 2: /* Chúng ta xem xét ••nh d•ng 160x120 v•i 24 bit màu, RGB */ Dimension wantRes = new Dimension(160, 120); int wantDepth = 24; /* L•y nh•ng ••nh d•ng t••ng thích v•i thi•t b•. Th•c t• là ki•m tra getDevice có tr• v• null hay không*/ CaptureDeviceInfo device = CaptureDeviceManager.getDevice("webcam:0"); Format[] fmts = device.getFormats(); RGBFormat userFormat = null; I.1.4. Lấy DataSource: Để bắt lấy ảnh từ webcam, chúng ta cần lấy đối tượng PushBufferStream của JMF. Để thực hiện điều này, chúng ta lần lượt thực hiện các bước sau. Đầu tiên, chúng ta cần đối tượng MediaLocator mô tả vị trí của nội dung truyền thông. Sau đó chúng ta sử dụng đối tượng này để tạo ra DataSource sử dụng phương thức createDataSource() của lớp Manager. Lớp Manager là dạng truy cập thông thường của JMF để lấy những tài nguyên lệ thuộc vào hệ thống. Trước khi chúng ta có thể sử dụng DataSource, chúng ta phải chắc chắn rằng nó sẽ cung cấp thông tin theo định dạng chúng ta cần. Ví dụ 3 trình bày một phần mã để tạo ra DataSource được thiết lập cho một định dạng cụ thể. Ví dụ 3: MediaLocator loc = device.getLocator(); DataSource formattedSource = null; try { formattedSource = Manager.createDataSource(loc); } catch (IOException ioe) { System.out.println("L•i IO khi t•o dataSource"); System.exit(1); } catch (NoDataSourceException ndse) { QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 5 System.out.println("Không t•o •••c dataSource"); System.exit(1); } /* Thi•t l•p ••nh d•ng khá ph•c t•p. ••u tiên, chúng ta c•n l•y nh•ng •i•u khi•n ••nh d•ng t• dataSource chúng ta m•i t•o ra. •• làm •i•u này, chúng ta c•n tham kh•o ••i t••ng •ng d•ng interface CaptureDevice */ if (!(formattedSource instanceof CaptureDevice)) { System.out.println("DataSource không là CaptureDevice"); System.exit(1); } FormatControl[] fmtControls = ((CaptureDevice)formattedSource).getFormatControls(); if (fmtControls == null || fmtControls.length == 0) { System.out.println("Không có FormatControl t••ng thích"); System.exit(1); } Format setFormat = null; /* Ti•p theo chúng ta th•c hi•n vòng l•p trong nh•ng FormatControl t••ng thích và th• thi•t l•p ••nh d•ng cho m•t cái mà chúng ta mu•n. */ I.1.5. Lấy Processor Hiện tại, chúng ta đã có đối tượng DataSource có thể sử dụng. Tuy nhiên, chúng ta chưa làm được gì cả. JMF API cho phép chúng ta sử dụng DataSource này hoặc là trình diễn truyền thông (thông qua player) hay dùng thông tin (thông qua processor). Một lần nữa, chúng ta sử dụng Manager để tạo ra đối tượng processor, truyền DataSource của chúng ta như là một đối số. Trước khi chúng ta có thể sử dụng processor này, nó phải ở trong trạng thái có thể được thi hành. Ví dụ 4: Object stateLock = new Object(); // Ph•i là bi•n toàn c•c Processor deviceProc = null; try { deviceProc = Manager.createProcessor(formattedSource); } catch (IOException ioe) { System.out.println("Không th• l•y processor cho thi•t b•: " + ioe.getMessage()); System.exit(1); } catch (NoProcessorException npe) { System.out.println("Không th• l•y processor cho thi•t b•: " + QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 6 npe.getMessage()); System.exit(1); } deviceProc.addControllerListener(this); deviceProc.realize(); while (deviceProc.getState() != Controller.Realized) { synchronized (stateLock) { try { stateLock.wait(); } catch (InterruptedException ie) { System.out.println("Thi•t b• không th• chuy•n sang tr•ng thái •ã nh•n bi•t"); System.exit(1); } } } deviceProc.start(); Ví dụ 5: /* Interface ControllerListener ch• ch•a duy nh•t m•t ph••ng th•c, controllerUpdate*/ public void controllerUpdate(ControllerEvent ce) { if (ce instanceof RealizeCompleteEvent) { System.out.println("Hoàn t•t vi•c chuy•n ••i"); synchronized (stateLock) { stateLock.notifyAll(); } } } QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 7 I.1.6. PushBufferStream: Bây giờ processor đã thực thi, chúng ta có thể truy cập vào PushBufferDataSource để sau đó có thể cung cấp cho chúng ta PushBufferStream. PushBufferDataSource là một dạng đặc biệt của DataSource, nó quản lý dữ liệu theo dạng những luồng đưa vào thông qua những đối tượng buffer. PushBufferStream cung cấp một cách truy cập buffer thông qua luồng. Trong trường hợp này, mỗi buffer đại diện cho một frame từ webcam. Ví dụ 6 trình diễn đoạn mã đầy đủ hàm tạo của PushBufferStream. Ví dụ 6: private PushBufferStream camStream; // Bi•n toàn c•c private BufferToImage converter; // Bi•n toàn c•c PushBufferDataSource source = null; try { source = (PushBufferDataSource)deviceProc.getDataOutput(); } catch (NotRealizedError nre) { /* Có th• ch•ng bao gi• x•y ra */ throw new VisionJMFException("L•i bên trong: processor không nh•n bi•t"); } PushBufferStream[] streams = source.getStreams(); I.1.7. Lấy Image: Từ những Buffer đại diện cho những frame từ webcam, chúng ta cũng có thể tạo ra đối tượng BufferToImage cho phép chúng ta chuyển đổi những buffer này sang ảnh AWT để sử dụng hay trình diễn. Ví dụ 7 trình bày phương thức có thể được sử dụng để chuyển đối tượng Image cho ứng dụng. Ví dụ 7: /* L•y •nh t• máy ch•p hình */ public Image getImage() { Buffer b = new Buffer(); try { camStream.read(b); } catch (IOException ioe) { QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 8 System.out.println("Không th• l•y frame t• camera"); return null; } Image i = converter.createImage(b); return i; } I.2. Chương trình đầy đủ minh họa việc lấy ảnh từ camera: import java.io.*; import java.util.*; import java.awt.*; import java.awt.image.*; import javax.imageio.*; import javax.media.*; import javax.media.control.*; import javax.media.format.*; import javax.media.util.*; public class FrameGrab { public static void main(String[] args) throws Exception { // Tạo thiết bị thu CaptureDeviceInfo deviceInfo = CaptureDeviceManager.getDevice("vfw:Microsoft WDM Image Capture (Win32):1"); Player player = Manager.createRealizedPlayer(deviceInfo.getLocator()); player.start(); // Dừng vài giây để máy chụp hình khởi tạo Thread.sleep(2500); // Bắt lấy frame từ webcam FrameGrabbingControl frameGrabber = (FrameGrabbingControl)player.getControl("javax.media.control.FrameGrabbingControl"); Buffer buf = frameGrabber.grabFrame(); // Chuyển đổi frame sang ảnh ở dạng buffer để có thể xử lý hay lưu trữ Image img = (new BufferToImage((VideoFormat)buf.getFormat()).createImage(buf)); QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 9 BufferedImage buffImg = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB); Graphics2D g = buffImg.createGraphics(); g.drawImage(img, null, null); // Lưu ảnh dưới dạng JPG ImageIO.write(buffImg, "jpg", new File("c:\\webcam.jpg")); // Kết thúc sử dụng webcam player.close(); player.deallocate(); System.exit(0); } } QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 10 CHƯƠNG 4 – CÀI ĐẶT, ĐÁNH GIÁ VÀ HƯỚNG PHÁT TRIỂN QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 11 I. Cài đặt: Đầu tiên chúng ta cần phải cài đặt hệ quản trị cơ sở dữ liệu MS SQL Server 2000, Webserver Apache Tomcat 5.0.25, JMF 2.1.1e. ( Xin tham khảo ở phần Phụ lục ) ‰ MS SQL Server 2000 là một bước nhảy vọt về hệ quản trị cơ sở dữ liệu đa người dùng của Microsoft, nhằm phục vụ cho những nhà phát triển hệ thống cơ sở dữ liệu. Một trong những ưu điểm của SQL Server là tốc độ nhanh, ổn định, hỗ trợ rất mạnh tiếng Việt theo chuẩn Unicode. ‰ TomCat là trình chủ Web server có khả năng diễn dịch JSP và servlet. TomCat miễn phí có mã nguồn mở nên được rất nhiều lập trình viên sử dụng. Ngoài ra Tomcat còn hỗ trợ Connnection Pool rất tốt. Để sử dụng file .war trong TomCat, đơn giản, bạn chỉ cần thực hiện lệnh copy cứng, chép file .war vào thư mục webapps của TomCat. ‰ JMF ( Java Media Framework ) của Sun Microsystem. Sau đó ta sẽ lần lượt cài đặt các module của hệ thống tương ứng với các file *.exe QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 12 I.1. Tại sao cần cài đặt cơ chế chia sẻ kết nối (Connnection Pool): Nhu cầu về kết nối đến cơ sở dữ liệu trung tâm để truy vấn dữ liệu trong các ứng dụng Web ngày càng tăng. Về mặt kỹ thuật, các hệ cơ sở dữ liệu phải tiêu tốn rất nhiều tài nguyên để duy trì liên tục kết nối trong quá trình truy vấn. Vì lý do này, bạn chỉ nên mở kết nối truy vấn đến cơ sở dữ liệu chỉ khi nào thật sự cần thiết. Một khi đã hoàn tất thao tác truy xuất, bạn phải trả lại kết nối cho những người dùng khác truy cập. Mặc dầu vậy, mỗi một kết nối đến cơ sở dữ liệu đều đòi hỏi phải có thời gian thiết lập, phân bổ tài nguyên ... Các trình chủ Web server đưa ra khái niệm chia sẻ kết nối (connection share pool) cho phép các yêu cầu về kết nối đến cơ sở dữ liệu chỉ được mở một lần và dùng chung bởi các trang JSP hay servlet với nhau. Ví dụ, các yêu cầu về truy vấn dữ liệu thường chỉ diễn ra trong thời gian ngắn, những trang JSP hay servlet trước khi truy xuất dữ liệu sẽ yêu cầu hệ thống cung cấp kết nối, hệ thống của ta sẽ kiểm tra xem kết nối đã tồn tại hay chưa. Nếu chưa, hệ thống sẽ tạo kết nối cung cấp cho trang JSP sử dụng. Trang JSP sau khi sử dụng xong không đóng kết nối mà trả lại kết nối cho hệ thống. Hệ thống lưu đối tượng kết nối trở lại ngăn xếp hoặc hàng đợi. Trong lời triệu gọi trang JSP ở phiên làm việc khác, nếu cần đến truy xuất cơ sở dữ liệu hệ thống sẽ cung cấp kết nối đã có trước đó mà không cần sử dụng lại tài nguyên của hệ thống để tạo lại kết nối. Ở đây, sự thuận tiện là bạn không cần quan tâm đến việc trả lại kết nối cho pool. Web server sẽ tự động thu hồi kết nối trả về cho pool hộ bạn một khi trang JSP hay servlet của bạn không sử dụng đến kết nối nữa. Khi website của bạn phát triển với số lượng người truy cập lớn, cơ chế chia sẻ kết nối (share pool) này sẽ làm tăng tốc đáng kể việc truy xuất và bảo đảm nguồn tài nguyên hạn hẹp của trình chủ không bị tiêu hao nhiều. I.2. Tại sao lại sử dụng JMF: Hiện nay, có rất nhiều công cụ tương thích với Java cho phép thực hiện lấy ảnh về từ camera. Các công cụ này khá mạnh, cho phép lập trình viên có thể dễ dàng thực hiện những công việc tương tác với camera. Tuy nhiên, vấn đề được đặt ra ở đây là QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 13 hầu hết những bộ thư viện này đều để bán hoặc cho dùng thử trong một khoảng thời gian nhất định. Trong khi đó, bộ thư viện JMF do Sun được tạo ra tuy khó sử dụng hơn, nhưng nó cũng khá mạnh, và quan trọng hơn cả là việc JMF được tạo ra không vì mục đích lợi nhuận. Những người lập trình Java chắc hẳn cũng thích làm việc với JMF hơn vì không những nó có thể lấy ảnh từ camera mà nó còn có thể làm nhiều thứ hơn thế nữa như: làm phần mềm chơi nhạc như Windows Media Player, xem phim, … Rất tiện dụng, trong khi những bộ thư viện khác vừa tốn tiền, vừa chỉ sử dụng được trong một việc duy nhất. Tóm lại, sử dụng JMF là kinh tế và hợp lý hơn cả. Ta dùng JMStudio được đính kèm khi cài đặt JMF để xem giới thiệu những tính năng của JMF. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 14 I.3. Hình ảnh các module của hệ thống Trang chủ của ứng dụng Web: Sinh viên chọn vào mục “Sinh viên - Đăng kí” trên danh sách các mục chọn để tiến hành đăng kí. Mục chọn này sẽ mở ra một trang Web cho phép sinh viên nhập vào các thông tin cá nhân QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 15 Sinh viên sử dụng mục “Sinh viên - Đăng nhập” để chỉnh sửa thông tin cá nhân trước khi chụp hình làm thẻ, xem thời gian sử dụng còn lại trong học kì và trong tuần Phần “Thủ thư - Đăng nhập” trên trang chủ cho phép thủ thư đăng nhập vào hệ thống thực hiện các thao tác quản trị của mình QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 16 Sau khi đã đăng nhập, thủ thư sẽ vào được trang chủ dành riêng cho riêng. Từ đây thủ thư có thể thực hiện các thao tác quản trị của mình bằng cách click vào các hyperlink tương ứng Hẹn ngày chụp hình cho sinh viên QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 17 Xem danh sách những ngày đã hẹn sinh viên chụp hình Thêm tên lớp mới Có thể chọn vào đây để sửa thông tin của những ngày hẹn QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 18 Xem danh sách các lớp Tìm kiếm sinh viên theo MSSV, sau đó thủ thư có thể sửa thông tin của sinh viên hoặc xóa sinh viên khỏi CSDL Có thể chọn vào đây để xem và xóa thông tin của một lớp QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 19 Xem danh sách sinh viên Quy định thời gian sử dụng phòng máy trong tuần và trong học kì QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 20 Cấp thời gian sử dụng phòng máy cho sinh viên sau một học kì Ứng dụng tạo thẻ phòng máy cho phép thủ thư thực hiện việc chụp hình và in thẻ thư viện cho sinh viên Thẻ trước Thẻ sau Chụp hình QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 21 Ứng dụng tạo thẻ chụp hình cho sinh viên sau khi nghe thủ thư hướng dẫn sử dụng thư viện Ứng dụng quản lý phòng máy cho phép thủ thư theo dõi thời gian sử dụng của sinh viên, bằng cách quét mã vạch khi sinh viên bắt đầu và kết thúc sử dụng Cho phép thủ thư điều chỉnh các máy hư trong phòng máy QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 1 I. Đánh giá: I.1. Tự đánh giá: • Ưu điểm: o Chương trình được xây dựng đáp ứng đúng theo yêu cầu của Thư viện. o Bản thân chương trình đã được vận hành thử tại Thư viện và thu được kết quả cao. o Giao diện thân thiện, dễ dùng. o Đã xây dựng được bộ cài đặt, cho phép việc cài đặt và sử dụng một cách dể dàng. • Khuyết điểm: o Do thiếu thiết bị nên chỉ thực hiện tạo thẻ dùng mã vạch một chiều, chưa có cơ hội tiếp xúc trực tiếp với mã vạch hai chiều. o Do thời gian hạn hẹp nên chưa thực hiện được phần hướng dẫn sử dụng dành cho người dùng. I.2. Thư viện đánh giá: QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 2 II. Hướng phát triển: Nếu được tiếp tục phát triển, chương trình có thể được tiếp tục xây dựng sử dụng những công nghệ mới trong mã hoá dữ liệu như mã vạch hai chiều, thẻ từ, … Từ những kiến thức cơ bản trong việc tương tác với thiết phần cứng, sẽ tiếp tục xây dựng những công cụ tăng khả năng tự động trong quản lý như sử dụng tia hồng ngoại để quản lý sinh viên ra vào phòng máy… Tiếp tục phát triển để nâng cao khả năng quản lý, khả năng tự động hóa của phòng máy trong việc quản lý từng máy, khả năng can thiệp vào từng máy. Khả năng can thiệp sâu vào từng máy bao gồm những chức năng sau: tự động mở và tắt máy tính khi sinh viên bắt đầu và kết thúc sử dụng máy; lấy địa chỉ URL của từng máy, qua đó cho phép thủ thư có thể quản lý nội dung truy cập internet của sinh viên, … QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 3 PHỤ LỤC QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 4 I. Cài đặt hệ quản trị CSDL: MS SQL Server 2000 Hình 5.1 Hình 5.2 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 5 Hình 5.3 Hình 5.4 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 6 Hình 5.5 Hình 5.6 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 7 Hình 5.7 Hình 5.8 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 8 Hình 5.9 Hình 5.10 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 9 Hình 5.11 Hình 5.12 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 10 Sau khi cài đặt xong chạy Enterprise Manager tạo database tên là lvtn, mở SQL Service Manager stop tạm dừng SQL Server. Copy 2 file: lvtn_Log.LDF và lvtn_Data.MDF vào thư mục C:\Program Files\Microsoft SQL Server\MSSQL\Data. Cuối cùng mở lại SQL Service Manager và start SQL Server. II. Cài đặt Webserver : Apache Tomcat 5.0.25 Hình 5.13 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 11 Hình 5.14 Hình 5.15 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 1 Hình 5.16 Hình 5.17 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 2 Hình 5.18 Sau khi cài đặt xong Apache Tomcat, mở trình duyệt và gõ vào ô Address nhập username và password của admin để đăng nhập. Sau đó đăng ký JNDI name cho Datasource lvtn, yêu cầu Webserver tạo một Connection Pool cho ứng dụng web của ta. Cuối cùng copy thư mục lvtn1 vào thư mục CATALINA_HOME\webapps\ và restart Tomcat. QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 3 Hình 5.19 Hình 5.20 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 4 Hình 5.21 I. Cài đặt JMF : Java Media Framework Hình 5.22 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 5 Hình 5.23 Hình 5.24 QUẢN LÝ PHÒNG MÁY THƯ VIỆN BẰNG Mà VẠCH SVTH : Âu Dương Đạt – Lê Thành Nguyên Trang 6 TÀI LIỆU THAM KHẢO Trong quá trình thực hiện luận văn chúng em đã tham khảo một số tài liệu sau: [1] Hoàng Ngọc Giao. Lập trình Java như thế nào? NXB Thống kê-Hà Nội, 1998 [2] Nguyễn Phương Lan, Hoàng Đức Hải. Lập trình ứng dụng Web với JSP/Servlet NXB Giáo dục, 2001 [3] java.sun.com/jmf [4] jakarta.apache.org/tomcat [5] www.idautomation.com [6] Báo Sài gòn Tiếp thị số ra ngày 31/7/2003

Các file đính kèm theo tài liệu này:

  • pdflv3_0244.pdf