Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Phần I:
Phần I:
JSP TECHNOLOGY
JSP TECHNOLOGY
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 jsp book.” với URL là />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ô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
insert, 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 cho
cá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ới
ASP.
Svth: Đinh Lê Giang Trang
2
SGML
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ằ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.
b) JSP với PHP.
toá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, đây
là 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á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 đó
Svth: Đinh Lê Giang Trang
4
Ví dụ với XML tags
<student>
<name>
<first>Giang</first>
<middle>Le</middle>
<last>Dinh</last>
</name>
<numberid>0750</numberid>
<age>22</age>
</student>
Ví dụ với HTML tags
<table>
<tr>
<td>Giang</td>
<td>Le</td>
<td>Dinh</td>
</tr>
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:
Svth: Đinh Lê Giang Trang
5
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
JSP Syntax XML Syntax
<% = Expressions %>
<jsp:expression>
Java code
</jsp:expression>
<% Scriptlets %>
<jsp:scriptlet>
Java code
</jsp:scriptlet>
<%! Declarations %>
<jsp:declaration>
Java code
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
jsp:param value
b) Ví dụ expression.jsp.
Đâ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"
Svth: Đinh Lê Giang Trang
8
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
"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>
<body>
<h2>JSP Expressions</h2>
<ul>
<li>
<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.");
}
%>
</body>
</html>
Svth: Đinh Lê Giang Trang
10
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
Svth: Đinh Lê Giang Trang
11
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
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>
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à
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ạ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().
Svth: Đinh Lê Giang Trang
13
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
<%@ 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” %>
Đồ á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 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;
}
LongLivedCookiecookie = new LongLivedCookie ("userID" ,
newID);
<% 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 © 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">
Svth: Đinh Lê Giang Trang
16
Đồ á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" />
</head>
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
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”>
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>
</table>
</center>
<p>Here is a summary of our four most recent news stories:</p>
<ol>
<li><jsp:include page="item1.html" flush="true" /></li>
<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.
Svth: Đinh Lê Giang Trang
19
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
- 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 Explorer mà cho phép chúng ta sử dụng Java 2 platform
cho 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ụng
má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
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ò
(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” />
Svth: Đinh Lê Giang Trang
21
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
jsp:forward action. Ví dụ:
Code 14: Sử dụng jspforward
<% String dest;
Svth: Đinh Lê Giang Trang
22
Đồ á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.
Svth: Đinh Lê Giang Trang
23
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Chương II : JSP JAVABEANS
I.Khái niệm và các quy ước của Bean.
1. Khái niệm.
Mô hình thành phần (component) trong JSP được tập trung vào các
component phần mềm của Java được gọi là Bean. Đònh nghóa chính thức của
JavaSoft về Bean: “JavaBean là một component phần mềm có thể dùng lại
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.
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:
<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.
- request
Bean có giá trò này thì có sẵn từ đối tượng ServletRequest