LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Phần I
GIỚI THIỆU VỀ NGÔN NGỮ CÀI ĐẶT
Chương I
CĂN BẢN VỀ JSP
JavaServer Pages (JSP) là một kỹ thuật server-side do đó chúng ta
không thể thực hiện bất kỳ hành động nào ở client. JSP cho phép chúng ta
tách thành phần động của trang ra khỏi thành phần tónh HTML. Rất đơn
giản, chúng ta chỉ cần viết một tài liệu HTML bình thường rồi sau đó bao
quanh mã của thành phần động trong các tag đặc biệt, hầu hết các tag bắt
đầu với <% và kết thúc với %>. Ví dụ, đây là một phần của trang JSP, có
kết quả trả về là “Thanks for reading Van Dau book.” với URL là
http://localhost:8100/thanhk.jsp?title=Van+Dau
Thanks for reading <i><%=request.getParameter(“title”)%><i>book.
Kỹ thuật JSP là một thành phần trong đại gia đình Java; nó sử dùng
ngôn ngữ kòch bản dựa vào ngôn ngữ lập trình Java, và các trang JSP được
biên dòch thành servlets. Từ đó chúng ta cũng nhận biết được, JSP thì không
phụ thuộc bất kỳ nền (platform) nào. Nó đáp ứng được khuynh hướng của
Sun MicroSystem là “write one, run anywhere”.
Các trang JSP có thể gọi các thành phần JavaBeans, Enterprise
JavaBeans (EJB) hoặc custom tags để thực hiện các xử lý trên server. Và
như thế, kỹ thuật JSP là thành phần chủ chốt trong kiến trúc khả chuyển
của Java cho những ứng dụng dựa vào Web.
Như đã biết, JSPs sẽ biên dòch thành servlets nhưng JSP không thể
thay thế servlet vì các lý do sau:
♦ Một số tác vụ được giải quyết rất tốt bằng servlet. Ví dụ, các ứng dụng
xuất ra dữ liệu nhò phân hoặc chỉ xác đònh nơi gởi trở lại cho người dùng
(bằng cách dùng response.sendRedirect) được dùng servlet thì tốt nhất.
♦ Một số tác vụ khác lại được giải quyết rất tốt bằng JSP như các tình
huống mà cấu trúc nền tảng của trang HTML là cố đònh nhưng các giá
trò trong nó lại thay đổi.
♦ Còn các tác vụ còn lại cần sự kết hợp cả servlet và JSP. Ví dụ, trong yêu
cầu gốc được trả lời bằng một servlet mà thực hiện mọi công việc, lưu
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 1
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
trữ các kết quả trong các Beans và điều phối yêu cầu này đến một trong
những trang JSP có thể hiển thò nó.
Cả ba đònh hướng này đều có chổ đứng của nó. Chẳng có đònh hướng
nào hổ trợ đầy đủ cho mọi ứng dụng .
Trước khi đi vào chi tiết công nghệ JSP, chúng tôi có một vài so sánh
các công nghệ được sử dụng trong ứng dụng với các công nghệ khác.
I. So sánh JSP với các công nghệ khác.
I.1. JSP với ASP
ASP là công nghệ tương đương từ Microsoft. JSP có ba lợi thế so với
ASP.
- Phần động được viết bằng Java, chứ không phải bằng các ngôn ngữ
script như VBScript, JavaScript. Vì thế nó mạnh mẽ hơn tốt hơn đối với các
ứng dụng phức tạp cần các thành phần sử dụng lại.
- JSP chạy được trên nhiều hệ điều hành và web servers khác nhau
ngay cả với IIS của Microsoft (cần có plugins từ Webphere, JRun, ...)
- Hỗ trợ sự mở rộng tag với custom tag.
I.2. JSP với PHP
Lợi điểm của JSP với PHP cũng như với ASP. JSP được viết bằng Java
mà chúng ta đã biết với các API mở rộng cho mạng, truy cập cơ sở dữ liệu,
các đối tượng phân tán, … trong khi với PHP đòi hỏi chúng ta phải học cả
một ngôn ngữ mới.
II. Các thành phần script của JSP.
Các thẻ bọc mã trong JSP cho phép chúng ta chèn mã vào servlet mã
sẽ được phát sinh từ trang JSP. Có ba dạng sau:
Biểu thức có dạng <%= expressions %>, được đònh giá trò và chèn vào
luồng xuất của servlet.
Scriptlet có dạng <% code %>, được chèn vào phương thức
_jspService của servlet (được gọi là service).
Khai báo có dạng <%! code %>, được chèn vào thân của lớp servlet,
như là các field của lớp thông thường.
Template text
Template text
Trong nhiều trường hợp, phần lớn các trang JSP chỉ bao gồm HTML
tónh, được biết như là template text. Có hai ngoại lệ phụ cho quy tắc
“template text được chuyển thẳng sang HTML tónh”. Đầu tiên, nếu chúng
ta muốn có <% trong luồng xuất thì chúng ta cần phải đặt <\% trong
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 2
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
template text. Thứ hai, nếu chúng ta muốn có chú thích trong JSP mà không
có trong tài liệu kết quả, dùng:
<%-- JSP comments --%>
Chú thích HTML có dạng:
<!-- HTML comments -->
thì được chuyển qua tài liệu HTML thông thường.
Cú pháp XML
Cú pháp XML
Trong JSP có rất nhiều element có cú pháp XML như jsp:useBean,
jsp:include, jsp:setProperty, ... Tuy nhiên scripting elements lại có hai dạng
cú pháp sau:
JSP Syntax XML Syntax
<% =
Expressions %>
<jsp:expression>
Java code
</jsp:expression>
<% Scriptlets
%>
<jsp:scriptlet>
Java code
</jsp:scriptlet>
<%!
Declarations %>
<jsp:declaration>
Java code
</jsp:declaration>
II.1. Các biến được đònh nghóa sẵn trong JSP
Để đơn giản hoá mã trong các biểu thức hay scriptlets trong JSP,
người ta cung cấp cho chúng ta chín đối tượng đã được đònh nghóa trước, có
người còn gọi là các đối tượng ngầm đònh. Do các khai báo trong JSP nằm
ngoài phương thức _jspService (được gọi bởi service) nên các đối tượng này
không cho phép các khai báo truy cập vào.
request
Biến này có kiểu là javax.servlet.http.HttpServletRequest, có phạm vi
trong một yêu cầu (request). Nó cho phép chúng ta truy cập vào các tham
số của request như loại request (GET, POST, …) và các incoming HTTP
header (cookies).
response
Có kiểu là javax.servlet.http.HttpServletResponse, có phạm vi toàn
trang (page). Chú ý rằng vì luồng xuất thì thường làm vật đệm cho nên việc
gán mã tình trạng của HTTP và response header thì hợp lý trong JSP, mặc
dù điều này thì không được phép trong servlet một khi đã có luồng xuất nào
được gởi đến client.
out
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 3
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Có kiểu javax.servlet.jsp.JspWriter và phạm vi trong một trang (page).
Dùng để gởi các thông xuất đến client. Đối tượng out được dùng thường
xuyên trong scriptlets, các biểu thức tự động được đưa vào luồng xuất nên
hiếm khi cần tham chiếu đến đối tượng này.
session
Có phạm vi trong một phiên truyền (session) và kiểu tương ứng là
javax.servlet.http.HttpSession. Gọi về các phiên truyền được tạo tự động vì
thế biến này vẫn còn kết nối ngay cả chẳng có một tham chiếu incoming
session nào. Một ngoại lệ là nếu chúng ta sử dụng thuộc tính session của
page directive để tắc các phiên truyền, mà lại cố tham chiếu đến biến
session thì sẽ gây ra các lỗi vào lúc trang JSP được dòch thành servlet.
application
Biến này có kiểu là javax.servlet.ServletContext, có phạm vi trong
toàn ứng dụng (application). ServletContext lấy từ một đối tượng cấu hình
servlet là getServletConfig().getContext(). Các trang JSP có thể lưu trữ dữ
liệu persistent trong đối tượng ServletContext tốt hơn là trong các biến thể
hiện. ServletContext có các phương thức setAttribute và setAttribute mà cho
phép chúng ta lưu trữ dữ liệu
config
Biến này có phạm vi trang (page) và có kiểu tương ứng là
javax.servlet.ServletConfig.
pageContext
Biến này có kiểu là javax.servlet.jsp.PageContext và có phạm vi là
trang (page). pageContext cho phép một điểm truy cập duy nhất tới nhiều
thuộc tính của trang và cung cấp một nơi thuận tiện để lưu trữ dữ liệu dùng
chung. Biến pageContext lưu trữ giá trò của javax.servlet.jsp.PageContext
cùng với trang hiện hành. Có thể xem chi tiết trong chương II về
JavaBeans.
page
Biến này đồng nghóa với this và điều này thì không hữu ích trong
ngôn ngữ lập trình Java, có kiểu là java.lang.Object và có phạm vi trang
(page).
exception
Trong một trang lỗi, chúng ta có thể truy cập vào đối tượng exception.
Biến này có kiểu là java.lang.Throwable và phạm vò là trang (page).
II.2. Biểu thức trong JSP
Biểu thức trong JSP được dùng để chèn các giá trò trực tiếp vào luồng
xuất. Nó có dạng sau:
<%= Java expressions %>
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 4
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Biểu thức này được đònh trò, được chuyển thành chuỗi, và được chèn
vào trong trang. Sự đònh trò diễn ra ở thời gian runtime (khi trang được yêu
cầu) và do đó có đầy đủ quyền truy cập các thông tin của yêu cầu này. Ví
dụ sau đây mô tả ngày/giờ mà trang được yêu cầu:
Current time: <%= new java.util.Date() %>
Trong Java mỗi câu lệnh đều có dấu ‘;’ kết thúc dòng. Tại sao biểu
thức trong JSP lại không có dấu ‘;’? Vì biểu thức này được đưa vào luồng
xuất chẳng hạn như PrintWriter. Với ví dụ trên có thể chuyển vào servlet
như sau:
PrintWriter out = response.getWriter();
out.println(“Current time:” + new java.util.Date());
Biểu thức như là giá trò trong elements khác.
Biểu thức có thể được sử dụng trong các thuộc tính của các elements
khác. Giá trò từ các biểu thức này sẽ được tính vào thời gian yêu cầu
(request time). Các elements cho phép sử dụng biểu thức trong các thuộc
tính của chúng là:
Tên Element Tên thuộc tính
jsp:setProperty name và value
jsp:include Page
jsp:forward Page
jsp:param Value
II.3. JSP scriptlets
Scriptlets là những đoạn mã có chứa bất kỳ mã Java nào nằm giữa “<
%” và “%>”. Nếu chúng ta muốn thực hiện thứ gì đó phức tạp hơn là chỉ
chèn vào một biểu thức đơn giản thì JSP scriptlets cho phép chúng ta thêm
bất kỳ đoạn mã Java nào vào trang JSP. Các scriptlets này được đưa vào
phương thức _jspService (mà được gọi bởi service) của servlet. Có cú pháp:
<% Java Code %>
II.4. Khai báo trong JSP
Một khai báo trong JSP cho phép chúng ta đònh nghóa các phương thức
hoặc các trường (biến) có phạm vi toàn trang. Khai báo sẽ được chèn vào
trong lớp của servlet (bên ngoài phương thức _jspService được gọi bởi
service để xử lý một yêu cầu). Một khai báo có dạng sau:
<%! Java Code %>
Các khai báo trong JSP thì không phát sinh ra bất kỳ thông xuất nào,
chúng thường được dùng để liên kết với các biểu thức hoặc scriptlets.
Chẳng hạn, đây là một trang JSP mà in ra số lần truy cập vào trang.
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 5
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
III. Xử lý nhúng và chuyển hướng giữa các trang
Trong quá trình xử lý và chuyển dữ liệu cho form chúng ta có thể
nhúng và triệu gọi những trang JSP khác với trang hiện hành.Ví dụ chúng
ta có thể đưa một trang HTML hoặc JSP vào trong trang JSP hiện tại để hổ
trợ thêm thư viện hay tính năng bổ sung nào đó. Hay khi nhận được dữ liệu
submit từ trình khách, trang JSP nhận được dữ liệu có thể chuyển hướng
hoặc triệu gọi đến trang JSP khác.
III.1. Nhúng file vào trang với chỉ thi include
Chỉ thò <%include %> thường dùng để dem một nội dung file .html
hay jsp bên ngoài vào trang hiện hành. Cú pháp sử dụng như sau:
<%@include file = “filename”%>
Ví dụ: Trong chương trình chúng ta có sử dụng các hàm thư viện chứa
trong file Common.jsp. Thư viện này được đưa vào trang JSP hiện hành như
sau:
<%@include file = “Common.jsp”%>
III.2. Sử dụng thẻ <jsp:include>
Chỉ thò %@include % chỉ dùng để nhúng các mã nguồn tónh. Nếu
muốn nhúng kết quả kết xuất từ các trang jsp, servlet hay .html khác vào
trang hiện hành chúng ta sử dụng thẻ <jsp:include> với cú pháp như sau:
<jsp:page include page = “filename” flush = “true”/>
Ví dụ: trong chương trình sử dụng thẻ <jsp:include> để nhúng kết quả
của trang Header.jsp, Footer.jsp vào các trang JSP như sau:
<jsp:include page = “Header.jsp” flush = “true”/>
…
<jsp:include page = “Footer.jsp” flush = “true”/>
III.3. Chuyển tham số bằng thẻ <jsp:param>
Khi nhúng trang bằng thẻ <jsp:include> bạn có thể chuyển tham số
cho trang được nhúng để nhận được kết xuất linh động hơn bằng cách sử
dụng thẻ con <jsp:param>.
Ví dụ
testParam.jsp
<jsp: include page = “testParam2.jsp” flush = “true”>
<jsp:param name = “greeting” value = “Welcome”/>
<jsp:include>
<%
out.println (“Goi tham so từ test1.jsp”);
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 6
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
%>
testParam2.jsp
<%
String param = request.getParameter (“greeting”);
out.println (“Goi tham so tu test2.jsp”);
out.println (“param: “ + param);
%>
III.4. Chuyển tiếp đến trang khác với thẻ <jsp:include>
Chúng ta sử dụng thẻ <jsp:forward> để triệu gọi và chuyển dữ liệu
cho trang jsp khác xử lý. Trong ví dụ sau chúng ta có 3 trang JSP. Trang thứ
nhất hiển thò form đăng nhập yêu cầu nhập vào tên username và password.
Trang thứ hai kiểm tra: nếu username, password trùng với username,
password cho trước thì thông báo đăng nhập thành công, còn nếu không
đúng hoặc rỗng sẽ chuyển đến trang thứ 3 thông báo yêu cầu đăng nhập
những trường còn thiếu.
Ví dụ:
Login.jsp
<html>
<%
String param = request.getParameter (“sError”);
if (param.length() !=0)
{
out.println (“<b>”+ param + “</b>”);
}
%>
<form method = post action = “security.jsp”>
Username: <input type = text name = “username”>
Password: <input type = password name = “password”>
<input type = submit value = Login>
</form>
</html>
security.jsp
<html>
<%
String user = (String) request.getParametrer(“username”);
if (user.equals (“admin”))
{
%>
<jsp:forward page = “thongbao.jsp”/>
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 7
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
<%
} else {
%>
<jsp:include page = “login.jsp” flush = “true”>
<jsp:param name = “sError” value = “Ban nhap lai username &
password”/>
<jsp:include>
<%}%>
</html>
thongbao.jsp
<html>
Ban dang nhap voi usernam: <%=request.getParameter
(“username”)%>
Password: <%=request.getParameter (“password”)%>
</html>
III.5. Thẻ jsp:plugin
Phương cách đơn giản nhất để sử dụng jsp:plugin là cung cấp cho nó
bốn thuộc tính: type, code, width, height. Chúng ta đònh giá trò “applet” cho
thuộc tính type và ba thuộc tính còn lại sử dụng giống như APPLET tag bình
thường. Với ngoại lệ là các action thì có cú pháp XML nên các thuộc tính
trong nó cũng phải theo qui ước XML. Ví dụ với APPLET tag trong HTML
<APPLET CODE=“MyApplet.class”
WIDTH=457 HEIGHT=350>
</APPLET>
sử dụng jsp:plugin action như sau:
<jsp:plugin type=“applet”
code=“MyApplet.class”
width=“457” height=“350” />
Ngoài bốn thuộc tính này jsp:plugin còn có các thuộc tính sau và hầu
hết giống (nhưng không phải là tất cả) như các thuộc tính của APPLET tag.
codebase, align, archive, hspace, name, vspace, title
Giống như APPLET tag.
jreversion
Xác đònh số phiên bản của Java Runtime Environment, các giá trò có
thể nhận là “1.1”, “1.2”.
nspluginurl
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 8
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
URL cho Netscape mà có thể download Plug-In. Giá trò mật đònh sẽ
hướng người dùng đến web site của Sun, nhưng với intranet chúng ta có thể
muốn chỉ dẫn người dùng đến một bản sao cục bộ.
iepluginurl
URL cho Internet Explorer mà có thể download Plug-In.
III.6. Thẻ jsp:fallback
III.6. Thẻ jsp:fallback
jsp:fallback cung cấp văn bản thay thế đối với các trình duyệt không hổ trợ
OBJECT hay EMDEB. Chúng ta sử dụng action này giống như là dùng văn bản
thay thế được đặt trong APPLET tag
<APPLET CODE=“MyApplet.class”
WIDTH=457 HEIGHT=350>
<B> Error: this example requires Java. </B>
</APPLET>
với
<jsp:plugin type=“applet”
code=“MyApplet.class”
width=“457” height=“350” >
<jsp:fallback>
<b> Error: this example requires Java. </b>
</jsp:fallback>
</jsp:plugin>
III.7. Chuyển trang
III.7. Chuyển trang
page directive cho phép chúng ta điều khiển cấu trúc của servlet bằng
cách đưa vào các lớp, đặt MIME type, …. Một page directive có thể được
đặt bất cứ nơi nào trong trang JSP.
<%@ page import=“java.util.*, com.vandau.*” %>
page directive đònh nghóa một số thuộc tính phụ thuộc vào trang và giao tiếp
giữa các thuộc tính này với JSP container.
language
Đònh nghóa ngôn ngữ kòch bản được sử dụng trong scriptlets, biểu
thức và khai báo. Trong JSP 1.2 là phiên bản mới nhất chỉ có hổ trợ “java”
cho thuộc tính này do đó “java” này cũng là giá trò mật đònh.
<%@ page language=“java” %>
extends
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 9
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Thuộc tính này chỉ đònh lớp cha (superclass) của servlet sẽ được phát
sinh cho trang JSP, có dạng sau:
<%@ page extends=“package.class” %>
Chú ý rằng khi sử dụng thuộc tính này phải hết sức cẩn thận vì tại
server có thể đã dùng lớp cha mật đònh.
import
Thuộc tính này mô tả các kiểu sẵn dùng trong môi trường kòch bản
(theo java). Chúng ta có thể import vào từng lớp hoặc cả một gói
(package).
<%@ page import=“package.class | package.*” %>
Nếu import vào nhiều lớp hay packages thì cách nhau dấu “,”.
session
Thuộc tính session kiểm soát liệu có hay không một trang tham gia
vào HTTP session. Có hai giá trò “true” và “false”. Mật đònh là “true”, chỉ
ra rằng biến ngầm đònh session nên được nối kết với session hiện hành. Giá
trò “false” có nghóa rằng chẳng có session nào được sử dụng tự động và nếu
cố truy cập vào biến session sẽ trả lỗi vào lúc trang được dòch thành servlet.
buffer
Thuộc tính này xác đònh kích thước của vùng đệm được sử dụng bởi
biến out. Có dạng sau:
<%@ page buffer=“none | sizekb” %>
Thuộc tính này có giá trò mật đònh là “8kb”, giá trò “none” chẳng có
vùng đệm nào được cấp và tất cả dữ liệu xuất sẽ được ghi trực tiếp qua
ServletResponse, PrintWriter.
autoFlush
Xác đònh liệu luồng xuất có vùng đệm được tự động flush (giá trò
“true” mật đònh) khi vùng đệm đầy hay sẽ tung ra một ngoại lệ khi vùng
đệm tràn (“false”).
Chú ý rằng sẽ không hợp lý nếu đặt autoFlush=“false” khi
buffer=“none”.
isThreadSafe
Xác đònh mức độ an toàn của tiểu trình (thread) được cài đặt trong
trang (với giao tiếp SingleThreadModel), “true” là giá trò mật đònh.
info
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 10
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Đònh nghóa một chuỗi có thể truy xuất từ servlet bằng phương thức
getServletInfo().
<%@ page info=“Some Message” %>
errorPage
Thuộc tính này xác đònh một trang JSP nên bất kỳ các ngoại lệ nào
được tung ra nhưng không bắt ngoại lệ này trong trang hiện hành.
<%@ page errorPage=“Ralative URL” %>
Ngoại lệ tung ra sẽ có sẵn trong biến ngầm đònh exception.
isErrorPage
Xác đònh trang JSP hiện thời có thể hoạt động như một trang lỗi cho
một trang JSP khác. Giá trò “false” là mật đònh cho thuộc tính này.
contentType
Thuộc tính này gán Content-Type cho response header, mô tả kiểu
MIME của tài liệu được gởi đến client. Thuộc tính contentType có một
trong hai dạng sau:
<%@ page contentType=“MIME-Type” %>
<%@ page contentType=“MIME-Type; charset=Character-Set” %>
Một số kiểu MIME-Type thường dùng: “text/html”, “text/xml”,
“text/plain”, “image/gif”, “image/jpeg”.
pageEncoding
Đònh nghóa bộ mã hóa ký tự cho trang JSP (character encoding), thuộc
tính này hổ trợ cho bộ mã Unicode và Latin-1, có giá trò mật đònh là “ISO-
8859-1”
III.8. Chuyển hướng sang trang mới với sendRedirect()
Ngoài việc chuyển tiếp chúng ta có thể sử dụng phương thức
sendRedirect() để chuyển hướng và triệu gọi trang JSP khác xử lý. Sự khác
nhau giữa chuyển tiếp (forward) và chuyển hướng (redirect) đó là lệnh
sendRedirect () chỉ thực hiện triệu gọi trang mà không chuyển tham số của
trang hiện hành cho trang chuyển hướng.
Ví dụ: từ trang security.jsp ta có thể chuyển hướng đến trang
thongbao.jsp bằng lệnh như sau:
<%
…
response.sendRedirect (“thongbao.jsp”);
%>
IV. SERVLET
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 11
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
IV.1. Khái niệm
Servlet là các thành phần đối tượng nhúng trên trình chủ Web server
thực hiện xử lý yêu cầu và sinh ra các trang Web động trả về máy khách.
Để sử dụng được Servlet chúng ta cần có các trình chủ hiểu Java và hỗ trở
triệu gọi Servlet như Apache, Jrun, Web Logic ….
Ví dụ sau là một Servlet cơ bản
import javax.servlet.*;
import java.io.*;
public class helloWorldServlet extends GnericServlet
{
public void service (ServletRequest request, ServletResponse
response) throws IOException
{
response.setContextType (“text/html”);
PrintWriter out = response.getWriter ();
out.println (“<html>”);
out.println (“<body>”);
out.println (“<h1> Hello World Servlet! </h1>”);
out.println (“</body>”);
out.println (“</html>”);
}
}
IV.2. Các phương thức xử lý cơ bản của Servlet
Lớp GenericServlet là phần cài đặt tổng quát cho đặc tả giao tiếp
(interface) mang tên Servlet. Theo đặc tả của giao tiếp Servlet do Sun
đưa ra một servlet cơ bản cần có những phương thức phục vụ cho các
nhu cầu khởi tạo (init), hoạt động và phục vụ (service), hủy (destroy),
trả về thông tin cấu hình (getServletConfig), trả về thông tin tư thân của
servlet (getServletInfo). Cụ thể lớp giao tiếp Servlet được mô tả như
sau:
interface Servlet
{
void destroy ()
ServletConfig getServletConfig ();
String getServletInfo ();
void init (ServletConfig config);
void service (ServletRequest req, ServletResponse res);
}
IV.2.1. Phương thức khởi tạo init ()
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 12
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
public void init ()
Phương thức khởi tạo này được gọi khi lần đầu tiên trình chủ Web
server nạp mã thực thi của servlet từ tập tin .class vào bộ nhớ và bắt đầu
cho phép servlet hoạt động. Chúng ta có thể dựa vào phương thức này để
khởi tạo các biến môi trường và giá trò ban đầu cần thiết cho quá trình thực
thi servlet sẽ diễn ra tiếp theo. Thường trong phương thức init () ta khởi tạo
giá trò mảng, tạo sẵn kết nối với cơ sở dữ liệu, nạp các lớp thư viện cần
thiết…. Ví dụ chúng ta có thể nạp trình điều khiển JDBC truy xuất cơ sở dữ
liệu, tạo sẵn kết nối đến nguồn dữ liệu cho servlet trong phương thức init ()
như sau:
public class staffView extends GenericServlet
{
String DBDriver = “sun.jdbc.odbc.JdbcOdbcDriver”;
String strConn = “jdbc:odbc:quanliNV”;
Connection con;
public init ()
{
Class.forName (DBDriver). newInstance ();
Conn = DriverManager.getConnection (strConn);
}
}
IV.2.2. Phương thức phục vụ service ()
public void service (ServletRequest req, ServletResponse res) throws
IOException
Sau khi phương thức init () đã hoàn tất, trình chủ Web server sẽ triệu
gọi đến phương thức phục vụ service (). Phương thức này được xem là trung
tâm xử lý của servlet mà chúng ta cần phải cài đặt. Khi trình chủ nạp
servlet vào bộ nhớ, phương thức init () chỉ được gọi duy nhất một lần trong
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ừ trình duyệt phía máy khách. Bên trong phương thức
service () chúng ta có thể sử dụng đối tượng tham số ServletRequest và
ServletResponse để tiếp nhận dữ liệu từ trình khách chuyển lên và kết xuất
kết quả phản hồi trở lại trình khách.
Ví dụ:
public void service (ServletRequest request, ServletResponse
response) throws IOException
{
response.setContextType (“text/html”);
PrintWriter out = response.getWriter ();
out.println (“<html>”);
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 13
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
out.println (“<body>”);
…
}
IV.2.3. Phương thức hủy destroy ()
Khi servlet không còn dùng nữa hoặc hết thời gian qui đònh lưu giữ
trong bô nhớ của trình chủ Web server, nó sẽ bò trình chủ giải phóng. Trước
khi servlet bò hủy phươg thức destroy () sẽ được gọi. Nếu như chúng ta dùng
phương thức init () để thực hiện khởi tạo biến cho servlet thì phương thức
destroy () ngược lại 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ở…
Ví dụ: public destroy ()
{
conn.close ();
}
IV.2.4. Phương thức getServletConfig () và getServletInfo ()
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, getServletInfo () trả về một chuỗi thông tin mô tả ý nghóa và mục
đích của servlet.
public String getServletInfo ();
public ServletConfig getServletConfig ();
IV.3. Chu trình sống của Servlet và JSP
Chu trình sống của servlet
Chu trình sống tính từ khi servlet bắt đầu được hệ thống gọi nạp vào
bộ nhớ cho đến khi nó bò loại khỏi trình chủ Web server vì không còn cần
đến nữa. Quá 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
Nạp servlet
Tùy theo điều kiện, một servlet có thể nạp vào bộ nhớ ở 3 thời điểm
khác nhau: khi server khởi động, khi ngừoi quả 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 điề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
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 14
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
động. Tuy tốn ít thời gian hơn nhưng sau đó servlet đã trong trạng thái sẵn
sàng có thể phục vụ trình khách bất kỳ lúc nào.
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. Chúng
ta 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.
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 (). Ví dụ khi chúng ta gọi
trực tiếp servlet từ đòa chỉ URL, phương thức doGet () của servlet sẽ được
gọi. Nếu chúng ta gọi servlet thông qua thao tác post cua thẻ <form> thì
phương thức doPost () sẽ được gọi. 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 các 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 các
ứng dụng CGI.
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ớ. Ví dụ như khi nhà quản trò muốn dừng hệ thống, muốn
Webserver khởi động lại để giải phóng rác trong bộ nhớ tăng hiệu suất
thực hiện…. Trước khi chấm dứt, Web server sẽ gọi đến phương thức hủy
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 chúng ta đã cấp
phát một khối lượng bộ nhớ lớn cho servlet trong quá trình làm việc, chúng
ta nên thực hiện giải phóng chúng trong phương thức destroy ().
Chu trình sống của JSP
Tương tự như chu trình sống của servlet, trang JSP cũng có cbhu trình
sống xác đònh tính từ khi hệ thống đọc biên dòch trang JSP, gọi thực thi và
loại trang khỏi bộ nhớ. Chu trình sống của JSP trải qua các giai đoạn sau:
• Biên dòch trang JSP
• Nạp trang
• Khởi tạo
• Thực thi
• Dọn dẹp
Biên dòch trang JSP
Khi trình duyệt yêu cầu trang JSP, ví dụ triệu gọi trang JSP bằng URL
http://localhost:8100/Default.jsp. Web server sẽ kiểm tra trang JSP đã được
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 15
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
biên dòch hay chưa. Nếu chưa biên dòch hoặc đã biên dòch nhưng trang JSP
mới vừa thay đổi trong mã nguồn thì Web server sẽ thực hiện biên dòch
trang JSP. Quá trình biên dòch JSP thực tế là chuyển trang JSP thành
servlet. File biên dòch . class của trang sẽ được đặt trong thư mục đệm. Như
chúng ta thấy, quá trình biên dòch trang chỉ diễn ra một lần. Nếu trang đã
biên dòch và sau đó chúng ta không có thay đổi gì trong trang nguồn thì quá
trình biên dòch sẽ không xảy ra, do đó tốc độ thực thi trang sẽ nhanh hơn.
Sau khi trang đã được biên dòch, mã trang sẽ được nạp vào bộ nhớ để thực
thi.
Nạp trang
Kể từ giai đoạn này, quá trình nạp trang tương tư như servlet. Chỉ có
một khác biệt đó là servlet chỉ được nạp một lần trong khi mã trang JSP
mặc dù đã biên dòch nhưng phải nạp lại nhiều lần mỗi khi Web server nhận
được yêu cầu trang từ trình duyệt.
Khởi tạo
Khi nạp mã trang thành công, Web server sẽ gọi đến phương thức
khởi tạo trang. Và mặc dù, JSP được biên dòch ra servlet như phương thức
khởi tạo cho trang JSP lại mang tên jspInit () chứ không phải là init () như
servlet.
Thực thi
Sau quá trình khởi tạo, Web server sẽ gọi đến phương thức
_jspService (). Phương thức _jspService sẽ chuyển cho chúng ta hai lớp đối
tượng HttpServletRequest và HttpServletResponse để đọc và ghi kết xuất
trả về trình khách.
Dọn dẹp
Khi trang JSP đã thực thi xong, trình chủ Web server sẽ gọi phương
thức jspDestroy () để giải phóng mã trang khỏi bộ nhớ. Tương tự như trong
servlet, chúng ta có thể cài đặt phương thức jspDestroy () thực hiện chức
năng giảp phóng vùng nhớ hoặc đóng kết nối trả tài nguyên về cho hệ
thống.
IV.4. Ưu và khuyết điểm của Servlet so với JSP
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 chúng ta cũng nên biết một số
trường hợp 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 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 chúng ta 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
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 16
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
tạp, việc bảo trì và nâng cấp ứng dụng Web với hàng trăm 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ã JSp sẽ rất khó khăn. Trong qua 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ả. Khó có thể tách rời giữa công việc viết mã cho ứng dụng và nhóm xây
dựng giao diện. Mã trang JSP ở dạng thuần văn bản nên thường không che
được mã nguồn của logic chương trình.
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. Chúng ta chủ cần cung cấp cho trình chủ
Web server bản servlet nhò phân (file .class) đã qua bước biên dòch mã
không cần đến mã nguồn của servlet ban đầu. Mặc khác, các servlet có thể
tương tác liên hoàn, với nhau để tạo nên những kết xuất tùy 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 nhau như các thành phần riêng biệt
để ráp lại trong 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 () hoặc 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 lệnh print () hay println () rất khó quản lý.
Quyết đònh sử dụng JSP, Servlet hay kết hợp cả hai là tuỳ vào từng dự
án và mục đích của chương trình mà chúng ta muốn phát triển. Thông
thường đối với những dự án nhỏ, yêu cầu thời gian nhanh, JSP là lưa chọn
thích hợp nhất. Trường hợp với dự án cần sự độc lập và chỉ thiên về xử lý
ta nên sử dụng servlet. Trường hợp với dự án lớn chúng ta nên kết hợp cả
servlet và JSP. Mô hình kết hợp tốt nhất giữa servlet và JSP thường được
gọi là MCV (Model – View – Controler) trong đó servlet đóng vai trò trung
tâm điều khiển (controler) đưa ra các quyết đònh xử lý. JSP đóng vai trò thể
hiện giao diện hay hiển thò dữ liệu đã xử lý. Quy trình tính toán logic của
ứng dụng được giao lại cho các thành phần JavaBean hay EJB.
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 17
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Chương II
Tag Libraries
Tag Libraries
I.
I.
Tag library là gì ?
Tag library là gì ?
Trong kỹ thuật JavaServer Pages, các action là các element có thể tạo
ra và truy cập vào các đối tượng của ngôn ngữ lập trình và xuất vào những
luồng xuất chuẩn như màn hình, máy in,… JSP đònh nghóa ra chín action
chuẩn mà phải được cung cấp bởi bất kỳ engine nào.
Ngoài các action chuẩn này, từ JSP v1.1 trở lên cho phép xây dựng và
phát triển các module có thể dùng lại được gọi là custom action. Trong
trang JSP, một custom action được triệu gọi bằng cách dùng custom tag.
Một tag library là một tập các custom tag.
Các ứng dụng có thể được thực hiện bằng custom action bao gồm xử
lý form, truy cập cơ sở dữ liệu và các dòch vụ ở mức xí nghiệp khác như
email, quản lý thư mục và điều khiển luồng. Trước khi custom action xuất
hiện thì JSP có một cơ chế dùng lại mã là các thành phần JavaBean kết
hợp với scriplet. Tuy nhiên với JavaBean có một bất lợi là xây dựng phức
tạp và khó quản lý.
Các custom action làm dòu được vấn đề này bằng cách mang lại các
lợi ích dưới góc độ khác của việc module hoá tính sử dụng lại cho các trang
JSP. Các custom action gói gọn lại các tác vụ để chúng có thể được dùng
lại trong hơn một ứng dụng và tăng hiệu xuất bằng cách khuyến khích phân
chia công việc giữa các nhà phát triển thư viện và người sử dụng thư viện.
Các tag library của JSP được tạo bởi các nhà phát triển, là người thành thạo
ngôn ngữ lập trình Java và là chuyên gia trong giao tiếp với cơ sở dữ liệu
và các dòch vụ khác. Các tag library được dùng bởi các nhà thiết kế ứng
dụng web, là người có thể chỉ tập trung vào cách thức hiển thò hơn là quan
tâm đến cách truy cập cơ sở dữ liệu và các dòch vụ khác.
Một số đặt tính của các custom tag là:
- Chúng có thể được tuỳ biến thông qua các thuộc tính từ một trang
đang gọi.
- Chúng được phép truy cập vào tất cả đối tượng có sẵn trong trang
JSP.
- Chúng có thể thay đổi lời đáp mà được phát sinh bởi một trang
đang gọi.
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 18
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
- Chúng có thể được lồng với nhau và cho phép các tương tác phức
tạp trong một trang.
- Chúng có thể truyền thông với nhau. Chúng ta có thể tạo và khởi
tạo một thành phần JavaBean, tạo một biến tham chiếu đến Bean đó trong
một tag và sau đó sử dụng Bean này trong tag khác.
II.
II.
Cách dùng các tags trong JSP
Cách dùng các tags trong JSP
Phần này trình bày cách thức mà tác giả của trang web sử dụng tag
library trong JSP và giới thiệu các loại tag khác nhau. Các ví dụ trong phần
này sẽ được đònh nghóa trong phần III.
II.1. Khai báo các tag library
II.1. Khai báo các tag library
Trang JSP sẽ sử dụng các tag được đònh nghóa trong một tag library
bằng cách đưa vào taglib directive trong trang trước bất kỳ custom tag được
sử dụng:
<%@ taglib uri = ‘/tlt’ prefix = ‘tlt’ %>
Thuộc tính uri tham chiếu tới URI đó là đònh danh duy nhất cho tag
library. URI có thể là URI tương đối hay tuyệt đối. Nếu URI tương đối thì
nó phải được ánh xạ đến một URI tuyệt đối trong taglib element của bộ mô
tả triển khai ứng dụng Web, tập tin cấu hình này cùng với ứng dụng Web
được phát triển theo bản đặt tả Java Servlet và JavaServer Pages.
Thuộc tính prefix đònh nghóa một tiếp đầu ngữ để phân biệt với các
tag library khác, do đó thuộc tính này giải quyết được vấn đề xung đột về
các tên tag.
II.2. Các loại tag
II.2. Các loại tag
Những custom action được diễn đạt bằng cú pháp XML. Chúng có
start tag, nội dung và end tag:
<tlt:tag>
body
</tlt:tag>
Một tag mà không có nội dung được biểu diễn như sau:
<tlt:tag />
II.2.1. Các tag đơn giản
II.2.1. Các tag đơn giản
Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello
World.”.
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 19
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
<tlt:helloWorld />
II.2.2. Các tag có thuộc tính
II.2.2. Các tag có thuộc tính
Một start tag của custom action có thể chứa các thuộc tính dưới dạng
attr = ‘value’. Các thuộc tính này tuỳ biến các tham số dùng trong các
phương thức của một lớp java.
Các thuộc tính có thể được gán một hay nhiều tham số trong một đối
tượng request hoặc từ một hằng chuổi. Chỉ có các kiểu thuộc tính trong
bảng sau mới có thể được gán từ các giá trò tham số của request và của các
hằng chuổi
Kiểu thuộc tính
Kiểu thuộc tính
Phương thức valueOf chuyển chuổi
Phương thức valueOf chuyển chuổi
boolean or Boolean java.lang.Boolean.valueOf(String)
byte or Byte java.lang.Byte.valueOf(String)
char or Character java.lang.Character.valueOf(String)
double or Double java.lang.Double.valueOf(String)
int or Integer java.lang.Integer.valueOf(String)
float or Float java.lang.Float.valueOf(String)
long or Long java.lang.Long.valueOf(String)
Giá trò thuộc tính có dạng <%= expression %> được tính vào thời gian
yêu cầu. Giá trò của biểu thức tuỳ thuộc vào kiểu thuộc tính được xác đònh
trong đối tượng cài đặt tag còn gọi là tag handler (tag handler trong phần
đònh nghóa các tag).
<tlt:helloWorld name=’Phan Van Dau’/>
II.2.3. Các tag có nội dung
II.2.3. Các tag có nội dung
Tag có thể bao hàm các custom tag, scripting element, HTML, và nội
dung nằm giữa start tag và end tag. Trong ví dụ sau sẽ đưa ra thông tin “lời
chào” được cung cấp trong thân tag thay vì trong thuộc tính của nó.
<tlt:helloWorld>
Phan Van Dau
</tlt:helloWorld>
i.
i.
Các tag đònh nghóa các biến kòch bản
Các tag đònh nghóa các biến kòch bản
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 20
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Một tag có thể đònh nghóa ra một biến mà biến này được dùng trong
cùng một trang. Ví dụ sau đây minh hoạ cách thức đònh nghóa và sử dụng
một biến chứa một đối tượng được trả về.
ii.
ii.
Kết hợp các tag
Kết hợp các tag
Các tag kết hợp với nhau bằng các phương pháp của các đối tượng
dùng chung. Trong ví dụ sau, tag1 tạo một đối tượng có tên là obj1, sau đó
được sử dụng lại bởi tag2. Qui tắc này được khuyến khích bởi bảng đặt tả
JSP, một tag tạo ra một tên với thuộc tính id và tag thứ hai có thuộc tính
name để dùng lại tên này.
<tlt:tag1 id=’obj1’ attr2=’value’/>
<tlt:tag2 name=’obj1’/>
Trong ví dụ kết tiếp, dùng các tag lồng nhau tương tự như trong XML
và HTML.
<tlt:outerTag>
<tlt:innerTag />
<tlt:outerTag>
iii.
iii.
Đònh nghóa các tag
Đònh nghóa các tag
Để sử dụng các custom tag trong trang JSP, chúng ta cần phải đònh
nghóa ba thành phần riêng biệt:
♦ Phát triển tag handler và các lớp trợ giúp cho tag.
♦ Khai báo tag trong bộ mô tả thư viện tag (tag library
descriptor) dưới dạng tập tin XML.
♦ Tạo tập tin JSP có sử dụng custom tag.
Phần này mô tả các thuộc tính của tag handler và các bộ mô tả thư
viện tag, cũng trình bày cách phát triển tag handler và các element của bộ
mô tả thư viện đối với mỗi loại tag được giới thiệu trong phần trước.
II.3. Tag handler
II.3. Tag handler
Tag handler là một đối tượng được gọi lên bởi JSP container để đònh
trò cho custom tag trong xuốt quá trình thực thi của trang JSP có tham chiếu
tới một tag nào đó. Các phương thức của tag handler được gọi bởi lớp cài
đặt trang JSP vào các thời điểm khác nhau trong xuốt quá trình đònh trò cho
tag.
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 21
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
Khi gặp start tag của custom tag thì lớp cài đặt trang JSP gọi các
phương thức để khởi tạo các giá trò thích hợp và sau đó triệu gọi phương
thức doStartTag. Khi gặp end tag của custom tag thì phương thức doEndtag
được gọi.
Tuỳ theo mục đích của từng custom tag mà chúng ta xử lý các phương
thức thích hợp trong từng giao tiếp cài đặt. Bảng sau mô tả các loại tag có
các phương thức tương ứng để xử lý.
Loại tag handler
Loại tag handler
Các phương thức cần xử lý
Các phương thức cần xử lý
Simple
doStartTag, doEndTag, release
Attributes
doStartTag, doEndTag,
set/getAttribute1...N
Body, No Interaction
doStartTag, doEndTag, release
Body, Interaction
doStartTag, doEndTag, release,
doInitBody, doAfterBody
Tag handler có sự truy cập vào API mà cho phép nó truyền thông với
trang JSP. Con đường vào API này là đối tượng pageContext, qua đó tag
handler có thể truy cập vào mọi đối tượng ngầm đònh khác như request,
session, application từ trang JSP. Các đối tượng ngầm đònh có thể có các
thuộc tính kết hợp với chúng. Các thuộc tính như thế được truy cập qua các
phương thức [get/set]Attribute thích hợp.
Nếu tag được lồng nhau thì tag handler cũng có thể truy cập handler
này (được gọi là parent) cùng với toàn bộ tag.
Các tag handler phải được cài đặt hai giao tiếp hoặc Tag hoặc
BodyTag. Các giao tiếp có thể được dùng để lấy đối tượng Java đã tồn tại
và tạo ra một tag handler. Để đònh nghóa các tag handler mới chúng ta có
thể dùng các lớp TagSupport và BodyTagSupport như là các lớp cơ sở (xem
4. Tag handler được triệu gọi như thế nào?).
II.4. Tag library descriptor
II.4. Tag library descriptor
Tag library descriptor (TLD) là một tài liệu XML dùng để mô tả thư
viện tag. Một TLD chứa toàn bộ thông tin về thư viện và mỗi tag chứa
trong thư viện. JSP container và các công cụ phát triển JSP sử dụng TLD
để xác đònh các tag.
Các element của TLD sau dùng để đònh nghóa thư viện tag:
HelloWorldTag.java
<?xml version="1.0" encoding="ISO-8859-1" ?>
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 22
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.1//EN"
" /><!-- a tag library descriptor -->
<taglib>
<tlibversion> <!-- Phiên bản của thư viện tag -->
<!-- Phiên bản của JSP mà tag handler phụ thuộc -->
<jspversion>
<!--Tên mặt đònh đơn giản có thể dùng bởi công cụ tạo trang JSP
để tạo tên với giá trò gợi nhớ; chẳng hạn shortname có thể được
dùng như giá trò tiếp đầu ngữ thích hợp trong taglib directive
và/hoặc tạo ra các tiếp đầu ngữ cho các id -->
<shortname>
<uri> <!-- URI duy nhất xác đònh tag library -->
<info> <!-- Thông tin mô tả về tag library -->
<tag> ... </tag> ... </taglib>
Tag element yêu cầu đối với mọi tag để xác đònh một lớp có
trong thư viện tag.
<tag>
<tagclass>classname</tagclass>
...
</tag>
II.5. Các ví dụ
II.5. Các ví dụ
Để tạo các custom tag chúng ta cần hai import gói cơ bản:
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*; // tag extension
1. Các tag đơn giản.
-
-
Tag handler
Tag handler
Đối với các tag đơn giản chỉ cần cài đặt hai phương thức của giao tiếp
Tag là doStartTag và doEndTag. doStartTag được triệu gọi khi JSP
container gặp start tag, nó trả về SKIP_BODY vì thân tag chẳng có nội
dung nào cả. Ngược lại khi gặp end tag thì JSP container gọi doEndTag, trả
về EVAL_PAGE nếu phần còn lại của trang cần phải đònh trò, nếu không
trả về SKIP_PAGE.
Lớp tag handler sẽ được cài đặt như sau:
HelloWorldTag.java
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 23
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
public HelloWorldTag extends TagSupport {
public int doStartTag() throws JspException {
try { pageContext.getOut().print("Hello World.");
} catch (Exception ex) {
throw new JspTagException("HelloWorldTag: " +
e.getMessage());
}
return SKIP_BODY;
}
public int doEndTag() {
return EVAL_PAGE;
}
}
-
-
TLD element
TLD element
Các tag mà không có thân phải khai báo nội dung của thân là rỗng.
helloworld.tld
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
" /><!--Nếu có JSP v1.2 thì đổi lại
" /><!-- a tag library descriptor -->
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>vandau</shortname>
<uri></uri>
<info>
A tag library from authors at http://localhost:8100/
</info>
<tag>
<name>helloWorld</name>
<tagclass>HelloWorldTag</tagclass>
<info>Ví dụ với tag đơn giản nhất</info>
<!-- ‘EMPTY’ is insensitive case -->
<bodycontent>EMPTY</bodycontent>
</tag>
<!-- Other tags defined later... -->
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 24
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
</taglib>
-
-
JSP page
JSP page
hello.jsp
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html>
<head>
hello.jsp (tiếp theo)
<%@ taglib uri = "helloworld.tld" prefix = "vandau" %>
<title>
<vandau:helloWorld />
</title>
<!-- stylesheet để hiển thò các tag như h1, …-->
<link rel = "stylesheet" href ="JSP-Styles.css" type =
"text/css"/>
</head>
<body>
<h1><vandau:helloWorld /></h1>
<vandau:helloWorld />
</body>
</html>
II.5.1. Các tag có thuộc tính
II.5.1. Các tag có thuộc tính
-
-
Đònh nghóa các thuộc tính trong
Đònh nghóa các thuộc tính trong
tag handler
tag handler
.
.
Đối với mỗi thuộc tínch của tag, chúng ta phải đònh nghóa theo phong
cách của JavaBean, tức là phải có phương thức get/set[Attribute] trong tag
handler.
Hãy nhớ rằng, nếu thuộc tính được đặt tên là id và tag handler kết
thừa từ lớp TagSupport thì chúng ta không cần đònh nghóa các phương thức
get/set[Attribute] bởi vì những thứ này đã được TagSupport làm sẵn.
Lớp tag handler sẽ được cài đặt như sau:
HelloWorldTag.java
public HelloWorldTag extends TagSupport {
private String name = “World.”;
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 25