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.
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
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:
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
<% 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
LUẬN VĂN TỐT NGHIỆP Khóa 1998-2003
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
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.
III. Xử lý nhúng và chuyển hướng giữa các 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
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”%>
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>
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
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
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 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>
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
Đònh nghóa một chuỗi có thể truy xuất từ servlet bằng phương thức
getServletInfo().
thongbao.jsp bằng lệnh như sau:
<%
…
response.sendRedirect (“thongbao.jsp”);
%>
IV. SERVLET
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
{
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
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>”);
}
}
{
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>”);
out.println (“<body>”);
• 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
độ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
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
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
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
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
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ả
ứ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
<%@ 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 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.
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" ?>
<!DOCTYPE taglib
SVTH: Phan Văn Đấu GVHD: Nguyễn Hồng Quang Trang 22
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
public HelloWorldTag extends TagSupport {
public int doStartTag() throws JspException {
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
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 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
.
.