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.
137 trang |
Chia sẻ: lylyngoc | Lượt xem: 2732 | Lượt tải: 1
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:
- lv3_0244.pdf