Tóm tắt: Tổ hợp của Eclipse, DB2® Express-C 9.5, và WebSphere® Application
Server Community Edition 2.0 — tất cả đều miễn phí để tải về, sử dụng và triển
khai — là một bộ sản phẩm từ bản mẫu đến sản xuất tuyệt vời cho mọi nhu cầu
phát triển Java™ và Java doanh nghiệp của bạn. Một điều có thể chưa hiển nhiên
lắm là bạn còn có thể sử dụng khá dễ dàng các công cụ đã qua kiểm chứng này để
tạo ra, thử nghiệm, và triển khai các ứng dụng hàng đầu gọn nhẹ. Hướng dẫn này
chỉ dẫn cho bạn đi qua các bước phát triển một ứng dụng quản lý nguồn nhân lực
nhỏ, trước tiên bằng cách sử dụng công nghệ dựa trên JavaServer Pages (JSP)
truyền thống và sau đó di chuyển nó đến một giải pháp tương tác cao là sử dụng
Ajax.
74 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 1998 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Khởi đầu các ứng dụng Java của bạn - Phần 2: Phát triển Ajax gọn nhẹ, dễ dàng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hị trong Hình 2, bạn sẽ thêm vào hoặc sửa đổi
các thành phần ứng dụng Web trong bảng 1:
Bảng 1. Các thành phần của ứng dụng Web về thông tin nhân viên
Thành phần Mô tả
employee.jsp
Một trang JSP không có kịch bản lệnh (không nhúng mã Java).
Nó xử lý tương tác của người dùng và sử dụng các thẻ JSTL
SQL để truy vấn các thông tin của cơ sở dữ liệu DB2. Bạn nên
thêm thành phần này.
ShowPhoto.java
servlet
Một Java servlet để truy vấn cơ sở dữ liệu DB2 tìm thông tin ảnh
nhân viên. Các ảnh nhân viên được lưu trữ theo nhiều định dạng
trong cơ sở dữ liệu, trong các trường BLOB. Ở đây chỉ có các
định dạng ảnh GIF được sử dụng. Servlet này viết kết quả đầu ra
của nó theo một định dạng luồng tương thích với kiểu MIME,
đúng yêu cầu của phần tử hiển thị của trình duyệt . Việc
truy cập cơ sở dữ liệu được thực hiện thông qua một nguồn dữ
liệu hệ thống, nhận được qua giao diện thư mục và đặt tên của
Java (Java Naming and Directory Interface - JNDI) và được hỗ
trợ bởi pool cơ sở dữ liệu toàn hệ thống đã cấu hình trên Máy
chủ ứng dụng trong bài Khởi đầu các ứng dụng Java của bạn:
Phần mềm miễn phí, phát triển nhanh chóng. Bạn nên thêm
thành phần này.
dwstyles.css Bạn sẽ sửa đổi phiếu định kiểu (stylesheet) này để xử lý định dạng bổ sung cho trang employee.jsp mới.
Làm thế nào để cho các thành phần ứng dụng phù hợp với nhau
Hình 3 cho thấy cách các thành phần ứng dụng phù hợp với nhau như thế nào:
Hình 3. Cấu trúc của ứng dụng thông tin - nhân viên
Thành phần employee.jsp sinh ra trang web có chứa giao diện người dùng. Trang
web đã tạo ra này được trình bày trên trình duyệt của người dùng. Người sử dụng
tương tác với trang đã trình bày để truy vấn thông tin nhân viên bằng cách đệ trình
một biểu mẫu (form) HTML. JSP xử lý dữ liệu biểu mẫu đã đệ trình và tìm thông
tin nhân viên từ cơ sở dữ liệu. JSP sau đó tạo ra và trả về một trang web chứa các
thông tin ấy. Ảnh nhân viên dưới định dạng GIF được tạo ra riêng biệt, do
ShowPhoto servlet thực hiện. Servlet này nhận các dữ liệu hình ảnh từ cùng một
cơ sở dữ liệu DB2 Express-C 9.5.
Sử dụng bộ khởi đầu các ứng dụng Java của bạn để mã hoá, thử nghiệm và triển
khai các ứng dụng
Hình 4 cho thấy bộ khởi đầu trợ giúp tạo ra ứng dụng này như thế nào:
Hình 4. Phát triển ứng dụng bằng các công cụ miễn phí
Bạn sẽ viết mã cho ứng dụng trong Eclipse và sử dụng một cá thể của Máy chủ
ứng dụng do Eclipse điều khiển để triển khai và thử nghiệm ứng dụng đó.
Thành phần JSP của ứng dụng truy cập vào cơ sở dữ liệu mẫu của DB2 Express-C
9.5 thông qua một pool JDBC do Máy chủ ứng dụng quản lý. Thành phần servlet
của ứng dụng cũng sử dụng cùng pool được quản lý ấy để truy cập vào các trường
BLOB từ cơ sở dữ liệu, chuyển đổi chúng thành thông tin đồ họa để hiển thị như
là các ảnh của nhân viên trong trình duyệt.
JSP lựa chọn nhân viên
Bắt đầu từ dự án dwapp trong Eclipse như thấy trong Hình 2, nhấn chuột phải vào
thư mục WebContent trong khung nhìn Navigator và chọn New > Other... (hoặc
ấn Ctrl+N). Chọn Web > JSP từ thủ thuật New, như hiển thị trong Hình 5:
Hình 5. Tạo ra một JSP mới, sử dụng thủ thuật New của Eclipse
Nhấn Next và sau đó nhập tên của JSP mới là employee.jsp. Nhấn vào Finish để
hoàn thành việc tạo ra mẫu JSP ban đầu.
Bây giờ, biên tập JSP đã tạo ra bằng cách thêm đoạn mã được in đậm như hiển thị
trong Listing 1:
Listing 1. Thành phần employee.jsp để xử lý các tương tác giao diện người sử
dụng
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
dW Example Employee Information from DB2 Express C Table
DB2 Employee Information
SELECT * FROM EMPLOYEE ORDER BY LASTNAME
${employee.lastname},
${employee.firstnme}
SELECT * FROM EMPLOYEE WHERE EMPNO='${param.empno}'
${employee.lastname}, ${employee.firstnme}
Employee
number:${employee.empno}
Position:${employee.job}
Hired:${employee.hiredate}
Department:${employee.workdept}
Phone number:${employee.phoneno}
Salary:$${employee.salary}
Bonus:${employee.bonus}
Tuân theo cách làm JSP tốt nhất, employee.jsp không chứa mã Java nhúng; việc
tạo ra tất cả mã động được xử lý qua JSTL và Expression Language (EL).
employee.jsp hoạt động như thế nào
Hình 1 chỉ ra cách bố trí của employee.jsp. Một danh sách thả xuống — một phần
tử HTML — duy trì danh sách các tên nhân viên.
Người sử dụng chọn bất kỳ một trong những nhân viên từ danh sách và nhấn vào
nút find employee. Thông tin chi tiết về nhân viên được chọn sau đó sẽ hiển thị,
cùng với một bức ảnh của nhân viên đó nếu có. (Không phải tất cả các nhân viên
đều có sẵn một ảnh trong cơ sở dữ liệu DB2 mẫu).
Trong employee.jsp, sử dụng mã JSTL trong Listing 2 để tạo ra danh sách thả
xuống:
Listing 2. Tạo ra các tên nhân viên động để lựa chọn
SELECT * FROM EMPLOYEE ORDER BY LASTNAME
${employee.lastname},
${employee.firstnme}
Bạn sử dụng thẻ JSTL SQL để thực hiện một truy vấn lựa chọn tất cả
các bản ghi nhân viên từ cơ sở dữ liệu DB2. Điều này tương tự như truy vấn đã
được bạn sử dụng trong ví dụ Khởi đầu các ứng dụng Java của bạn: Phần mềm
miễn phí, phát triển nhanh chóng. Lần này, thông tin nhân viên được trả về theo
tên họ được sắp xếp theo thứ tự chữ cái abc (nhờ mệnh đề ORDER BY
LASTNAME trong truy vấn SQL) để làm cho việc lựa chọn các tên từ danh sách
thả xuống dễ dàng hơn.
Bạn thực hiện truy vấn SQL đối với jdbc/DataSource Việc này được cấu hình
trong kế hoạch triển khai geronimo-web.xml của ứng dụng và trỏ tới pool cơ sở dữ
liệu toàn hệ thống có tên là dwDatasource, đã được cấu hình trên Máy chủ ứng
dụng.
Sau đó, bạn sử dụng thẻ vòng lặp để lặp theo danh sách các nhân viên
được chọn mỗi lần một hàng. Một thẻ HTML được tạo ra cho mỗi nhân
viên. Giá trị của là một số nhân viên và văn bản được hiển thị là họ và
tên của nhân viên. Ví dụ, được tạo ra cho Bruce Adamson là:
ADAMSON, BRUCE
Toàn bộ phần tử tồn tại bên trong một thẻ HTML bao quanh, như
hiển thị bằng chữ đậm trong Listing 3:
Listing 3. Danh sách bên trong phần tử
...
...
Thẻ tạo ra liên kết URL tạo ra một URL có định dạng đúng cho bạn, trỏ
ngược lại tới chính employee.jsp này để xử lý biểu mẫu. URL này được đặt trong
một biến gọi là empURL và được sử dụng trong thuộc tính hành động của thẻ
.
Khi người sử dụng lựa chọn một nhân viên — ví dụ, Bruce Adamson
(empno=000150) — và nhấn vào nút find employee, thông tin biểu mẫu này được
đệ trình ngược lại tới employee.jsp để xử lý bằng URL này:
Xử lý đệ trình biểu mẫu HTML
Trang employee.jsp có hai vai trò:
Để hiển thị danh sách các nhân viên để lựa chọn
Để xử lý việc đệ trình biểu mẫu sau khi một nhân viên được chọn
Để xác định xem việc đệ trình biểu mẫu đã được thực hiện chưa, bạn cần phải
kiểm tra xem có tồn tại một tham số empno HTTP GET không. Bạn có thể sử
dụng toán tử empty trong JSTL cho việc kiểm tra này. Mã lệnh để trình bày thông
tin và ảnh nhân viên được bao trong dấu ngoặc bằng một thẻ để thực hiện
phép kiểm tra này. Đoạn mã này được hiển thị trong Listing 4:
Kiểm tra sự tồn tại của tham số biểu mẫu empno
SELECT * FROM EMPLOYEE WHERE EMPNO='${param.empno}'
...
Nếu yêu cầu HTTP đầu vào không có tham số empno, thì không có thông tin chi
tiết nhân viên nào được tạo ra.
Để tạo thông tin chi tiết nhân viên, một khác được thực hiện đối với
bảng EMPLOYEE (nhân viên). Lệnh SELECT này bây giờ xác định chính xác
một nhân viên có số hiệu nhân viên tương ứng. Đối tượng ẩn JSTL, param, được
sử dụng để trình bày giá trị tham số empno đầu vào trong lệnh SELECT như thấy
trong Listing 5:
Listing 5. Nhận được bản ghi của một nhân viên khi sử dụng một truy vấn
SQL được tạo ra động
SELECT * FROM EMPLOYEE WHERE EMPNO='${param.empno}'
...
Mặc dù một cấu trúc được sử dụng ở đây, bạn đang làm việc với chỉ
một hàng (vì mỗi nhân viên chỉ có một số nhân viên duy nhất). Cấu trúc JSTL này
làm đơn giản hoá việc truy cập vào dữ liệu hàng trong tập kết quả được trả về. Để
tạo ra thông tin văn bản, biến employee thiết lập bằng có thể được sử
dụng trực tiếp. Ví dụ, biểu thức EL sau đây tạo ra số điện thoại của nhân viên
trong cấu trúc :
${employee.phoneno}
Để tạo ra ảnh nhân viên, bạn sử dụng một thẻ HTML Sử dụng thẻ JSTL
tạo ra URL hiển thị hình ảnh này:
Ví dụ, thẻ được tạo ra có hiệu lực cho Bruce Adamson (có empno là
00150) là:
Điều này có nghĩa là URL sau phải tạo ra một luồng bit để biểu diễn ảnh của nhân
viên:
servlet ShowPhoto.java tạo ra luồng bit của ảnh.
Hiển thị ảnh từ các trường BLOB DB2
Các bức ảnh nhân viên được lưu trữ trong bảng EMP_PHOTO của cơ sở dữ liệu
mẫu DB2. Bảng 2 mô tả các trường của bảng này:
Bảng 2. Các trường của bảng EMP_PHOTO
Tên trường Mô tả
empno Số hiệu nhân viên của nhân viên tương ứng.
photo_format Định dạng của ảnh. Các ảnh được lưu trữ theo nhiều định dạng để giúp cho việc hiển thị hình ảnh dễ dàng hơn mà không cần mã
chuyển đổi phức tạp. Ứng dụng này chỉ sử dụng cho các ảnh có định
dạng GIF.
picture Các bit nhị phân của hình ảnh, được lưu giữ trong một trường
BLOB. Kích thước lớn nhất của trường này là 102.400 byte.
Để tạo servlet ShowPhoto.java trong IDE Eclipse, đầu tiên hãy điểm sáng
WebContent và chọn New > Other... (hoặc ấn Ctrl+N). Chọn Web > Servlet
trong trình thủ thuật New. Nhập com.ibm.dw làm tên gói Java Package và
ShowPhoto làm tên lớp, như được hiển thị trong Hình 6:
Hình 6. Tạo một servlet mới bằng trình thủ thuật Create Servlet của WTP
Eclipse
Nhấn Next. Trên màn hình kế tiếp, bạn có thể thiết lập phép ánh xạ URL cho
servlet. Phép ánh xạ URL này sẽ được đặt tự động vào trong bộ mô tả triển khai
web.xml của ứng dụng dưới dạng một phần tử . Trong trường
hợp này, bạn có thể giữ nguyên phép ánh xạ mặc định tới /ShowPhoto. Nhấn vào
Finish.
Nếu bạn nhìn vào khung nhìn Navigator, bạn sẽ thấy tệp tin
com.ibm.dw.ShowPhoto.java trong thư mục src, bên ngoài thư mục WebContent.
WTP Eclipse giữ mã nguồn ở đây để dễ dàng bảo trì và tổ chức, nhưng sao chép
các tệp tin lớp được biên dịch vào đúng vị trí trong thư mục WEB-INF/classes để
triển khai ứng dụng Web tự động.
Các bước mà bạn vừa thực hiện xong tạo ra một khung sườn servlet trong
ShowPhoto.java. Bây giờ hãy sửa đổi mã nguồn bằng cách thêm các dòng chữ
đậm như hiển thị trong Listing 6:
Listing 6. Mã lệnh bổ sung thêm cho servlet ShowPhoto.java
package com.ibm.dw;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
/**
* Servlet implementation class for Servlet: ShowPhoto
*
*/
public class ShowPhoto extends javax.servlet.http.HttpServlet
implements javax.servlet.Servlet {
public ShowPhoto() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
String query = "select picture from emp_photo where
photo_format='gif' and empno='"
+ request.getParameter("empno") + "'";
DataSource dsource = null;
Statement stmt= null;
Connection conn =null;
ResultSet rset = null;
try {
InitialContext context = new InitialContext();
dsource =
(DataSource)context.lookup("java:comp/env/jdbc/DataSource");
conn = dsource.getConnection();
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if (rset.next()) {
byte[] buffer = new byte[32000];
int size=0;
InputStream istream;
istream = rset.getBinaryStream(1);
response.reset();
response.setContentType("image/gif");
while((size= istream.read(buffer))!= -1 ) {
response.getOutputStream().write(buffer,0,size);
}
response.flushBuffer();
istream.close();
}
} catch(NamingException e) {
} catch(SQLException e) {
}
finally {
try {
if (rset != null)
rset.close();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
} catch (SQLException ex ) {}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Sử dụng trình tổ chức nhập khẩu (import) tự động của Eclipse
Bạn có thể cắt và dán từ mã nguồn của hướng dẫn này (xem Tải về) nếu bạn
muốn. Hoặc, nếu bạn đang nhập mã lệnh vào bằng tay, bạn không cần phải gõ
phím cả danh sách lệnh nhập khẩu (import) lớn như trên. Eclipse có thể tìm kiếm
tất cả các thư viện dự án có sẵn để tìm các ký hiệu nhập khẩu của bạn. Nhấn chuột
phải vào trong trình soạn thảo mã và chọn Source > Organize Imports (hoặc ấn
Ctrl+Shift+O). Thao tác này sẽ quét mã nguồn của bạn, tìm tất cả các ký hiệu
nhập khẩu vào chưa được phân giải và bổ sung thêm tất cả các lệnh import cần
thiết vào đầu tệp mã nguồn. Nếu Eclipse gặp bất kỳ sự nhập nhằng nào khi phân
giải các ký hiệu nhập khẩu, nó sẽ nhắc bạn lựa chọn gói phần mềm thư viện, mà
ký hiệu phải được nhập khẩu từ đó.
Đặc tính này tránh cho bạn không phải mệt mỏi tìm kiếm bằng tay trong việc viết
mã lệnh hàng ngày.
Hoạt động của servlet ShowPhoto
Yêu cầu HTTP đầu vào có chứa một tham số có tên là empno. Tham số này được
sử dụng để tìm đúng ảnh từ bảng EMP_PHOTO. Truy vấn được thiết lập trong
chuỗi sau:
String query =
"select picture from emp_photo where photo_format='gif' and empno='"
+ request.getParameter("empno") + "'";
Truy vấn thực hiện với jdbc/DataSource được thiết lập trong kế hoạch triển khai,
geronimo-web.xml. Nguồn dữ liệu này liên kết tới pool cơ sở dữ liệu toàn hệ
thống có tên là dwDatasource được cấu hình trên Máy chủ ứng dụng. Đối với các
servlet lưu trú trên Máy chủ ứng dụng, bạn có thể thực hiện tìm kiếm, sử dụng
JNDI sau:
InitialContext context = new InitialContext();
dsource = (DataSource)context.lookup("java:comp/env/jdbc/DataSource");
Một khi các nguồn dữ liệu đã nhận được, bạn có thể thực hiện truy vấn sử dụng
mã lệnh JDBC tiêu chuẩn:
conn = dsource.getConnection();
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
Để tìm trường hình ảnh như là một luồng đầu vào nhị phân, hãy sử dụng phương
thức getBinaryStream() trên trường #1 — trường hình ảnh trong ResultSet JDBC
(tập kết quả JDBC) mà truy vấn SELECT trả về:
InputStream istream;
istream = rset.getBinaryStream(1);
Bạn cần phải thiết lập contentType (kiểu nội dung) đúng cho nội dung trả lời của
servlet để đảm bảo rằng trình duyệt có thể diễn giải được thuộc tính kiểu mime
image/gif :
response.reset();
response.setContentType("image/gif");
Tất cả những gì còn phải làm là đọc từ luồng nhị phân của trường hình ảnh và ghi
nó ra luồng đầu ra trả lời:
while((size= istream.read(buffer))!= -1 ) {
response.getOutputStream().write(buffer,0,size);
}
Thao tác này hoàn tất servlet ShowPhoto.java. Tiếp theo, bạn sẽ thiết lập trang
chào đón ban đầu của ứng dụng.
Thiết lập trang chào đón của ứng dụng Web
Theo mặc định, ứng dụng Web hiển thị index.jsp như là trang chào đón. Đây là
trang được Máy chủ ứng dụng hiển thị khi URL sau được yêu cầu:
index.jsp hiện đang chứa ứng dụng danh sách - nhân viên cũ. Bạn cần phải thay
đổi trang chào đón để trỏ tới employee.jsp. Mở tệp tin web.xml từ khung nhìn
Navigator và sau đó tìm phần tử . Phần tử này chứa các tệp tin
mà Máy chủ ứng dụng tìm kiếm khi hiển thị trang chào đón của ứng dụng. Thực
hiện thay đổi sau đây (hiển thị bằng chữ đậm trong Listing 7) cho phần tử này:
Listing 7. Cấu hình employee.jsp làm trang chào đón của ứng dụng
index.html
index.htm
employee.jsp
default.html
default.htm
default.jsp
Sửa đổi phiếu định kiểu
Bạn cũng cần sửa đổi bản phiếu định kiểu gốc ban đầu dwstyles.css để bao gồm
các phần tử kiểu bổ sung, như hiển thị bằng chữ đậm trong Listing 8, mà
employee.jsp sử dụng:
Listing 8. Các phần tử mới được thêm vào phiếu định kiểu dwstyles.css
@CHARSET "ISO-8859-1";
h1 {
font-family: arial;
font-size: 38;
align: left;
font-weight: bold;
font-style: italic;
color: green;
}
h2 {
font-family: serif, times;
font-size: 18;
align: left;
color: blue;
}
th {
font-family: verdana, arial;
font-size: 13;
font-weight: bold;
align: left;
background-color: black;
color: white;
}
td {
font-family: verdana, arial;
font-size: 12;
font-style: italic;
text-align: left;
}
table {
border-style: solid;
border-width: thin;
}
.label {
font-size: 16;
font-weight: bold;
font-style: normal;
text-align: right;
}
.name {
font-size: 24;
font-weight: bold;
font-style: italic;
font-family: serif, times roman;
}
Thử nghiệm ứng dụng thông tin-nhân viên
Trước khi bạn có thể chạy ứng dụng, bạn cần phải xây dựng dự án, tức là biên dịch
mã Java và tạo ra tệp tin WAR. Nhấn chuột phải vào dwapp trong khung nhìn
Navigator và chọn Build Project. Dự án Eclipse của bạn có thể được thiết lập để
xây dựng tự động, trong trường hợp này bạn không cần phải xây dựng bằng tay
mỗi lần. Kiểm tra trong trình đơn Project trên thanh trình đơn của Eclipse để xem
dự án được thiết lập để xây dựng tự động chưa.
Để triển khai ứng dụng mới của bạn lên Máy chủ ứng dụng và thử nghiệm nó,
nhấn chuột phải vào dự án dwapp trong khung nhìn Navigator và chọn Run As >
Run on Server. Kiểm tra khung nhìn Servers hai lần xem dự án dwapp đã ở trạng
thái đã đồng bộ (Synchronized) chưa. Nếu không, chỉ cần nhấn chuột phải vào dự
án dwapp trong khung nhìn Servers và chọn Publish. Eclipse sau đó sẽ đưa phiên
bản WAR mới nhất tới máy chủ và dự án ở trong trạng thái đã đồng bộ.
Nếu Máy chủ ứng dụng không phải đang chạy, Eclipse khởi động nó. Các ứng
dụng được gói lại như một tệp tin WAR và được triển khai tới Máy chủ ứng dụng.
Khởi chạy trình duyệt Web bên trong (hoặc bên ngoài) và truy cập vào URL của
ứng dụng: (Tìm nút Open Web Browser trên thanh
công cụ của Eclipse để tìm một trình duyệt bên trong).
Bây giờ bạn có thể thử chọn các nhân viên khác trong cơ sở dữ liệu để xem thông
tin chi tiết về họ. Nếu nhân viên bạn chọn có ảnh trong cơ sở dữ liệu, ảnh cũng sẽ
được hiển thị.
Cải thiện ứng dụng thông tin-nhân viên
Phiên bản hệ thống thông tin nhân viên mà bạn vừa hoàn thành chỉ thích hợp cho
một công ty rất nhỏ — có khoảng 30 nhân viên. Để xử lý được một công ty có vài
trăm nhân viên, việc sử dụng một danh sách thả xuống để chọn nhân viên hầu như
không khả thi. Hơn nữa, việc gửi qua gửi lại các thông tin của hàng trăm nhân viên
từ DB2 tới JSP mỗi khi danh sách lựa chọn được hiển thị vừa không hiệu quả lại
vừa chậm.
Trong phần này, bạn sẽ chuẩn bị để xây dựng một nhánh hệ thống thông tin thứ
hai nhằm cải thiện tình hình này với một bản thiết kế giao diện người dùng được
hoàn thiện tốt hơn.
Trải nghiệm của người dùng với thiết kế dựa trên trang so với việc cập nhật động
trực quan
Phiên bản dựa trên JSP xử lý việc tìm kiếm nhân viên bằng cách trả về một trang
Web mới. Đây là hành động tiêu chuẩn của JSP, được gọi ngày càng phổ biến là
thiết kế dựa trên trang có trước (legacy page-based design). Chuỗi tương tác liên
tiếp là:
1. Người sử dụng chọn một biểu mẫu (trong trường hợp này là chọn nhân
viên).
2. Dữ liệu biểu mẫu được đệ trình trở lại đến một trình xử lý biểu mẫu trên
máy chủ (trong trường hợp này là employee.jsp).
3. Trình xử lý biểu mẫu trả về một trang HTML mới tới trình duyệt của người
dùng.
4. Trình duyệt của người dùng sẽ hiển thị trang đáp ứng mới này.
Kết quả là người sử dụng cảm thấy khá sốt ruột. Sư chậm trễ đệ trình dữ liệu và
chờ trả lời là nhận thấy rõ. Các thay đổi được hiển thị theo mẫu tất cả-hoặc-không
có gì (all-or-nothing) — ngay cả khi chỉ có một phần nhỏ của trang HTML cần
thay đổi, toàn bộ trang được tìm về từ máy chủ và được trình bày lại. Nói ngắn
gọn, cảm giác trải nghiệm của người dùng với các ứng dụng Web điển hình là rất
khác với các ứng dụng trên máy tại chỗ như xử lý văn bản và lịch biểu.
Để cải thiện cảm giác trải nghiệm của người dùng trên các kết nối tốc độ cao, có
thể chọn một cách tiếp cận năng động hơn, bao gồm chuỗi các tương tác sau:
1. Người sử dụng thao tác chọn trên một trang HTML.
2. Không đệ trình ngay biểu mẫu, mã JavaScript trên trình duyệt gửi truy vấn
do người sử dụng nhập vào đến máy chủ; điều này xảy ra trong nền và
người dùng không nhìn thấy.
3. Không đợi câu trả lời, trình duyệt vẫn tiếp tục hiển thị trang Web này và
cho phép tương tác với người dùng.
4. Sau một thời gian, trả lời cho truy vấn được máy chủ gửi lại và mã
JavaScript trên trình duyệt nhận được câu trả lời này. Việc này người sử
dụng vẫn không nhìn thấy và vẫn tiếp tục tương tác với giao diện người
dùng.
5. Sử dụng mã HTML (DHTML) động, hiện đại để cho phép các trang Web
được sửa đổi trong lúc đang hoạt động bằng cách dùng mã JavaScript.
Trang Web được cập nhật động với các dữ liệu trả lời. Chỉ các phần tử hiển
thị cần thay đổi mới được sửa đổi.
Cảm giác trải nghiệm của người sử dụng được cải thiện rất nhiều. Việc chờ đợi
đáp ứng từ máy chủ và việc làm mới/ cập nhật theo từng trang một không còn nữa.
Thay vào đó, người sử dụng nhận thấy các trải nghiệm tương tác quen thuộc. Về
cơ bản cảm thấy giống như dùng một ứng dụng tại chỗ.
Ajax làm cho tương tác người sử dụng được đáp ứng tốt hơn
Các thuộc tính chính của ứng dụng tương tác nhiều hơn này là:
Tính không đồng bộ (Asynchronicity): Truy vấn được mã lệnh phía trình
duyệt gửi đi không đồng bộ, nghiã là không cần phải chờ đợi truy vấn trước
được trả về; vì không đồng bộ nên không có phần tử giao diện người dùng
nào bị đóng băng hay bị cấm.
JavaScript: Duy nhất JavaScript là ngôn ngữ lập trình phía trình duyệt
được hỗ trợ mọi lúc mọi nơi. Tất cả các tương tác giao diện người dùng của
ứng dụng được sắp đặt cẩn thận, sử dụng mã JavaScript chạy trên trình
duyệt.
XML: Điều này không dễ thấy, nhưng truy vấn cần phải gửi đi gửi về từ
trình duyệt đến máy chủ với các thông số gói kèm. Câu trả lời cũng có thể
chứa các cấu trúc dữ liệu phức tạp (như là một danh sách các bản ghi nhân
viên, với các trường có kích thước và kiểu khác nhau) phải được phân tích
cú pháp bằng mã JavaScript của trình duyệt trước khi sử dụng. Một phương
pháp đã được kiểm chứng và thử nghiệm để trao đổi qua lại các dữ liệu
phức tạp này trên một kết nối HTTP là thông qua XML. Các thư viện xử lý
XML có thể thực hiện phần lớn việc trao đổi qua lại dữ liệu ấy.
Vì vậy, trải nghiệm tương tác cao của người dùng mà bạn nhận được là nhờ có
Asynchronous JavaScript và XML — được gọi một cách đơn giản hơn trong cộng
đồng phát triển là Ajax.
Các thông tin chi tiết về các chủ đề Ajax nằm ngoài phạm vi của hướng dẫn này.
Xem developerWorks Trung tâm tài nguyên Ajax (Ajax resource center) của
developerWorks, và xem loạt bài Ajax dành cho các nhà phát triển Java (Ajax for
Java developers) của Philip McCarthy (xem Tài nguyên), một nguồn tài nguyên
tuyệt vời cho việc học tập về Ajax. Hướng dẫn này tập trung vào việc làm thế nào
để bạn có thể áp dụng Ajax để cải thiện giao diện người dùng của ứng dụng thông
tin nhân viên và làm thế nào để xây dựng các giải pháp dựa trên Ajax khi sử dụng
Eclipse, DB2 Express-C 9.5, và Máy chủ ứng dụng.
Thiết kế lại ứng dụng với Ajax
Hình 7 cho thấy giao diện người dùng đã cải tiến của ứng dụng dựa trên Ajax mà
bạn đang muốn xây dựng:
Hình 7. Giao diện người dùng đã cải tiến cho ứng dụng thông tin-nhân viên
Phiên bản này bao gồm một trường nhập dữ liệu và một hộp thả xuống. Người
dùng có thể:
1. Nhập bao nhiêu chữ cái đầu của tên họ nhân viên như họ muốn vào trường
nhập dữ liệu.
2. Gõ phím Tab ra khỏi trường nhập dữ liệu để liệt kê động trong danh sách
thả xuống dãy tên họ nhân viên khớp với các chữ cái đã gõ nhập.
3. Chọn một nhân viên từ danh sách thả xuống. Khi người sử dụng gõ phím
Tab ra khỏi danh sách thả xuống, ứng dụng ngay lập tức cập nhật tất cả các
thông tin nhân viên, bao gồm cả ảnh.
4. Ngay lập tức lặp lại bước 1 và 2 để xem thông tin từ một nhân viên khác.
Lưu ý rằng không lúc nào người dùng phải chịu đựng sự chậm trễ đệ trình biểu
mẫu hoặc đáp ứng trang. Thiết kế này cũng còn có những khác biệt sau đây so với
phiên bản dựa trên JSP:
Số lượng các lựa chọn trong danh sách thả xuống là giảm đáng kể, cho
phép các ứng dụng xử lý một số lượng nhân viên lớn hơn.
Có ít mục hơn trong danh sách thả xuống có nghĩa là có ít dữ liệu hơn phải
chuyển từ các cơ sở dữ liệu DB2 đến Máy chủ ứng dụng, do đó cải thiện
hiệu năng ứng dụng về tổng thể.
Sự tương tác của giao diện người dùng được cải thiện rất nhiều, nhờ Ajax.
Các trang được hiển thị là trang thuần tuý hương vị HTML, không phải là
một trang JSP được tạo ra.
Ứng dụng này không phụ thuộc trực tiếp vào một thùng chứa (container)
Java EE. Nó không trực tiếp dựa vào JSP, servlets hoặc các EJB trong các
hoạt động của mình.
Do thiết kế không dùng thùng chứa (containerless) của nó và sử dụng trang thuần
hương vị HTML, giải pháp theo phong cách này thường được gọi là kiến trúc nhẹ
(lightweight construction). Trên thực tế, bạn có thể chỉ cần viết mã JavaScript vào
một trang HTML và sau đó điều khiển động các phần tử giao diện người dùng và
truy vấn các cơ sở dữ liệu ở mặt sau với nó. Bạn có thể xây dựng mặt sau hoàn
toàn bằng công nghệ thay thế khác, như là khung công tác nhẹ Spring (Spring
lightweight framework) hoặc thậm chí là công nghệ không phải Java như là Ruby
on Rails (xem Tài nguyên).
Giới thiệu Web trực tiếp từ xa
Việc nghiên cứu chi tiết về viết mã Ajax mức thấp không phải dành cho người
nhát gan. Tất cả các mã Ajax đều sử dụng một đối tượng có sẵn trong tất cả các
trình duyệt hiện đại — bao gồm cả các phiên bản mới nhất của các trình duyệt
Firefox, Safari, và Internet Explorer — gọi là XMLHttpRequest. Mã JavaScript có
thể thực hiện các cuộc gọi không đồng bộ đến máy chủ thông qua đối tượng này.
Thật không may, các trình duyệt khác nhau thực hiện triển khai đối tượng
XMLHttpRequest hơi khác nhau một chút. Còn rắc rối thêm nữa là các phiên bản
hỗn hợp, khác nhau của cùng một trình duyệt (ví dụ như Internet Explorer) cũng
triển khai thực hiện đối tượng này khác nhau. Thêm vào thực tế này là mã
JavaScript tự nó cũng khác nhau đối với các trình duyệt và các phiên bản khác
nhau, và bạn có một vấn đề hắc búa đang chờ đợi.
Độ phức tạp còn được kết hợp thêm với sự thiếu vắng tiêu chuẩn hóa về cách thức
dữ liệu được trao đổi qua lại trên các yêu cầu và đáp ứng XML giữa mã trình
duyệt và máy chủ ở mặt sau như thế nào. Nhiều giải pháp cạnh tranh khác có mặt,
và một số nhà phát triển bị thất vọng đơn giản vứt bỏ luôn. Để đánh giá được một
số khó khăn tiềm tàng, xem loạt bài Ajax for Java developers (xem Tài nguyên).
May quá, với tư cách là một nhà phát triển Java, bạn có thể sử dụng một chồng thư
viện để tách ra hầu hết các sự khác biệt mà tôi đã mô tả và cung cấp một giải pháp
Ajax viết mã dễ dàng, khả thi ngày hôm nay. Thư viện này được gọi là Direct Web
Remoting (DWR) (xem Tài nguyên).
DWR là đứa con tinh thần của Joe Walker và Mark Goodwin. Đây là một tổ hợp
giữa thư viện mã JavaScript và Java servlet để cho phép bạn thực hiện các cuộc
gọi từ xa trong suốt tới các phương thức của đối tượng Java phía máy chủ từ một
trang Web, khi sử dụng Ajax. Trọng tâm phát triển của thư viện này là giúp cho
các nhà phát triển sử dụng dễ dàng.
DWR được phát hành theo giấy phép phần mềm Apache 2.0, chính là giấy phép
hào phóng mà các dự án mã nguồn mở lớn rất thành công như Apache Tomcat,
Apache Ant và Apache Geronimo đã tuân theo. Bạn có thể tạo ra các ứng dụng,
thương mại hoặc không, khi sử dụng thư viện DWR mà không có nghĩa vụ đóng
góp lại cho dự án. Xem các điều khoản cấp phép với đầy đủ chi tiết.
Hình 8 cho thấy DWR làm đơn giản hoá hoạt động lập trình Ajax của bạn như thế
nào:
Hình 8. Các thành phần của DWR
DWR hoạt động như thế nào
DWR gồm có hai thành phần:
Một thư viện JavaScript chạy trên trình duyệt của người dùng (utils.js và
engine.js).
Một servlet để chạy trên Máy chủ ứng dụng.
Các mã JavaScript do bạn viết có thể sử dụng thư viện JavaScript của DWR. Thư
viện này cung cấp các đặc tính cốt yếu sau đây:
Nó tránh cho bạn khỏi các khác biệt của trình duyệt trong việc xử lý các
cuộc gọi Ajax.
Nó tạo thuận lợi cho một số thao tác DHTML nhất định khi sửa đổi động
các phần tử của trang Web mà nếu trái lại (không dùng DWR) có thể phải
viết mã JavaScript và DHTML khá phức tạp.
Quan trọng hơn, DWR cho phép bạn truy cập từ xa (remote) các đối tượng Java
nhất định. Trong Hình 8, đối tượng Employee của Java phía máy chủ (một đối
tượng thuần Java cũ - POJO) được truy cập từ xa. DWR làm cho đối tượng này
xuất hiện để sẵn sàng cho mã JavaScript chạy trên trình duyệt của người dùng. Các
mã JavaScript có thể truy cập vào các đối tượng Employee phía máy chủ cứ như
chúng là các đối tượng JavaScript tại chỗ. Để tận dụng đặc tính truy nhập từ xa
này, đối tượng Employee phía máy chủ nhận dữ liệu của nó thông qua một kết nối
JDBC trực tiếp với dữ liệu nhân viên trên DB2 Express-C 9.5. Do đối tượng ở xa
nên dữ liệu này sẽ tự động tạo sẵn cho mã JavaScript trên trình duyệt phía khách.
Bên dưới vỏ bọc, DWR thực hiện các cuộc gọi không đồng bộ thông qua đối
tượng XMLHttpRequest được trình duyệt cung cấp tới servlet riêng của nó đang
chạy trên Máy chủ ứng dụng. Servlet này truy cập đối tượng Employee phía máy
chủ và gửi lại dữ liệu đã yêu cầu qua một đáp ứng HTTP đã định dạng theo định
dạng JavaScript Object Notation (JSON). Định dạng JSON là một định dạng tuần
tự hóa thân thiện với mã JavaScript để cho phép bộ thông dịch mã JavaScript
trong trình duyệt Web tạo ra trực tiếp các đối tượng JavaScript bản địa (phản ánh
đối tượng Employee phía máy chủ).
Hướng tới một thiết kế nhẹ
Ứng dụng thông tin-nhân viên mới, khi sử dụng DWR để triển khai thực hiện
Ajax, chứa mã lệnh đơn giản hơn và trực tiếp hơn ứng dụng tiền nhiệm cũ. Hình 9
cho thấy thiết kế mới này hoạt động như thế nào:
Hình 9. Ứng dụng thông tin nhân viên gọn nhẹ mới
Trong Hình 9, trang web hiển thị thông tin nhân viên hiện nay là một trang
HTML, không phải là một JSP. Trong trường hợp này Máy chủ ứng dụng chỉ hoạt
động như là một máy chủ Web, phục vụ các trang Web tĩnh cho trình duyệt của
người sử dụng. Nó không hoạt động như là một thùng chứa JSP. Mã JavaScript
trong trang HTML truy cập các đối tượng Employee đang ở xa, sử dụng DWR.
Các đối tượng Employee phía máy chủ không cần thiết phải lưu trú bên trong một
thùng chứa truyền thống.
Trong thiết kế này, Máy chủ ứng dụng được sử dụng chỉ cho ba mục đích:
Để hoạt động như một máy chủ Web tĩnh và phục vụ trang HTML tĩnh có
chứa mã Ajax
Để hỗ trợ thực hiện các DWR
Để hỗ trợ servlet ShowPhoto hiển thị các ảnh của nhân viên
Thực nghiệm với DWR
Máy chủ ứng dụng bao gồm phiên bản 1.1.4 ổn định của DWR theo mặc định. Ví
dụ này tận dụng thực tế đó và không yêu cầu tải về hay cài đặt thêm một DWR để
hoạt động. Bạn chỉ nên sử dụng thư viện mặc định của Máy chủ ứng dụng, phiên
bản 1.1.4, với ví dụ này. Các phiên bản mới hơn có thể có sẵn qua các trang Web
tải về DWR để bạn tìm hiểu thêm.
Để thực nghiệm ngay bây giờ với DWR và hiểu rõ hơn về hoạt động của nó, hãy
vào Tải về DWR và chỉ tải về tệp tin dwr.war cho DWR phiên bản 1.1.4 (hãy chắc
chắn rằng bạn nhận được phiên bản đúng). Tệp tin dwr.war là một ứng dụng trình
diễn, cũng có chứa một số bộ thử nghiệm đơn vị và chẩn đoán có ích.
Cuộc gặp gỡ lần đầu tiên với Ajax trên DWR
Để thấy bạn có thể khởi động nhanh chóng như thế nào, đầu tiên hãy triển khai các
ứng dụng Web mẫu trong tệp tin dwr.war. Hãy chắc chắn rằng Eclipse không
chạy, và sau đó khởi động Máy chủ ứng dụng.
Tiếp theo, khởi động bàn quản trị Máy chủ ứng dụng và triển khai ứng dụng
dwr.war:
1. Với Máy chủ ứng dụng đang chạy, hãy vào URL
2. Đăng nhập vào bàn quản trị, sử dụng tên người dùng là system và mật khẩu
là manager.
3. Trong trình đơn Console Navigation, nhấn vào Applications > Deploy
New.
4. Duyệt tìm tệp tin dwr.war đã tải về của bạn (sử dụng nút Browse) và nhấn
vào Install. Để trống hộp Plan. Xem Hình 10:
Hình 10. Triển khai ứng dụng web thử nghiệm DWR
Bây giờ, trỏ trình duyệt của bạn vào trang trước của ứng dụng thử nghiệm DWR:
Bạn sẽ thấy DWR và Ajax làm việc ngay lập tức. Các trang đầu tiên mà bạn đã
hiển thị là trang chào đón, như thấy trong Hình 11:
Hình 11. Trang chào đón của ứng dụng DWR
Nếu bị nhấp nháy, bạn có thể đã bỏ qua hoàn toàn trang chào đón như hiển thị
trong Hình 11 (Hãy chú ý dấu hiệu Đang tải-Loading màu đỏ ở góc trên bên phải).
Sử dụng XMLHttpRequest, các mã JavaScript nhúng đã tìm về, một cách không
đồng bộ, nội dung của trang "DWR đang hoạt động đúng" thứ hai từ máy chủ và
thay thế trang chào đón bằng trang này khi sử dụng DHTML. Kết quả là, bạn chỉ
nhìn thấy trang thứ hai, như thấy trong Hình 12:
Hình 12. Trang thử nghiệm được ứng dụng tải về không đồng bộ khi sử dụng
DWR
Bạn có thể muốn duyệt qua các thử nghiệm đơn vị do ứng dụng ví dụ này thực
hiện. Điều này có thể giúp bạn đánh giá một số chi tiết bên trong DWR. Phần kế
tiếp cho thấy làm thế nào để thêm DWR vào ứng dụng thông tin-nhân viên.
Tạo ứng dụng thông tin-nhân viên mới
Bạn đang sẵn sàng để nâng cấp ứng dụng thông tin nhân viên thành một phiên bản
Ajax. Phần này sẽ đưa bạn đi qua các bước.
Ứng dụng thông tin-nhân viên mới
Ứng dụng thông tin nhân viên mới bao gồm các thành phần mã được mô tả trong
Bảng 3:
Bảng 3. Các thành phần của ứng dụng thông tin nhân viên mới với Ajax
Thành phần Mô tả
employee.html
Một trang HTML có các mã JavaScript
để thực hiện ứng dụng thông tin-nhân
viên.
Employee.java
Một lớp Java phía máy chủ để truy cập
các cơ sở dữ liệu DB2 Express-C 9.5 khi
sử dụng JDBC. Lớp này được truy cập từ
xa đối với trình duyệt phía khách khi sử
dụng DWR.
ShowPhoto.java
Chính là servlet ShowPhoto trong ứng
dụng (dựa trên JSP) đầu tiên. Nó được sử
dụng để tìm kiếm thông tin về ảnh nhân
viên từ cơ sở dữ liệu DB2 Express-C 9.5
và chuyển tới trình duyệt của người
dùng.
dwstyles.css Chính là phiếu định kiểu được sử dụng trong ứng dụng đầu tiên.
Thêm DWR tới ứng dụng
Để thêm DWR vào dự án dwapp, tắt Máy chủ ứng dụng và làm theo các bước sau
trong Eclipse:
1. Trong tệp tin web.xml, thêm vào các dòng mã in đậm như hiển thị trong
Listing 10:
Listing 10. Tích hợp servlet hỗ trợ DWR vào trong ứng dụng
<web-app xmlns:xsi=""
xmlns=""
xmlns:web=""
xsi:schemaLocation=
"
"
id="WebApp_ID" version="2.5">
dwapp
index.html
index.htm
employee.jsp
default.html
default.htm
default.jsp
jdbc/DataSource
javax.sql.DataSource
Container
Shareable
ShowPhoto
ShowPhoto
com.ibm.dw.ShowPhoto
DWR Servlet
dwr-invoker
uk.ltd.getahead.dwr.DWRServlet
debug
true
dwr-invoker
/dwr/*
ShowPhoto
/ShowPhoto
...
2. Trong tệp tin geronimo-web.xml, thêm phụ thuộc vào các thư viện DWR
phiên bản 1.1.4 mặc định đã có trong Máy chủ ứng dụng. Thực hiện điều
này bằng cách bổ sung thêm mục như hiển thị trong
Listing 11:
Listing 11. Trưng ra các thư viện DWR phiên bản 1.1.4 mặc định có
sẵn cho ứng dụng
<web-app xmlns=""
xmlns:nam=""
xmlns:sec=""
xmlns:sys="">
default
dwapp
1.0
car
console.dbpool
dwDatasource
dwr
dwr
1.1.4
...
3. Thêm một tệp tin cấu hình DWR mới , dwr.xml, vào thư mục WebContent \
WEB-INF. Bạn sẽ tìm thấy các tệp tin web.xml và geronimo-web.xml đã ở
sẵn đó. Tệp tin dwr.xml cần phải chứa các mã trong Listing 12:
Listing 12. Tệp tin dwr.xml cho cấu hình DWR
<!DOCTYPE dwr PUBLIC
"-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
"">
Tệp tin cấu hình dwr.xml báo cho DWR biết lớp Java nào có sẵn để thực hiện truy
cập từ xa. Trong trường hợp này, nó ra lệnh trưng ra lớp com.ibm.dw.Employee
như là lớp JEmployee trong mã JavaScript. Dòng chỉ rõ rằng DWR
cần phải cho phép chuyển giao các đối tượng kiểu com.ibm.dw.Employee giữa
máy chủ và máy khách.
Tạo POJO Employee phía máy chủ
Thêm một lớp Employee mới vào gói com.ibm.dw, bằng cách sử dụng trình thủ
thuật New trong Eclipse như bạn đã làm với ShowPhoto.java (xem phần Hiển thị
các ảnh từ các trường DB2 BLOB-Showing photographs from DB2 BLOB fields):
1. Điểm sáng WebContent.
2. Nhấn Ctrl+N.
3. Chọn Class trong trình thủ thuật New.
Thêm các trường được hiển thị dưới dạng in đậm trong Listing 13 vào bộ khung
sườn Employee do Eclipse tạo ra:
Listing 13. Thêm các trường vào POJO Employee
package com.ibm.dw;
import java.util.Date;
public class Employee {
private String empno;
private String firstnme;
private String lastname;
private String job;
private Date hiredate;
private String workdept;
private String phoneno;
private int salary;
private int bonus;
private String fullname;
...
Sử dụng Eclipse tự động tạo ra các phương thức get (getters)
Viết mã của các phương thức get cho các trường của đối tượng Java là một công
việc thường xuyên — và vô cùng nhàm chán — trong phát triển. Eclipse thực hiện
công việc này dễ dàng bằng cách cung cấp một dụng cụ tạo mã tự động.
Trong trình soạn thảo Employee.java, nhấn chuột phải và chọn Source >
Generate Getters and Setters. Điều này khởi động trình thủ thuật Generate
Getters and Setters như hiển thị trong Hình 13:
Trình thủ thuật tạo ra các phương thức get và các phương thức set của
Eclipse
Nhấn vào Select Getters và sau đó nhấn OK. Thao tác này tạo tự động tất cả các
phương pháp get mà bạn cần cho lớp Employee.
Sử dụng JDBC để tìm về các bản ghi nhân viên từ cơ sở dữ liệu
Tiếp theo, thêm hàm tạo riêng tư (private constructor) được hiển thị bằng chữ in
đậm trong Listing 14 vào lớp Employee. Hãy chắc chắn rằng bạn có hàm tạo công
cộng (public constructor) không có đối số mặc định (cũng được hiển thị trong
Listing14) đã được định nghĩa:
Listing 14. Hai hàm tạo mã cho các đối tượng Employee
public Employee() {
}
private Employee(String empno, String firstnme,
String lastname,
String job, Date hiredate, String workdept,
String phoneno, int salary, int bonus) {
this.empno = empno;
this.firstnme = firstnme;
this.lastname = lastname;
this.job = job;
this.hiredate = hiredate;
this.workdept = workdept;
this.phoneno = phoneno;
this.salary = salary;
this.bonus = bonus;
this.fullname = lastname + ", " + firstnme;
}
Trường fullname (tên đầy đủ) được sử dụng để hiển thị các tên trong danh sách thả
xuống của ứng dụng.
Cuối cùng nhưng không kém quan trọng là thêm phương thức findStartsWith(),
như hiển thị trong Listing15, để tìm kiếm các bản ghi nhân viên từ pool cơ sở dữ
liệu jdbc/DataSource. Phương thức này trả về một mảng các nhân viên có tên phù
hợp với chuỗi startText đã cho startText.
Listing 15. Phương thức findStartsWith()
public static Employee [] findStartsWith(String startText) {
String query =
"select * from employee where lastname like '"
+ startText + "%'";
DataSource dsource = null;
Statement stmt= null;
Connection conn =null;
ResultSet rset = null;
ArrayList result = new ArrayList();
try {
InitialContext context = new InitialContext();
dsource =
(DataSource)context.lookup("java:comp/env/jdbc/DataSource");
conn = dsource.getConnection();
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
while (rset.next()) {
result.add(
new Employee(
rset.getString("empno"),
rset.getString("firstnme"),
rset.getString("lastname"),
rset.getString("job"),
rset.getDate("hiredate"),
rset.getString("workdept"),
rset.getString("phoneno"),
rset.getInt("salary"),
rset.getInt("bonus")
)
);
}
} catch(NamingException e) {
// add handler or logging code here
} catch(SQLException e) {
// add handler or logging code here
}
finally {
try {
if (rset != null)
rset.close();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
} catch (SQLException ex ) {}
}
int arraylen = result.size();
Employee [] retArray = new Employee[arraylen];
for (int i=0; i < arraylen; i++)
retArray[i] = (Employee) result.get(i);
return retArray;
}
Trước khi bạn lưu tệp tin Employee.java, nhấn Ctrl+Shift+O để thêm vào tất cả
các lệnh nhập khẩu cần thiết, sử dụng đặc tính tổ chức nhập khẩu tự động của
Eclipse.
Lưu ý rằng mặc dù tệp tin Employee.java được viết mã bằng tay trong ví dụ này,
nhưng trong một số dự án, không phải là bất bình thường khi sinh tự động mã truy
nhập dữ liệu phía máy chủ này bằng cách sử dụng công nghệ Java lâu bền như
JPA hoặc một trình ánh xạ đối tượng-quan hệ ví dụ như: Hibernate, Castor, hoặc
JDO (xem Tài nguyên).
Kiểm tra việc trưng ra từ xa lớp Employee
Để kiểm tra xem lớp Employee được trưng ra từ xa một cách đúng đắn chưa khi sử
dụng DWR, hãy thực hiện theo các bước sau:
1. Xây dựng và triển khai dự án cho máy chủ bằng cách nhấn chuột phải vào
dwapp và chọn Run As > Run on Server.
2. Trỏ trình duyệt đến Bạn sẽ
thấy DWR báo cáo rằng com.ibm.dw.Employee đã được trưng ra như là
JEmployee, như thấy trong Hình 14:
Hình 14. DWR xác nhận trưng ra từ xa lớp Employee
3. Nhấn vào liên kết JEmployee . DWR bây giờ tạo ra một trang có danh sách
tất cả các phương thức có sẵn với JEmployee (các phương thức của
Employee được trưng ra từ xa). Tìm phương thức findStartsWith() được
hiển thị trong Hình 15:
Hình 15. Trang được DWR tạo ra hiển thị tất cả các phương thức được
trưng ra từ xa
4. Nhập chữ cái M bên trong dấu nháy kép và nhấn Execute. Thao tác này sẽ
gọi phương thức trên đối tượng JavaScript JEmployee, mà đến lượt nó lại
gọi phương thức phía máy chủ, sử dụng Ajax. Đối tượng Employee phía
máy chủ truy vấn cơ sở dữ liệu DB2 Express-C 9.5 tìm các bản ghi nhân
viên cần thiết và sau đó DWR chuyển các dữ liệu tìm được về trình duyệt
một cách không đồng bộ theo định dạng JSON. Bạn sẽ thấy một hộp cảnh
báo JavaScript với các dữ liệu đã tìm thấy, tương tự như Hình 16. Trong
trường hợp này, ba cá thể JEmployee được trả về.
Hình 16. Các bản ghi nhân viên dưới dạng các cá thể của đối tượng
JEmployee JavaScript, có chứa các dữ liệu tìm thấy từ cơ sở dữ liệu
Viết mã JavaScript trong employee.html
Phần mã hóa duy nhất còn lại để cho bạn viết là trang web employee.html. Mã
JavaScript trong trang này xử lý tất cả các tương tác với người sử dụng.
Sử dụng trình thủ thuật New của Eclipse để tạo ra bộ khung sườn. Chọn Web >
HTML và đặt tên cho nó là employee.html.
Trong phần của trang web được tạo ra, thêm vào tiêu đề và tham chiếu đến
phiếu định kiểu, như hiển thị bằng các dòng in đậm trong Listing 16:
Listing 16. Thêm tiêu đề và tham chiếu đến phiếu định kiểu
dW Example Employee Data - AJAX version
Trong đoạn mở đầu của phần thêm vào mã JavaScript in đậm từ Listing
17:
Listing 17. Thêm vào các tham chiếu để bao gồm mã thư viện JavaScript
DWR
<script type='text/javascript'
src='/dwapp/dwr/interface/JEmployee.js'>
var employees;
function update() {
JEmployee.findStartsWith(DWRUtil.getValue
("searchblank").toUpperCase(),updatechoice);
}
function updatechoice(emps) {
employees = emps;
DWRUtil.removeAllOptions("empselect");
DWRUtil.addOptions("empselect", emps, "empno", "fullname");
}
function setinfo() {
selected = DWRUtil.getText("empselect");
emplength = employees.length;
for(count = 0; count < emplength; count++) {
with (employees[count]) {
if (fullname == selected) {
DWRUtil.setValue("fullname", fullname);
DWRUtil.setValue("empno", empno);
DWRUtil.setValue("job", job);
DWRUtil.setValue("workdept", workdept);
DWRUtil.setValue("phoneno", phoneno);
DWRUtil.setValue("salary", salary);
DWRUtil.setValue("bonus", bonus);
DWRUtil.setValue("hiredate", hiredate.getFullYear());
$("photo").src = "/dwapp/ShowPhoto?empno=" + empno;
break;
}
}
}
}
Các tham chiếu in đậm trong Listing17 bao gồm các thư viện mã JavaScript DWR
và mã được tạo ra cần thiết cho hoạt động đúng của DWR. Phần còn lại của các
hàm được sử dụng để xử lý các tương tác người dùng.
Thêm mã trong Listing18 vào tệp tin employee.html. Mã này tạo ra giao diện
người dùng và hiển thị thông tin-nhân viên.
Listing 18. Tạo ra giao diện người dùng và hiển thị thông tin-nhân viên
DB2 Employee Information
AJAX lightweight interactive version
Employee number:
Position:
Hired:
Department:
Phone number:
Salary:$
Bonus:$
Sau khi người dùng nhập một phần tên họ của nhân viên vào trong hộp nhập dữ
liệu và gõ phím Tab ra khỏi trường này, sự kiện onblur được kích hoạt (onblur - sự
kiện “thành mờ đi” của một yếu tố giao diện người sử dụng). Hàm JavaScript
update() được gọi thực hiện trong trường hợp này:
Hàm update() gọi phương thức JEmployee.findStartsWith() để tìm kiếm các bản
ghi JEmployee từ xa. Cuộc gọi này là không đồng bộ. Nó trở về ngay lập tức, và
mã lệnh chỉ rõ rằng hàm có tên là updatechoice() cần được gọi ra khi kết quả quay
về từ máy chủ.
Trong hàm updatechoice() mảng các đối tượng JEmployee đã trả về được gán cho
biến, có phạm vi hiệu lực trong trang, tên là employees. Tiếp theo, danh sách
được làm rỗng và sau đó điền đầy bằng trường fullname từ đối tượng
JEmployee. Điều này được thực hiện bằng cách sử dụng mã DHTML. Các hàm
DWRUtil.removeAllOptions() and DWUtil.addOptions() từ các thư viện
JavaScript của DWR thực hiện việc này dễ dàng và tránh cho bạn khỏi phải viết
mã đặc thù riêng cho trình duyệt.
Đây là cách phần tử được điền đầy bằng tên nhân viên đã chọn một cách
động như thế nào. Khi người sử dụng chọn một trong các tên nhân viên từ phần tử
và sau đó thoát ra khỏi trường này, trình xử lý sự kiện onblur của phần tử
được gọi thực hiện. Phần tử chỉ rõ việc này là hàm setinfo():
Phương thức setinfo() xác định mã nhận dạng ID của nhân viên được người sử
dụng chọn và sử dụng mã nhận dạng ID này để đọc lướt qua mảng các nhân viên,
có phạm vi hiệu lực trong trang, tìm cá thể JEmployee được chọn. Sau đó cá thể
này sẽ được dùng để thiết lập giá trị của các phần tử thông tin, sử dụng DHTML.
Một lần nữa, phương thức DWRUtil.setValue() của thư viện JavaScript DWR làm
cho việc này đơn giản và độc lập với các phong cách riêng của từng trình duyệt.
Thiết lập trang chào đón của các ứng dụng web
Trang chào đón mặc định trước đây đã được thiết lập tới employee.jsp. Bạn cần
phải thay đổi nó thành employee.html. Thực hiện thay đổi với web.xml được tô
đậm trong Listing 19:
Listing 19. Thay đổi trang chào đón mặc định
employee.html
index.htm
employee.jsp
default.html
default.htm
default.jsp
Thử nghiệm ứng dụng thông tin nhân viên dựa trên Ajax
Nhấn chuột phải vào dwapp trong khung nhìn Navigator và chọn Run As > Run
on Server. Thao tác này triển khai ứng dụng lên Máy chủ ứng dụng và khởi động
nó.
Bạn sẽ thấy ứng dụng mới, không có dữ liệu nhân viên được lựa chọn, như được
hiển thị trong Hình 17:
Hình 17. Khởi động ứng dụng thông tin-nhân viên mới
Nhập a vào trong hộp soạn thảo và ấn Tab. Trong giây lát, bạn sẽ thấy danh sách
thả xuống được điền tên ADAMSON, BRUCE. Gõ phím Tab ra khỏi danh sách
chọn và thông tin của Bruce Adamson được tự động tìm về.
Hãy thử gõ w vào trong hộp soạn thảo và sau đó ấn tab. Lúc này, WALKER,
JAMES được hiển thị trong danh sách thả xuống. Gõ phím Tab ra khỏi danh sách
chọn và thông tin về James Walker được tìm về tự động (xem Hình 18). Bạn cũng
có thể muốn thử phím l, là tùy chọn để điền một danh sách có nhiều hơn một lựa
chọn.
Hình 18. Ứng dụng Ajax với thông tin nhân viên được tìm về không đồng bộ
Hãy chú ý giao diện Ajax này tương tác hơn nhiều và cảm nhận “tự nhiên” hơn
nhiều, đối lập với giao diện người dùng kiểu một trang mỗi lần mà ứng dụng đầu
tiên trình bày. Phong cách dùng giao diện người sử dụng có khả năng đáp ứng cao,
cập nhật động này thực hiện được nhờ có các máy chủ tầng sau hùng mạnh và các
kết nối mạng tốc độ cao. Xu hướng này — thường được gọi là Web 2.0 — là làn
sóng tương lai trong ứng dụng Web.
Tóm tắt
Trong hướng dẫn này, bạn:
Đã tạo ra một ứng dụng thông tin - nhân viên, sử dụng công nghệ JSP và
servlet truyền thống
Đã viết mã cho dự án trong Eclipse và triển khai nó trên Máy chủ ứng dụng
để thử nghiệm
Đã tạo ra một servlet để gửi về các ảnh của nhân viên tìm trong các trường
cơ sở dữ liệu BLOB của DB2 Express-C 9.5
Đã tải xuống và thử nghiệm DWR để phát triển Ajax trong Eclipse
Đã chuyển một ứng dụng sang thiết kế Ajax nhẹ khi sử dụng thư viện mã
JavaScript của DWR
Đã viết mã cho POJO Employee để truy cập từ xa qua DWR
Đã viết mã và thử nghiệm ứng dụng Ajax mới trong Eclipse và đã triển
khai và thử nghiệm nó khi sử dụng Máy chủ ứng dụng
Eclipse, Máy chủ ứng dụng và DB2 Express-C 9.5 không hề hạn chế bạn chỉ phát
triển Java EE. Trong thực tế, bộ Khởi đầu các ứng dụng Java của bạn là một nền
tảng lý tưởng để khai thác công nghệ giao diện - người dùng tương tác nhẹ, thay
thế. Bạn có thể thử nghiệm và gỡ lỗi bất kỳ sản phẩm ứng dụng nào do bạn phát
triển trong quá trình khai thác môi trường quen thuộc của IDE Eclipse, và bạn có
thể triển khai chúng để sử dụng thực sự trên tổ hợp DB2 Express-C 9.5 và Máy
chủ ứng dụng hùng mạnh và đã qua kiểm chứng .
Các file đính kèm theo tài liệu này:
- Khởi đầu các ứng dụng Java của bạn, Phần 2- Phát triển Ajax gọn nhẹ, dễ dàng.pdf