luận văn ứng dụng jsp technology trong thiết kế hệ thống mô hình web - Pdf 12

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang 1
L
L
U
U


N
NV
V
Ă
Ă
N
N

O
O
A
AC
C
Ô
Ô
N
N
G
GN
N
G
G
H
H

ỆT
T
H
H

i
i
:
:Ứ

n
n
g
gd
d


n
n
g
gJ
J
S
S
P
P

n
n
g
gt
t
h
h
i
i
ế
ế
t
tk
k
ế
ếh
h


e
e
b
b

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang 2


J
J
S
S
P
PT
T
E
E
C
C
H
H
N
N
O
O
L

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 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 moi ứ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.
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang 3
I. Một số so sánh các công nghệ được sử dụng với công nghệ khác?
1. MySQL Server.
MySQL là hệ quản trị cơ sở dữ liệu quan hệ. Cơ sở dữ liệu là một tập dữ
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 được lư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 MySQL với các hệ
quản trị cơ sở dữ liệu khác:
a) Ưu diểm.
- Chạy được trên rất nhiều nền khác nhau như Unix, Windows,
MacOS, ….
- MySQL là hệ quản trị nhanh, nhỏ gọn. Các script files có thể chạy
trên một số hệ quản trị khác như MS SQL Server, Oracle.

SMIL
CML
MML
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ạnh của
SGML cùng với một số tính năng hữu ích của HTML. Vì XML là tập con củ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àng xử 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 đặt
của SGML, mô hình sau đây diễn tả mối quan hệ giữa các ngôn ngữ và các siêu
ngôn ngữ:

Metalanguages Languages
Implementation

subset
Implementation
- XML có mối quan hệ chặt chẽ với JSP, đặt tả JSP hổ trợ cú pháp XML,
chúng ta có thể trộn lẫn mã chúng với nhau dễ dàng như JSP với HTML như 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ản
phẩm đều có các đặc tính riêng nó, do đó khi các cơ sở dữ liệu khác nhau cần
chuyể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ệc
nà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 đó 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ôn ngữ
đượ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ằng XML, đ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ướng phá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:
Ví d
ụ với XML tags

<student>
<name>

- 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:
<% 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
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 %>

(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
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang 8
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ể

jsp:setProperty name và value
jsp:include page
jsp:forward page
jsp:param value
b) Ví dụ expression.jsp.
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang 9
Đây là một ví dụ hoàn chỉnh đầu tiên của JSP. Nó chỉ hiển thị thời gian
hiện thời, tên máy, khi file này được truy cập.

Code 1: expression.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<! Example of JSP Expressions. >
<html>
<head>
<title>JSP Expressions</title>
<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"
type="text/css" />
</head>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<! Example of JSP Scriptlets. >
<html>
Code 2: scriptlet.jsp (tiếp theo)
<head>
<title>JSP Scriptlets</title>
</head>
<%
String bgColor = request.getParameter("bgColor");
boolean hasExplicitColor;
if (bgColor != null) {
hasExplicitColor = true;
} else {
hasExplicitColor = false;
bgColor = "WHITE";
}
%>
<body bgcolor="<%= bgColor %>">
<h2 align="center">Color Testing</h2>
<%
if (hasExplicitColor) {
out.println("You supplied an explicit background color of " +
bgColor + ".");
} else {
out.println("Using default background color of WHITE. " +
"Supply the bgColor request attribute to try " +
"a standard color, an RRGGBB value, or to see " +
"if your browser supports X11 color names.");
}

<h2>Accesses to page since server reboot:
<%= ++accessCount %></h2>
</body>
</html>
III. JSP directives.
Directives là các lệnh (chỉ thị) đến JSP container để xử lý trang JSP, chúng
tác động lên toàn bộ cấu trúc của lớp servlet. Chúng có dạng sau:
<%@ directive {attr=“value”} %>
Cú pháp này thì dễ để soạn thảo, ngắn gọn, súc tích nhưng không tương thích
với XML (Cú pháp XML ở dưới).
Directives thì không xuất bất kỳ thứ gì ra luồng xuất out. Chỉ có ba directives
trong JSP: page, include và taglib.
Cú pháp XML
Tương tự như scripting elements, các directives cũng có hai dạng cú pháp:

JSP Syntax XML Syntax
<%@ 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>
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải

“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” %>
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang
13
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().
<%@ page info=“Some Message” %>
errorPage

<html>
<head>
<title>The page Directive</titlle>
<link rel="styleshhet" href="JSP-Styles.css"
type="text/css" />
</head>
<body>
<h2>The page Directive</h2>
Ví dụ 4: pagedirective.jsp (tiếp theo)
<% JSP page directive %>
<%@ page import="java.util.*, com.legiang.*"
contenType="text/html" %>
<% JSP Declaration (xem phần I.II.4) %>
<%!
private String randomID() {
int num = (int)(Math.random()*10000000.0);
return("id" + num);
}
private final String NO_VALUE = "<i>No Value</i>";
%>
<% 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;


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ọi file
này. %>
<%! private int accessCount = 0;
private Date accessDate = new Date();
private String accessHost = "<i>No previous access</i>";
%>
<hr/>
This page &copy; 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
<%= accessHost %> at <%= accessDate %>.
<% accessHost = request.getRemoteHost(); %>
<% accessDate = new Date(); %>

Code 6: includedirective.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang
16
Code 6: includedirective.jsp
<! Example of including files at page translation time. >
<html>

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> để include 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”>
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang
17
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.

Code 7: includerequest.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<! Example of including files at request time. >
<html>
<head>
<title>What’s New</title>
<link rel="stylesheet" href="JSP-Styles.css" type="text/css" />
</head>
<body>
<center>
<table boder="5">
<tr>
<th class="title">What's New at JspNews.com
</th>
</tr>

<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=" 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=" 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ết nhấ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 trong Internet
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.
- Mã của chúng ta chạy chậm hơn vì hầu hết các trình biên dịch cho
nền Java 2 được cải tiến rất đáng kể so với các trình biên dị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ẫn trong
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 cho Netscape và Internet

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
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ị
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang
20
(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”>

từ servlet và servlet đó chuyển request này đến trang JSP. Lý do để servlet thường
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang
21
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ĩa là
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
<% String dest;
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.
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc

- Các giá trị bền vững nên được truy cập thông qua các phương thức
gọi là getXxx và setXxx.
- Đố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.
a) jsp:useBean element
Cho phép chúng ta tải một Bean với tên và phạm vi xác định vào trang
JSP.
Cú pháp:
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Svth: Đinh Lê Giang Trang 23
<jsp:useBean id = “beanName” scope = “value” typeSpec>
<! các element khác >
</jsp:useBean>
Nếu không có body, tức là không có tag nào trong thân của
jsp:useBean thì có cú pháp là empty tag.
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:
- page
Đâ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.

“propertyName” />
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:

Property Type Conversion to String
boolean Java.lang.Boolean.toString(boolean)
byte Java.lang.Byte.toString(byte)
char Java.lang.Character.toString(char)
double Java.lang.Double.toString(double)
int Java.lang.Integer.toString(int)
float Java.lang.Float.toString(float)
long Java.lang.Long.toString(long)
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.

Property Type Conversion from String
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)
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải

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

Trích đoạn Tag handler. Taglibrary descriptor. DANH SÁCH WEB SERVERS HỔ TRỢ JSP
Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status