Tải bản đầy đủ (.pdf) (84 trang)

luận văn ứng dụng sử dụng mô hình web là “kiến trúc mô hình một và hai” – “jsp model 1 and 2 architecture”

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 (663.36 KB, 84 trang )

Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

ĐỀ ÁN

Ứng dụng sử dụng mơ hình web là “Kiến Trúc Mơ
Hình Một và Hai” – “JSP Model 1 and 2 Architecture”

Svth: Đinh Lê Giang

Trang 1


Đồ án tốt nghiệp
Hải

Phần I:
Chương I:

Gvhd: Ts.Nguyễn Thúc

JSP TECHNOLOGY
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à />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.

Svth: Đinh Lê Giang

Trang 2


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc


-

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.

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, khố 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 3


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

- 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

SGML

HTML
subset
CDF

SMIL

Implementation
XML


CML
MML

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.
Svth: Đinh Lê Giang

Trang 4


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

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>

- 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 wellSvth: Đinh Lê Giang

Trang 5


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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:
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
Svth: Đinh Lê Giang

Trang 6


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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 tồ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.
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
tồ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à
javax.servlet.ServletConfig.

có kiểu tương ứng là

pageContext
Svth: Đinh Lê Giang


Trang 7


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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).
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

Svth: Đinh Lê Giang


Trang 8


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

jsp:param

value

b) Ví dụ expression.jsp.
Đây là một ví dụ hồ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" ?>
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" />
"JSP,expressions,JavaServer,Pages,servlets" />
Code 1: expression.jsp (tiếp theo)


"A quick example of JSP expressions." />
type="text/css" />
</head>
<body>

JSP Expressions


<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
Svth: Đinh Lê Giang

Trang 9



Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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 %>
Code 2: scriptlet.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?>
"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";
}

%>
Color Testing
<%
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>

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 tồn trang. Khai báo sẽ được chèn vào trong
Svth: Đinh Lê Giang
10

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc


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" ?>
"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>

JSP Declarations


<%! private int accessCount = 0; %>

Accesses to page since server reboot:
<%= ++accessCount %>


</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ẽ <jsp:directive.page attr_list />
được mô tả phần sau trong chương
này.
<%@ include file=”URL” %>
Svth: Đinh Lê Giang
11

<jsp:directive.include file=”URL” />
Trang


Đồ án tốt nghiệp
Gvhd: Ts.Nguyễn Thúc
Hải
<%@ taglib attr_list %> : directive <jsp:root attr_list>
này được trình bày trong chương
<!-- other elements-->
III Tag Libraries.
</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
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 số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
Svth: Đinh Lê Giang
12

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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 tồ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
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” %>
Svth: Đinh Lê Giang
13

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc


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" ?>
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html>
<head>
<title>The page Directive</titlle>
type="text/css" />
</head>
<body>

The page Directive


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);
%>
Svth: Đinh Lê Giang
14

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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

Svth: Đinh Lê Giang
15

Trang


Đồ án tốt nghiệp
Gvhd: Ts.Nguyễn Thúc
Hải
<?xml version="1.0" encoding="ISO-8859-1" ?>
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
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 >

Information about our products and services.


Le, Le, Le.


Giang, Giang, Giang.


<%@ 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à ln
ln 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> để 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
Svth: Đinh Lê Giang
16

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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" ?>
"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>


<table boder="5">
<tr>
<th class="title">What's New at JspNews.com
</th>
</tr>
</table>

Here is a summary of our four most recent news stories:


<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
humility yesterday.

Trang


Đồ án tốt nghiệp
Gvhd: Ts.Nguyễn Thúc
Hải
wisecracking Sun head Scott McNealy was sober and subdued at
yesterday's meeting.
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."

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
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
Svth: Đinh Lê Giang
18

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

(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 đó. Q 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
WIDTH=457 HEIGHT=350>
</APPLET>
sử dụng jsp:plugin action như sau:
code=“MyApplet.class”
width=“457” height=“350” />
Ngồ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.
Svth: Đinh Lê Giang
19

Trang


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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

WIDTH=457 HEIGHT=350>
<PARAM NAME=“PARAM1” VALUE=“VALUE1”>
<PARAM NAME=“PARAM2” VALUE=“VALUE2”>
</APPLET>

trong JSP sử dụng như sau:

width=“457” height=“350” >
<jsp:params>
<jsp:param name=“PARAM1” value=“VALUE1” />
<jsp:param name=“PARAM2” value=“VALUE2” />
</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

WIDTH=457 HEIGHT=350>
<B> Error: this example requires Java. </B>
</APPLET>
với
code=“MyApplet.class”
width=“457” height=“350” >
<jsp:fallback>
<b> Error: this example requires Java. </b>
</jsp:fallback>
</jsp:plugin>

Svth: Đinh Lê Giang
20

Trang



Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

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;
if (Math.random() > 0.5) {
dest = “page1.jsp”;
} else {
dest = “page2.jsp”;
}
%>


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
21

Trang


Đồ án tốt nghiệp
Hải

Chương II :

Gvhd: Ts.Nguyễn Thúc

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à 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.
- Đố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:
Svth: Đinh Lê Giang


Trang 22


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

<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.

-

-

session
Bean được sử dụng trong bất kỳ trang nào có tham gia vào
một session của client. Có phạm vi trong cả một session của
client. Bean này được lưu trữ trong đối tượng HttpSession.
application
Bean được sử dụng trong bất kỳ trang nào trong ứng dụng
hiện hành (cả request hiện tại và tương lai).

b) jsp:setProperty element
Gán một giá trị hoặc nhiều giá trị (thuộc tính mảng) của thuộc tính vào
Bean.
Cú pháp:
<jsp:setProperty name = “beanName” options />
options có thể hoặc (|) trong các thuộc tính sau:
options::=property =“*” |
property =“propertyName” |
Svth: Đinh Lê Giang


Trang 23


Đồ án tốt nghiệp
Hải

Gvhd: Ts.Nguyễn Thúc

property =“propertyName” param =“paraName” |
property =“propertyName”
value =“{<%= expr%> | string}”
c) jsp:getProperty element
Lấy giá trị của thuộc tính Bean để hiển thị giá trị này trong trang kết quả.
Cú pháp:
“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)

Svth: Đinh Lê Giang

Trang 24


Đồ án tốt nghiệp
Hải


Gvhd: Ts.Nguyễn Thúc

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 cho
từng thuộc tính cũng như tình huống cụ thể. Chúng ta khơng cần quan tâm đến
cá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()
Theo cách này Bean container sẽ hiểu là chương trình muốn tạo ra thuộc
tính là age có kiểu int – Bean container sẽ chuyển các thuộc tính theo quy tắc:
FoorBar  foorBar
Z
z
URL
 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
Svth: Đinh Lê Giang

Trang 25