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ịc
Trang 1Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
JavaServer Pages (JSP) là một kỹ thuật server-side do đó chúng ta khôngthể thực hiện bất kỳ hành động nào ở client JSP cho phép chúng ta tách thànhphần động của trang ra khỏi thành phần tĩnh HTML Rất đơn giản, chúng tachỉ 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 jsp book.” với URL là http://www.jsp.com/thank.jsp?
title= jsp
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ônngữ 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 SunMicroSystem 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 Javacho 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áctình huống mà cấu trúc nền tảng của trang HTML là cố định nhưngcá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ọicông việc, lưu trữ các kết quả trong các Beans và điều phối yêu cầu
Trang 2Cả ba định hướng này đều có chổ đứng của nó Chẳng có định hướng nàohổ 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áccông nghệ được sử dụng trong ứng dụng với các công nghệ khác
I Một số so sánh các công nghệ được sử dụng với công nghệ khác?
MySQL là hệ quản trị cơ sở dữ liệu quan hệ Cơ sở dữ liệu là một tậpdữ liệu có cấu trúc và được lưu trữ trong các bảng riêng biệt, mỗi bảng đượclưu trong ba files với tên cơ sở dữ liệu là tên thư mục chứa các files đó SQLđược viết tắt từ Structured Query Language, là ngôn ngữ chuẩn phổ biến nhấtđể truy cập cơ sở dữ liệu Sau đây là một số ưu và nhược điểm của MySQLvới các hệ quản trị cơ sở dữ liệu khác:
- Theo một số web site thống kê, việc thực hiện các lệnhinsert, update, delete nhanh nhất trong các hệ quản trị
- Miễn phí và mã nguồn mở (open source code)
b) Khuyết điểm.
- Chưa hổ trợ một số chuẩn ANSI SQL92 như không chocác câu select lồng nhau, select into table, khoá ngoại, triggers,stored procedures,…
- Không có môi trường đồ hoạ
2 So sánh JSP với các công nghệ khác.
a) JSP với ASP.
ASP là công nghệ tương đương từ Microsoft JSP có ba lợi thế so vớiASP
Trang 3SGML HTML
XML
CDF SMIL
CML MML
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
- Phần động được viết bằng Java, chứ không phải bằngcá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 serverskhá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
b) 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ằngJava 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
3 Tầm quan trọng của XML cùng với XSLT.
a) XML.
XML là tập con của SGML, nó kết hợp tính linh động và sức mạnhcủa SGML cùng với một số tính năng hữu ích của HTML Vì XML là tập concủa SGML nên nó cũng tương thích với các hệ thống dựa vào SGML đã có.XML là lực đẩy cho các nghi thức trên internet và các phần mềm để dễ dàngxử lý và truyền dữ liệu
Ở trên đã nói XML là tập con của SGML và HTML là một sự cài đặtcủa SGML, mô hình sau đây diễn tả mối quan hệ giữa các ngôn ngữ và cácsiêu ngôn ngữ:
Metalanguages Languages
Implementation
subset
Implementation
Trang 4CDF : Channel Difinition Format – cho phép các tác giả của các Web sitescho phép các người đăng ký biết khi nào Web site này thay đổi, CDF đã được giớithiệu trong IE4 vì vậy nó chỉ làm việc với IE của Microsoft.
SMIL : Synchronized Multimedia Integration Language – được sử dụng đểđồng bộ hóa các dòng dữ liệu đa truyền thông được truyền qua internet
CML : Chemical Markup Language – mô tả các công thức hóa học
MML: Mathematical Markup language- mô tả các phương trình, biểu thứctoán học
Tính tự mô tả dữ liệu của XML : các tags mô tả các vấn đề, các đối
tượng gần gủi với thế giới thực Chúng ta sẽ thấy rõ hơn với hai ví dụ sau, đâylà ví dụ minh họa nên nó còn thiếu nhiều thuộc tính trong thế giới thực :
- XML có mối quan hệ chặt chẽ với JSP, đặt tả JSP hổ trợ cú phápXML, chúng ta có thể trộn lẫn mã chúng với nhau dễ dàng như JSP với HTMLnhư thế chúng ta có thể dùng JSP tự động phát sinh trang XML
- Hiện nay có rất nhiều sản phẩm quản trị cơ sở dữ liệu mà mỗi sảnphẩm đều có các đặc tính riêng nó, do đó khi các cơ sở dữ liệu khác nhau cầnchuyển đổi dữ liệu với nhau lại không tương thích Vì vậy người làm công việcnày cần phải biết nhiều sản phẩm quản trị cơ sở dữ liệu khác nhau Do đó
Ví dụ với XML tags
Trang 5Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
XML là một định dạng chuẩn mà các hệ quản trị cần hổ trợ Hiện nay cónhiều hệ quản trị lớn hổ trợ XML như MS SQL Server, Oracle, …
b) XSLT.
Extensible Stylesheet Language Transformation (XSLT) là một ngônngữ được tách ra từ ngôn ngữ XSL, “XSLT là một ngôn ngữ dùng để chuyểnđổi các XML document thành các XML document khác” Nó được viết bằngXML, điều này có nghĩa rằng sự chuyển đổi trong XSLT được trình bày nhưmột well-formed XML document XSLT đóng vai trò quan trọng trong hướngphát triển “phát sinh ngôn ngữ markup hướng người dùng”
II JSP scripting elements.
Các scripting elements 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
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:
Trang 61 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òngọ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
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 đốitượng này
Trang 7Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
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ộttham 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.
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épchúng ta lưu trữ dữ liệu
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
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)
Trang 8Current 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ứctrong 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());
a) 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 elementskhá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 (requesttime) Các elements cho phép sử dụng biểu thức trong các thuộc tính củachúng là:
jsp:setProperty name và value
Trang 9Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
<meta name="author" content="Giang" />
<meta name="keywords" content=
"JSP,expressions,JavaServer,Pages,servlets" />
<meta name="description" content=
Code 1: expression.jsp (tiếp theo)
"A quick example of JSP expressions." />
<link rel="stylesheet" href="JSP-Styles.css"
<li>Your session ID: <%= session.getId() %></li>
<li>The <code>testParam</code> form parameter:
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 %>
Trang 10} else { hasExplicitColor = false;
"Supply the bgColor request attribute to try " + "a standard color, an RRGGBB value, or to see " + "if your browser supports X11 color names.");
}
%>
</body>
</html>
Trang 11Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
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ứchoặ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ẳnghạn, đây là một trang JSP mà in ra số lần truy cập vào trang
<title>JSP Declarations </title>
<link rel="styleshhet" href="JSP-Styles.css" type="text/css" />
</head>
<body>
<h1>JSP Declarations</h1>
<%! private int accessCount = 0; %>
<h2>Accesses to page since server reboot:
Trang 12Tương tự như scripting elements, các directives cũng có hai dạng cú pháp:
<%@ page attr_list %> : attr_list
sẽ được mô tả phần sau trong
chương này
<jsp:directive.page attr_list />
<%@ include file=”URL” %> <jsp:directive.include file=”URL” />
<%@ taglib attr_list %> : directive
này được trình bày trong chương
III Tag Libraries
<jsp:root attr_list>
<! other elements >
</jsp:root>
1 The page directive
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.legiang.*” %>
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
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
Trang 13Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
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
Thộ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ạilệ 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().
Trang 14<%@ 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ệnhà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ỗicho một trang JSP khác Giá trị “false” là mật định cho thuộctính này
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ã hoá 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”
Code 4: pagedirective.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html>
<head>
<title>The page Directive</titlle>
<link rel="styleshhet" href="JSP-Styles.css"
Trang 15Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
</head>
<body>
<h2>The page Directive</h2>
Ví dụ 4: pagedirective.jsp (tiếp theo)
%>
<% JSP Scriptlet (xem phần I.3) %>
<%
Cookie[] cookies = request.getCookies();
String oldID = ServletUtilities.getCookieValue(cookies, "userID",NO_VALUE);
String newID;
if (oldID.equals(NO_VALUE)) { newID = randomID();
} else { newID = oldID;
}LongLivedCookiecookie = new LongLivedCookie ("userID" , newID);
response.addCookie(cookie);
%>
<% JSP Expressions (xem phần I.II.2) %>
This page was accessed at <%= new Date() %> with a userIDcookie of <%= oldID %>
</body>
</html>
2 The include directive
Chúng ta sử dụng include directive để đưa một file vào tài liệu JSP chính
vào lúc tài liệu dịch thành servlet (mà thường vào lần đầu tiên truy cập vàotrang này) Có cú pháp như sau:
Trang 16<%@ include=“Relative URL” %>
Thật sự JSP chia làm hai nhánh để include một file vào một tài liệuchính File được include thì được chèn vào trang vào lúc biên dịch, Còn nhánh
còn lại thì được chèn vào tại thời gian yêu cầu (request) với element là
jsp:include sẽ được trình bày trong mục IV Các action chuẩn.
File được include vào không những chứa HTML tĩnh mà còn chứa đượcmã JSP động Đặc tính này cho phép chúng ta tạo các thanh định hướng, cácphần thông tin cần tương tác, đếm số trang, riêng trên một file khi chúng tacó nhiều trang sử dụng lại chúng Nếu file được include thay đổi thì tất cả JSPfiles sử dụng nó cần phải được cập nhật lại
Ví dụ về include directive
File đầu tiên là một đoạn của trang chứa các thông tin tương tác cần
thiết cho file thứ hai dùng lại bằng include directive.
Code 5: contact.jsp
<%@ page import="java.util.Date" %>
<% Các biến sau sẽ trở thành các fields trong servlet khi JSP file gọifile này %>
<%! private int accessCount = 0;
private Date accessDate = new Date();
private String accessHost = "<i>No previous access</i>";
%>
<hr/>
This page © 2000
<a href="http//www.LG.com/">my-company.com</a>
This page has been accessed <%= ++accessCount %>
times since server reboot It was last accessed from
"DTD/xhtml1-strict.dtd">
Trang 17Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
Code 6: includedirective.jsp
<! Example of including files at page translation time >
<html>
<head>
<title>The include Directive</title>
<link rel="styleshhet" href="JSP-Styles.css" type="text/css" />
<p>Information about our products and services.</p>
<p>Le, Le, Le.</p>
<p>Giang, Giang, Giang.</p>
<%@ include file="contact.jsp" %>
</body>
</html>
3 The taglib directive
Directive này định nghĩa thư viện tag và tiếp đầu ngữ cho những custom
tag được sử dụng trong trang JSP Có cú pháp sau:
<%@ taglib uri=“URIToTagLib” prefix=“tagPrefix”%>
taglib directive sẽ được trình bày chi tiết trong chương III.
IV Các action chuẩn.
Actions chẳng qua là elements được định nghĩa trong bản đặc tả JSP và
luôn luôn có sẵn trong các JSP file mà không cần import vào bất kỳ thứ gì và
chúng có cú pháp XML Có chín actions chuẩn: jsp:include, jsp:useBean,
jsp:setProperty, jsp:getProperty, jsp:plugin, jsp:forward, jsp:fallback, jsp:params, jsp:param sẽ được giới thiệu trong mục này.
1 Action chèn vào files ở thời gian request.
Với include directive cho phép chúng ta thêm vào các tài liệu chứa mã
JSP vào nhiều trang khác nhau nhưng lại có vấn đề là đòi hỏi chúng ta phảicập nhật lại ngày sữa đổi của trang khi file được include thay đổi Để loại bỏ
vấn đề này đặt tả JSP cung cấp cho chúng ta một action là <jsp:include> để
Trang 18include các file vào thời gian yêu cầu (request) Mặc khác, do trang được biên
dịch thành servlet vào thời gian yêu cầu vì thế các file được include không thể chứa mã JSP Cú pháp của action này là:
<jsp:include page=“Relative URL” flush=“true”>
Ví dụ sau sử dụng jsp:include action để include bốn file html, ví dụ này
chỉ hiện thị các thông tin của các web sites nỗi tiếng
<li><jsp:include page="item1.html" flush="true" /></li>
<li><jsp:include page="item2.html" flush="true" /></li>
<li><jsp:include page="item3.html" flush="true" /></li>
<li><jsp:include page="item4.html" flush="true" /></li>
Trang 19Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
humility yesterday
<a href="http://www.microsoft.com/Never.html">More details </a>
Code 9: item2.html
<b>Scott McNealy acts serious.</b> In an unexpected twist,
wisecracking Sun head Scott McNealy was sober and subdued at
yesterday's meeting
<a href="http://www.sun.com/Imposter.html">More details </a>
Code 10: item3.html
<b>Larry Ellison acts conciliatory.</b> Catching his competitors
off guard yesterday, Oracle prez Larry Ellison referred to his
rivals in friendly and respectful terms
<b href="http://www.oracle.com/Mistake.html">More details </a>
Code 11: item4.html
<b>Sportscaster uses "literally" correctly.</b> In an apparent
slip of the tongue, a popular television commentator was
heard to use the word "literally" when he did <i>not</i>
mean "figuratively."
<a href="http://www.espn.com/Slip.html">More details </a>
2 Action chèn vào Applets cho Java Plug-In.
Với JSP, chúng ta không cần có bất kỳ cú pháp đặc biệt nào để include
vào các applet; chỉ dùng APPLET tag của HTML bình thường Tuy nhiên, các
applet này phải sử dụng từ JDK 1.1 trở xuống vì cả hai trình duyệt phổ biếtnhất là Netscape 4.x và Internet Explorer 5.x vẫn chưa hổ trợ JDK 1.2 Do đóapplet có một số giới hạn sau:
- Để sử dụng Swing, chúng ta phải gởi các Swing files qua mạng.Tiến trình này tốn rất nhiều thời gian và cũng thất bại trongInternet Explorer 4 và Netscape 3.x (chỉ hổ trợ JDK 1.02) màSwing lại phụ thuộc vào JDK 1.1
- Chúng ta không thể dùng Java 2D
- Chúng ta không thể dùng gói collection (tập hợp) của Java 2
Trang 20- Mã của chúng ta chạy chậm hơn vì hầu hết các trình biên dịchcho nền Java 2 được cải tiến rất đáng kể so với các trình biêndịch từ JDK 1.1 trở xuống.
Hơn thế nữa, các phiên bản của các trình duyệt có một số mâu thuẫntrong cách thức mà chúng hổ trợ AWT component khác nhau, làm cho việc thửnghiệm và điều phối các giao tiếp người dùng trở nên phức tạp và nặng nềhơn Để giải quyết các vấn đề này, Sun đã phát triển Java Plug-In choNetscape và Internet Explorer mà cho phép chúng ta sử dụng Java 2 platformcho các applet trong nhiều trình duyệt khác nhau
Tuy nhiên, lại thật không may mắn là APPLET tag bình thường sẽ
không làm việc với Plug-In vì các trình duyệt được thiết kế riêng chỉ sử dụngmáy ảo (Virtual Machine) có sẳn của chúng khi chúng gặp APPLET Thay vì
thế, chúng ta phải sử dụng OBJECT tag đối với IE và EMBED tag đối với
Netscape Hơn nữa vì chúng ta không biết loại trình duyệt nào sẽ truy cập vàotrang chúng ta nên chúng ta phải hoặc là include cả OBJECT lẫn EMBED (đặtEMBED trong phần COMMENT của OBJECT) hoặc là xác định loại trình
duyệt vào thời gian yêu cầu để dùng tag đúng cho loại trình duyệt đó Quá
trình này thì hiển nhiên nhưng nhàm chán và mất thời gian
Action jsp:plugin chỉ dẫn server xây dựng một tag thích hợp cho các
applet mà sử dụng Plug-In
Trang 21Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
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.
iepluginurl
URL cho Internet Explorer mà có thể download Plug-In
b) jsp:param và jsp:params action.
jsp:param được dùng trong các actions khác như: jsp:include,
jsp:forward, jsp:plugin Action này dùng để cung cấp cặp tên và giá trị
(name/value) cho các actions trên Cụ thể với jsp:plugin, thì action này sẽ định
rõ tên và giá trị mà được truy cập từ trong applet bởi getParameter.
Tất cả jsp:param actions đều phải nằm trong jsp:params action Ví dụ:
Code 12: Sử dụng Applet
<APPLET CODE=“MyApplet.class”
WIDTH=457 HEIGHT=350>
<PARAM NAME=“PARAM1” VALUE=“VALUE1”>
<PARAM NAME=“PARAM2” VALUE=“VALUE2”>
</APPLET>
trong JSP sử dụng như sau:
<jsp:plugin type=“applet” code=“MyApplet.class”
width=“457” height=“350” >
<jsp:params>
<jsp:param name=“PARAM1” value=“VALUE1” /> <jsp:param name=“PARAM2” value=“VALUE2” />
Trang 22</jsp:plugin>
c) jsp:fallback action.
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 Ví dụ chúng ta có thể thay thế
Code 13: Sử dụng jspfallback
3 Actions dùng để forward và sử dụng Components.
a) Chuyển các request từ các trang JSP.
Tình huống chuyển request phổ biến nhất là request đó, đầu tiên, bắt
nguốn từ servlet và servlet đó chuyển request này đến trang JSP Lý do để servlet thường xử lý request gốc là để kiểm tra các tham số trong request và
thiết lập Beans nên đòi hỏi nhiều công việc lập trình và nó thuận tiện để lập
trình trong servlet hơn là trong tài liệu JSP Nguyên nhân mà trang đích thường
lại là tài liệu JSP là JSP rất đơn giản trong tiến trình tạo ra tài liệu HTML
Tuy nhiên điều này chỉ là định hướng thường dùng chứ không có nghĩalà chỉ có một cách để thực hiện Do đó để đơn giản và dễ sử dụng hơn trong
việc nhúng mã RequestDispatcher trong một scriptlet chúng ta có thể sử dụng
jsp:forward action Ví dụ:
Code 14: Sử dụng jspforward
Trang 23Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
if (Math.random() > 0.5) {dest = “page1.jsp”;
} else {dest = “page2.jsp”;
}
%>
<jsp:forward page=“<%= dest %>” />
Action này cho phép điều phối một request hiện hành vào lúc runtime đến một tài nguyên tĩnh, trang JSP hay lớp servlet trong cùng một ứng dụng.
b) Sử dụng component trong JSP.
Chúng ta có thể sử dụng các actions sau để sử dụng lại các component (Beans) trong JSP: jsp:useBean, jsp:setProperty, jsp:getProperty Các action
này được trình bày trong chương II
Trang 24JavaSoft về Bean: “JavaBean là một component phần mềm có thể dùng lại
được, có thể được thực hiện trực quan bằng môi trường phát triển tích hợp IDE (Integrated Development Environment).”
JavaBean API: tuân theo các quy ước được xác định bởi JavaBean API,
cho phép JSP container tương tác với Beans ở mức lập trình mặc dù JSP container thực sự chẳng hiểu Bean thực hiện những gì và hoạt động ra sao.
Đối với JSP, chúng ta chỉ quan tân đến các khía cạnh API rồi ra các dấu hiệucho những hàm tạo của Bean và các phương thức truy cập thuộc tính xử lý
Giống như bất kỳ lớp Java nào, các thể hiện của Bean đơn thuần chỉ làcác đối tượng Java Chúng ta thường có sự lựa chọn hoặc là tham chiếu tớiBeans và các phương thức của chúng trực tiếp qua mã Java trong các lớp khác
hoặc là thông qua các scripting element trong trang JSP Vì các scripting element cũng theo các quy ước của Bean nên chúng ta có thể làm việc với
Beans mà không cần phải viết một đoạn mã Java nào Bean container như
JSP container, có thể cung cấp sự truy cập dễ dàng vào Beans và các thuộc
tính của chúng
2 Các quy ước của Bean.
Khi định nghĩa Bean chúng ta phải tuân theo các quy tắc sau:
- Tên lớp của Bean phải có tiếp vĩ ngữ là Bean chẳng hạnUserBean, DataAccessBean, Thật sự thì quy tắc này không làyêu cầu bắt buộc nhưng nó là một định hướng thông dụng và chophép những nhà phát triển khác hiểu ngay lập tức vai trò của lớpnày
- Một Bean phải có một hàm tạo không có tham số
- Bean không nên có bất kỳ biến thể hiện (field) nào là
‘public’
- Các giá trị bền vững nên được truy cập thông qua cácphương thức gọi là getXxx và setXxx
Trang 25Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
- Đối với các server-side Bean không nên dùng thư việnđồ hoạ
II JSP sử dụng Beans.
1 Các JSP element dùng cho Bean.
TypeSpec có thể hoặc (|) trong các thuộc tính sau:
TypeSpec ::= class = “className” |
class = “className” type = “typeName” | type = “typeName” class = “className” | beanName = “beanName” type = “typeName” | type = “typeName” beanName = “beanName” | type = “typeName”
Các giá trị của thuộc tính scope:
Đây là giá trị mặc định của scope Bean với giá trị này sẽ có sẵn từ javax.servlet.jsp.PageContext trong trang hiện hành Bean sẽ được loại bỏ khi một response gởi trở về client hoặc request được chuyển tới một trang mới.
Bean có giá trị này thì có sẵn từ đối tượng ServletRequest
của trang hiện hành và bất kỳ trang được include hayforward nào bằng cách sử dụng phương thức
getAttribute(name) Bean sẽ bị huỷ bỏ khi một response gởi
trở về client
Trang 26- session
Bean được sử dụng trong bất kỳ trang nào có tham gia vàomột session của client Có phạm vi trong cả một sessioncủa client Bean này được lưu trữ trong đối tượng
<jsp:setProperty name = “beanName” options />
options có thể hoặc (|) trong các thuộc tính sau:
options::=property =“*” |
property =“propertyName” | property =“propertyName” param =“paraName” | property =“propertyName”
value =“{<%= expr%> | string}”
2 Phương pháp chuyển kiểu tự động JSP Bean
Các thuộc tính của một thành phần JSP thì không giới hạn giá trị chuổi(string) nhưng rất quan trọng để hiểu rằng tất cả giá trị của thuộc tính được
truy cập qua <jsp:getProperty> tag sẽ được chuyển thành kiểu chuổi Tuy nhiên, phương thức getter không cần trả về kiểu String một cách tường minh
vì JSP container sẽ tự động chuyển giá trị trả về này thành kiểu String nếu
cần thiết Đối với các kiểu dữ liệu cơ bản của Java, sự chuyển đổi được thểhiện trong bảng sau:
Trang 27Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
Tương tự, tất cả phương thức setter của thuộc tính được truy cập với
<jsp:setProperty> tag sẽ được tự động chuyển từ String sang một kiểu gốc thích hợp bởi JSP container Điều này được thực hiện qua các phương thức
của các lớp vỏ bọc Java
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)
3 Tìm hiểu cách INTROSPECTOR làm việc.
a)Introspector là gì?
Introspector là bộ phân tích mà qua đó Java xem xét các đoạn mã của
chương trình để tìm ra những phương thức dùng để xây dựng và áp dụng chotừng thuộc tính cũng như tình huống cụ thể Chúng ta không cần quan tâm đếncác khai báo phức tạp khác Ví dụ thiết lập hai phương thức sau:
public void setAge(int age) public int getAge()
Trang 28Theo cách này Bean container sẽ hiểu là chương trình muốn tạo rathuộc tính là age có kiểu int – Bean container sẽ chuyển các thuộc tính theoquy tắc:
FoorBar foorBar
Z zURL URL
b)Thiết kế các phương thức mẫu dùng cho thuộc tính.
Đối với thuộc tính mang những trị đơn, hai phương thức getter và
setter được viết theo mẫu sau (với getter và setter xem 4.Thuộc tính của Bean):
public void setAttributeName(AttributeType param) public AttributeType getAttributeName()
Đối với thuộc tính mang những trị kiểu boolean, phương thức getter
được dùng với tiếp đầu ngữ là is thay cho get:
public void setAttributeName(AttributeType param) public boolean isAttributeName()
Đối với thuộc tính gồm nhiều phần tử (index attribute) các phương thức
getter và setter cũng được thiết lập tương tự Chúng ta có thể sử dụng một
cặp phương thức hay cả hai cặp phương thức cũng được
public void setAttributeName(int index, AttributeType value)
public AttributeType getAttributeName()
và/hoặc
public void setAttributeName(AttributeType[] value) public AttributeType[] getAttributeName()
c) Khai báo các phương thức một các tường minh.
Nếu không muốn bộ phân tích Introspector ngầm định, chúng ta có thể
khai báo và xử lý các phương thức một cách tường minh nhờ vào một lớp phụ
dùng để mô tả các phương thức được gọi là BeanInfo Khi Beans có tên là xxx được biên dịch, trước tiên Bean container sẽ đi tìm lớp có tên là xxxBeanInfo.
Nếu lớp này tồn tại, các thông tin trong lớp xxxBeanInfo sẽ được xử lý trướcvà áp dụng cho các phương thức được tìm thấy Các phương thức không được
mô tả trong xxxBeanInfo sẽ được áp dụng cách phân tích kiểu Introspector mặc định Xem thêm III Các giao tiếp bổ trợ cho Bean.
Trang 29Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
4 Thuộc tính của Bean.
a) Các phương thức truy xuất.
Thuộc tính thật ra chỉ là những biến nằm trong một lớp, tuy nhiênnhững biến này không nên sử dụng trực tiếp mà nên thông qua các phươngthức để truy xuất chúng Thông thường biến được dùng vào hai mục đích đó làgán dữ liệu và lấy dữ liệu ra để tính toán Java đưa ra hai loại phương thức để
đáp ứng cho nhu cầu truy xuất biến đó là các phương thức getter mang ý nghĩa đọc dữ liệu từ biến và các phương thức setter mang ý nghĩa gán dữ liệu
cho biến
b) Các loại thuộc tính.
Chúng ta hãy xem các ví dụ sau:
- Thuộc tính mang những giá trị đơn
Bean sau đây lấy thời gian của hệ thống
Code 15: Java file
package com.legiang.bean;
import java util.*;
public class CurrentTimeBean { /*Data members*/
private int hours;
private int minutes;
/* Methods */
Code 15: Java file (tiếp theo)
public CurrentTimeBean() { Date now = new Date();
this.hours = now.getHours();
this.minutes = now.getMinutes();
} public int getHours() { return hours;
} public int getMinutes() { return minutes();
}}
Trang 30- Thuộc tính mang giá trị boolean.
Code 17: Java file
} public void setAuthorized(boolean authorized) { this.authorized = authorized;
} public boolean isAuthorized() {
Code 17: Java file (tiếp theo)
return authorized;
}}
Trang 31Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
</body>
</html>
- Thuộc tính mang giá trị mảng
Ví dụ này sẽ xây dựng một component mà có thể thựchiện các tính toán tĩnh trên một dãy số
Code 19: Java file
} public double getAverage() { double sum = this.getSum();
if (sum == 0) return 0;
else return sum/numbers.length;
} public double getSum() {
Code 19: Java file (tiếp theo)
Trang 32} public void setNumbers(int index, double value) { numbers[index] = value;
} public int getNumbersSize() { return numbers.length;
}}
double[] numbers = stat.getNumbers();
for (int i=0; i < numbers.length; i++) {
if (i != numbers.length) out.print(numbers[i] + ",");
Trang 33Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
III Các giao tiếp bổ trợ cho Bean.
Trong khi điều này không phải là yêu cầu đặc biệt thì có một số giao tiếp cho phép chúng ta cài đặt vào Beans Các giao tiếp này có thể được dùng để mở rộng tính năng các Bean của chúng ta đối với các tình huống khác nhau
1 Giao tiếp BeanInfo
Chúng ta đã biết về cơ chế tương phản (reflection) trong mục trước,nhưng có phương pháp khác mà một lớp Bean có thể báo cho Bean container
(như JSP container) biết về các thuộc tính của nó bằng cách cài đặt giao tiếp
BeanInfo Giao tiếp BeanInfo cho phép chúng ta tạo ra một lớp đồng hành với
Bean của chúng ta mà định nghĩa các thuộc tính và các cấp độ truy cập củanó Giao tiếp có thể được dùng để thích ứng với các lớp Java đã có đối vớiviệc sử dụng của Bean mà không cần thay đổi giao tiếp đã tạo Nó cũng đượcsử dụng để che dấu các thuộc tính nào được truy cập thường xuyên từ client, vì
thỉnh thoảng cơ chế reflection chuẩn của Java có thể phơi bày nhiều thông tin
mà chúng ta lại không muốn như thế
Để tạo lớp BeanInfo chúng ta chỉ cần đặt tên lớp cùng với tiếp vị ngữ
BeanInfo (như SimpleBeanBeanInfo) và cài đặt giao tiếp java.beans.BeanInfo.
Quy tắc đặt tên này là cách báo cho Bean container (như JSP container) biết
để xác định lớp BeanInfo thích hợp cho Bean chúng ta.
2 Giao tiếp Serializable
JavaBeans sau khi được thiết kế và đem vào sử dụng người dùng sẽ tuỳ
ý thay đổi các thuộc tính mà Bean cung cấp Tuy nhiên khi chấm dứt chươngtrình thì các thuộc tính này cũng mất đi Lần sau khi dùng các thuộc tính nàyphải được khởi tạo và đặt lại giá trị mới Như vậy chu trình sống của Bean chỉhạn hẹp trong quá trình hoạt động của chương trình, không sử dụng lại sau nàyđược Java cung cấp một khả năng lưu lại các đối tượng JavaBeans lên đĩa
bằng cơ chế Serializable Khi một đối tượng hay Bean được lưu xuống tập tin
nhị phân thì tất cả biến hay các đối tượng con nằm bên trong lớp cha đều đượclưu theo
Một số server hổ trợ cơ chế persistent session bằng cách ghi bất kỳ dữ
liệu nào của session vào đĩa giữa các lần server ngừng hoạt động Khi server
hoạt đông trở lại thì dữ liệu được serialization được phục hồi trở lại Một
nguyên nhân tương tự đưa vào các server để hổ trợ cho việc nhóm các sessionlại trong các môi trường truyền thông chậm chạp (do hoạt động nhiều, )
Nhiều server sử dụng cơ chế serialization để sao lặp dữ liệu của session giữa
Trang 34Serializable thì server không thể lưu trữ hoặc chuyển Beans của chúng ta trong
các tình huống này
3 Giao tiếp HttpSessionBindingListener
Việc cài đặt giao tiếp HttpSessionBindingListener của Servlet API
trong Beans chúng ta sẽ cho phép các thể hiện nhận được thông báo của cácsự kiện session Giao tiếp này khá đơn giản, chỉ cần định nghĩa hai phươngthức:
public void valueBound(HttpSessionBindingListener event) public void valueUnBound(HttpSessionBindingListener event)
Phương thức valueBound() được gọi khi Bean được lưu trữ trong session
của người dùng Trong trường hợp của JSP, điều này sẽ thường xảy ra ngay khi
Bean được khởi tạo bởi <jsp:useBean> tag mà có xác định phạm vi “session”
trong thuộc tính scope.
Phương thức valueUnBound() được gọi khi đối tượng bị xoá khỏi
session Có vài tình huống làm cho Bean của chúng ta sẽ bị xoá khỏi session
Khi JSP container dự định chấm dứt một session của người dùng vì hoạt động kém, trước tiên JSP container xoá từng mục dữ liệu trong session, rồi kích hoạt valueUnBound() Thứ hai, Sự kiện này sẽ được kích hoạt nếu servlet, scriptlet, hay đoạn mã Java nào đó xoá bỏ Bean khỏi session vì một số lý
Trang 35Đồ án tốt nghiệp Gvhd: Ts Nguyễn Thúc Hải
I 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ìnhJava 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ộttrang đang gọi
- Chúng được phép truy cập vào tất cả đối tượng có sẵn trongtrang JSP
- Chúng có thể thay đổi lời đáp mà được phát sinh bởi mộttrang đang gọi
Trang 36phứ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 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
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 đượcphá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.
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:
Trang 37Đồ án tốt nghiệp Gvhd: Ts Nguyễn Thúc Hải
Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello
World.”
<tlt:helloWorld />
b) 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ươngthứ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 đốitượng request hoặc từ một hằng chuổi Chỉ có các kiểu thuộc tính trong bảngsau mới có thể được gán từ các giá trị tham số của request và của các hằngchuổi
Kiểu thuộc tính 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ờigian 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=’DHBK Ha Noi’/>
c) 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
Trang 38DHBK Ha Noi
</tlt:helloWorld>
d) Các tag định nghĩa các biến kịch bản.
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ộtbiến chứa một đối tượng được trả về
e) 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
III Đị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.
1 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
Trang 39Đồ án tốt nghiệp Gvhd: Ts Nguyễn Thúc Hả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.
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 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ươngthứ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
Trang 40được triệu gọi như thế nào?).
2 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:
Code 21: HelloWorldTag.java
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<! 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.