Tải bản đầy đủ (.doc) (93 trang)

đồ án tốt nghiệp đề tài quản lý công việc trên web

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (627.41 KB, 93 trang )

Đồ á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


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ó.
Svth: Đinh Lê Giang Trang
1
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Cả ba đònh hướng này đều có chổ đứng của nó. Chẳng có đònh hướng nào
hổ trợ đầy đủ cho mọi ứng dụng .
Trước khi đi vào chi tiết công nghệ JSP, chúng tôi có một vài so sánh các
công nghệ được sử dụng trong ứng dụng với các công nghệ khác.
I.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.
- Theo một số web site thống kê, việc thực hiện các lệnh

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.

Lợi điểm của JSP với PHP cũng như với ASP. JSP được viết bằng
Java mà chúng ta đã biết với các API mở rộng cho mạng, truy cập cơ sở dữ
liệu, các đối tượng phân tán, … trong khi với PHP đòi hỏi chúng ta phải học cả
một ngôn ngữ mới.
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

Svth: Đinh Lê Giang Trang
3
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
CDF : Channel Difinition Format – cho phép các tác giả của các Web sites
cho phép các người đăng ký biết khi nào Web site này thay đổi, CDF đã được giới
thiệ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ức

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>

<tr>
<td>Number id : </td>
<td>0750</td>
</tr>
<tr>
<td>Age :</td>
<td>22</td>
</tr>
</table>
Đồ á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ô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:
- 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:
<% 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

</jsp:declaration>
1. Các biến được đònh nghóa sẵn trong JSP
Để đơn giản hoá mã trong các biểu thức hay scriptlets trong JSP, người
ta cung cấp cho chúng ta chín đối tượng đã được đònh nghóa trước, có người còn
gọi là các đối tượng ngầm đònh. Do các khai báo trong JSP nằm ngoài phương
thức _jspService (được gọi bởi service) nên các đối tượng này không cho phép
các khai báo truy cập vào.
request
Biến này có kiểu là javax.servlet.http.HttpServletRequest, có
phạm vi trong một yêu cầu (request). Nó cho phép chúng ta truy
cập vào các tham số của request như loại request (GET, POST, …)
và các incoming HTTP header (cookies).
response
Có kiểu là javax.servlet.http.HttpServletResponse, có phạm vi
toàn trang (page). Chú ý rằng vì luồng xuất thì thường làm vật
đệm cho nên việc gán mã tình trạng của HTTP và response
header thì hợp lý trong JSP, mặc dù điều này thì không được
phép trong servlet một khi đã có luồng xuất nào được gởi đến
client.
out
Có kiểu javax.servlet.jsp.JspWriter và phạm vi trong một trang
(page). Dùng để gởi các thông xuất đến client. Đối tượng out
được dùng thường xuyên trong scriptlets, các biểu thức tự động
được đưa vào luồng xuất nên hiếm khi cần tham chiếu đến đối
tượng này.
Svth: Đinh Lê Giang Trang
6
Đồ á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ột
tham chiếu incoming session nào. Một ngoại lệ là nếu chúng ta
sử dụng thuộc tính session của page directive để tắc các phiên
truyền, mà lại cố tham chiếu đến biến session thì sẽ gây ra các
lỗi vào lúc trang JSP được dòch thành servlet.
application
Biến này có kiểu là javax.servlet.ServletContext, có phạm vi
trong toàn ứng dụng (application). ServletContext lấy từ một đối
tượng cấu hình servlet là getServletConfig().getContext(). Các
trang JSP có thể lưu trữ dữ liệu persistent trong đối tượng
ServletContext tốt hơn là trong các biến thể hiện. ServletContext
có các phương thức setAttribute và setAttribute mà cho phép
chúng ta lưu trữ dữ liệu
config
Biến này có phạm vi trang (page) và có kiểu tương ứng là
javax.servlet.ServletConfig.
pageContext
Biến này có kiểu là javax.servlet.jsp.PageContext và có phạm vi
là trang (page). pageContext cho phép một điểm truy cập duy
nhất tới nhiều thuộc tính của trang và cung cấp một nơi thuận
tiện để lưu trữ dữ liệu dùng chung. Biến pageContext lưu trữ giá
trò của javax.servlet.jsp.PageContext cùng với trang hiện hành.
Có thể xem chi tiết trong chương II về JavaBeans.
page
Biến này đồng nghóa với this và điều này thì không hữu ích
trong ngôn ngữ lập trình Java, có kiểu là java.lang.Object và có
phạm vi trang (page).
exception

Trong một trang lỗi, chúng ta có thể truy cập vào đối tượng
exception. Biến này có kiểu là java.lang.Throwable và phạm vò
là trang (page).
Svth: Đinh Lê Giang Trang
7
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
2. Biểu thức trong JSP
Biểu thức trong JSP được dùng để chèn các giá trò trực tiếp vào luồng
xuất. Nó có dạng sau:
<%= Java expressions %>
Biểu thức này được đònh trò, được chuyển thành chuổi, và được chèn vào
trong trang. Sự đònh trò diễn ra ở thời gian runtime (khi trang được yêu cầu) và
do đó có đầy đủ quyền truy cập các thông tin của yêu cầu này. Ví dụ sau đây
mô tả ngày/giờ mà trang được yêu cầu:
Current time: <%= new java.util.Date() %>
Trong Java mỗi câu lệnh đều có dấu ‘;’ kết thúc dòng. Tại sao biểu thức
trong JSP lại không có dấu ‘;’? Vì biểu thức này được đưa vào luồng xuất
chẳng hạn như PrintWriter. Với ví dụ trên có thể chuyển vào servlet như sau:
PrintWriter out = response.getWriter();
out.println(“Current time:” + new java.util.Date());
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 elements
khác. Giá trò từ các biểu thức này sẽ được tính vào thời gian yêu cầu (request
time). Các elements cho phép sử dụng biểu thức trong các thuộc tính của
chúng là:
Tên Element Tên thuộc tính
jsp:setProperty name và value
jsp:include page
jsp:forward page

jsp:param value
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>

Current time: <%= new java.util.Date() %>
</li>
<li>
Your hostname:<%=request.getRemoteHost()%>
</li>
<li>Your session ID: <%= session.getId() %></li>
<li>The <code>testParam</code> form parameter:
<%= request.getParameter("testParam") %>
</li>
</ul>
</body>
</html>
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 %>
Svth: Đinh Lê Giang Trang
9
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
Code 2: scriptlet.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 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.");
}
%>
</body>
</html>
Svth: Đinh Lê Giang Trang
10

Đồ á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ứ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.
Code 3: declaration.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 Declarations. >
<html>
<head>
<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:
<%= ++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
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à

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
Svth: Đinh Lê Giang Trang
12
Đồ á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ạ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” %>

Ngoại lệ tung ra sẽ có sẵn trong biến ngầm đònh exception.
isErrorPage
Xác đònh trang JSP hiện thời có thể hoạt động như một trang lỗi
cho một trang JSP khác. Giá trò “false” là mật đònh cho thuộc
tính này.
contentType
Thuộc tính này gán Content-Type cho response header, mô tả
kiểu MIME của tài liệu được gởi đến client. Thuộc tính
contentType có một trong hai dạng sau:
<%@ page contentType=“MIME-Type” %>
<%@ page contentType=“MIME-Type;
charset=Character-Set” %>
Một số kiểu MIME-Type thường dùng: “text/html”, “text/xml”,
“text/plain”, “image/gif”, “image/jpeg”.
pageEncoding
Đònh nghóa bộ mã 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"
type="text/css" />
Svth: Đinh Lê Giang Trang
14

Đồ á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);

response.addCookie(cookie);
%>
<% JSP Expressions (xem phần I.II.2) %>
This page was accessed at <%= new Date() %> with a userID
cookie 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ào
trang này). Có cú pháp như sau:
Svth: Đinh Lê Giang Trang
15
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
<%@ include=“Relative URL” %>
Thật sự JSP chia làm hai nhánh để include một file vào một tài liệu
chí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 được
mã JSP động. Đặc tính này cho phép chúng ta tạo các thanh đònh hướng, các
phần thông tin cần tương tác, đếm số trang, riêng trên một file khi chúng ta
có nhiều trang sử dụng lại chúng. Nếu file được include thay đổi thì tất cả JSP
files 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ọ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">
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>

<body>
<table boder=5 align="center">
<tr>
<th class="title">Some Random Page</th>
</tr>
</ table >
<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ải
cậ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> để
Svth: Đinh Lê Giang Trang
17

Đồ á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>

<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>
</ol>
</body>
</html>
Code 8: item1.html
<b>Bill Gates acts humble.</b> In a startling and unexpected
development, Microsoft big wig Bill Gates put on an open act of
Svth: Đinh Lê Giang Trang
18
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc
Hải
humility yesterday.
<a href=" 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=" 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=" 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.
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

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ào
trang chúng ta nên chúng ta phải hoặc là include cả OBJECT lẫn EMBED (đặt
EMBED 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.
a) jsp:plugin action.
Phương cách đơn giản nhất để sử dụng jsp:plugin là cung cấp cho nó
bốn thuộc tính: type, code, width, height. Chúng ta đònh giá trò “applet” cho
thuộc tính type và ba thuộc tính còn lại sử dụng giống như APPLET tag bình
thường. Với ngoại lệ là các action thì có cú pháp XML nên các thuộc tính
trong nó cũng phải theo qui ước XML. Ví dụ với APPLET tag trong HTML
<APPLET CODE=“MyApplet.class”
WIDTH=457 HEIGHT=350>
</APPLET>
sử dụng jsp:plugin action như sau:
<jsp:plugin type=“applet”
code=“MyApplet.class”
width=“457” height=“350” />
Svth: Đinh Lê Giang Trang
20
Đồ á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.
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ò
(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:params>
</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
<APPLET CODE=“MyApplet.class”
WIDTH=457 HEIGHT=350>
<B> Error: this example requires Java. </B>
</APPLET>
với
<jsp:plugin type=“applet”
code=“MyApplet.class”
width=“457” height=“350” >
<jsp:fallback>
<b> Error: this example requires Java. </b>
</jsp:fallback>
</jsp:plugin>
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ó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;
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

đượ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ệu
cho 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ới
Beans 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ạn
UserBean, 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à cho
phép những nhà phát triển khác hiểu ngay lập tức vai trò của lớp
nà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ác
phương thức gọi là getXxx và setXxx.
Svth: Đinh Lê Giang Trang
24
Đồ á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.
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

của trang hiện hành và bất kỳ trang được include hay
forward 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.
Svth: Đinh Lê Giang Trang
25

×