Đứng trước thực tế, thương mại điện tử vẫn còn quá mới và xa lạ ở nước tanhưng mức độ tác động của nó đối với nền kinh tế nước ta nói riêng và thếgiới nói chung là rất lớn, hơn nữa ở hầu
Trang 1Luận Văn Tốt Nghiệp Bảng Nội Dung
B ng N i Dung ảng Nội Dung ội Dung
B ng N i Dung ảng Nội Dung ội Dung
PHẦN THỨ NHẤT JSP TECHNOLOGY
2
CHƯƠNG I CĂN BẢN VỀ JSP 2
I Một số so sánh các công nghệ được sử dụng với công nghệ khác? 3
1 MySQL Server 3
1) Ưu diểm 3
2) Khuyết điểm 3
2 So sánh JSP với các công nghệ khác 4
1) JSP với ASP 4
2) JSP với PHP 4
3 Tầm quan trọng của XML cùng với XSLT 4
1) XML 4
2) XSLT 7
II JSP scripting elements 7
1 Các biến được định nghĩa sẵn trong JSP 8
2 Biểu thức trong JSP 10
1) Biểu thức như là giá trị trong elements khác 11
2) Ví dụ expression.jsp 11
3 JSP scriptlets 12
4 Khai báo trong JSP 13
III JSP directives 14
1 The page directive 15
2 The include directive 18
3 The taglib directive 20
IV Các action chuẩn 20
1 Action chèn vào files ở thời gian request 20
2 Action chèn vào Applets cho Java Plug-In 22
1) jsp:plugin action 23
2) jsp:param và jsp:params action 24
3) jsp:fallback action 25
3 Actions dùng để forward và sử dụng Components 25
1) Chuyển các request từ các trang JSP 25
2) Sử dụng component trong JSP 26
CHƯƠNG II JSP JAVABEANS 27 I Khái niệm và các quy ước của Bean 27
1 Khái niệm 27
3
6
9
12
15
18
21
24
27
30
33
36
39
Trang 2Luận Văn Tốt Nghiệp Bảng Nội Dung
2 Các quy ước của Bean 27
II JSP sử dụng Beans 28
1 Các JSP element dùng cho Bean 28
1) jsp:useBean element 28
2) jsp:setProperty element 29
3) jsp:getProperty element 29
2 Phương pháp chuyển kiểu tự động JSP Bean 30
3 Tìm hiểu cách INTROSPECTOR làm việc 30
1) Introspector là gì? 30
2) Thiết kế các phương thức mẫu dùng cho thuộc tính 31
3) Khai báo các phương thức một các tường minh 31
4 Thuộc tính của Bean 32
1) Các phương thức truy xuất 32
2) Các loại thuộc tính 32
III Các giao tiếp bổ trợ cho Bean 36
1 Giao tiếp BeanInfo 36
2 Giao tiếp Serializable 36
3 Giao tiếp HttpSessionBindingListener 37
CHƯƠNG III TAG LIBRARIES 39 I Tag library là gì ? 39
II Cách dùng các tags trong JSP 40
1 Khai báo các tag library 40
2 Các loại tag 40
1) Các tag đơn giản 41
2) Các tag có thuộc tính 41
3) Các tag có nội dung 41
4) Các tag định nghĩa các biến kịch bản 42
5) Kết hợp các tag 42
III Định nghĩa các tag 42
1 Tag handler 43
2 Tag library descriptor 44
3 Các ví dụ 44
1) Các tag đơn giản 45
2) Các tag có thuộc tính 47
3) Các tag có nội dung 49
4) Các tag định nghĩa các biến kịch bản 51
4 Tag handler được triệu gọi như thế nào? 55
42
45
48
51
54
57
60
63
66
69
72
75
Trang 3Luận Văn Tốt Nghiệp Bảng Nội Dung
PHẦN THỨ HAI PHÂN TÍCH – THIẾT KẾ – CÀI ĐẶT
56
CHƯƠNG IV PHÂN TÍCH – THIẾT KẾ 56
I Phân Tích 56
1 Đặt vấn đề 56
2 Định nghĩa các yêu cầu 57
3 Phạm vi đề tài 58
4 Mô hình xử lý quan niệm 59
1) Sơ đồ ngữ cảnh 59
2) Sơ đồ phân rã chức năng 59
3) Sơ đồ hệ thống 60
5 Mô hình dữ liệu quan niệm 66
II Thiết Kế 67
1 Thiết kế xử lý 67
1) Sơ đồ hệ thống mức vật lý 67
2) Các đơn vị thiết kế 67
3) Một số giải thuật được thể hiện bàng lưu đồ 68
2 Thiết kế cơ sở dữ liệu 73
1) Mô hình dữ liệu vật lý 73
2) Bảng mô tả chi tiết 74
3) Các ràng buộc toàn vẹn 78
4) Bảng tầm ảnh hưởng 79
3 Thiết kế chương trình 81
4 Thiết kế giao diện 82
CHƯƠNG V ỨNG DỤNG QUẢN LÝ CÔNG VIỆC 86 I Cài đặt và triển khai ứng dụng 86
1 Các phần mềm cần thiết 86
2 Triển khai ứng dụng web 86
3 Cài đặt ứng dụng The Web Work 88
II Hướng dẫn sử dụng 92
III Ứng dụng cụ thể chương trình vào công ty Liên Doanh Bêtông Việt Úc 96 KẾT LUẬN 100
HƯỚNG PHÁT TRIỂN 101
DANH SÁCH WEB SERVERS HỔ TRỢ JSP 102
BẢNG THUẬT NGỮ 103
Tài Liệu Tham Khảo 106
78
81
84
87
90
93
96
99
102
105
108
111
114
Trang 4Luận Văn Tốt Nghiệp Bảng Nội Dung
Trang 5Luận Văn Tốt Nghiệp Lời Giới Thiệu
Lời Giới Thiệu
Thương mại điện tử giờ đây đã thực sự trở thành một lĩnh vực sôi động củanền kinh tế, là xu hướng phát triển tất yếu của nền kinh tế trong thế kỷ 21 –
Kỷ nguyên công nghệ thông tin Đặc biệt là đối với các nước đang phát triểnnhư Việt Nam chúng ta Thương mại điện tử là cơ hội, là phương tiện để đưatin học vào quản lý, để thâm nhập vào thị trường toàn cầu,
Sự phát triển của công nghệ thông tin sẽ số hoá nền kinh tế, sự phát triển củathương mại điện tử sẽ giúp đẩy nhanh tốc độ toàn cầu hoá về thương mại.Các giao dịch, quản lý trên mạng sẽ xoá nhòa đi sự cách biệt về thời gian vàkhông gian giữa văn phòng làm việc và nơi cư ngụ, giữa các nước, các khuvực trên thế giới Mức độ ảnh hưởng của các công ty nhỏ đối với thị trườngthế giới cũng sẽ không thua kém gì so với các công ty lớn Xu hướng hướnghình thành các công ty “Vô trọng ” (Zero Gravity Company) ngày càng trởnên phổ biến, các công ty này có thể thành công mà không cần phụ thuộcvào vị trí, phòng ốc, tài sản, mà chỉ cần một số lượng nhân viên tối thiểu
và một máy tính kết nối vào mạng, điển hình như Yahoo, Amazon,
Đứng trước thực tế, thương mại điện tử vẫn còn quá mới và xa lạ ở nước tanhưng mức độ tác động của nó đối với nền kinh tế nước ta nói riêng và thếgiới nói chung là rất lớn, hơn nữa ở hầu hết các cơ quan nhà nước hay tưnhân, đều có khâu quản lý và phân công công việc cụ thể cho từng cá nhân
và tập thể (hay nhóm) nhằm mục đích khai thác các tiềm năng của Internet,nâng cao hiệu quả quản lý, năng suất công việc và được sự cho phép, độngviên của Thầy Synh, chúng em xin mượn luận văn tốt nghiệp này để nhằmxây dựng một chương trình ứng dụng thương mại điện tử vào quản lý, trìnhbày một số hiểu biết của mình về thương mại điện tử Tuy đã cố gắng rấtnhiều nhưng sự hiểu biết có hạn nên không thể tránh khỏi những sai sót, rấtmong nhận được sự góp ý và chỉ bảo của thầy cô và các bạn
Trang 7thườ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 vinh an book.” với URL là http://www.vinhan.com/thank.jsp?title=vinh+an
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ùngngô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 đượckhuynh 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áctình huống mà cấu trúc nền tảng của trang HTML là cố định nhưngcác giá trị trong nó lại thay đổi
- Còn các tác vụ còn lại cần sự kết hợp cả servlet và JSP Ví dụ,
trong yêu cầu gốc được trả lời bằng một servlet mà thực hiện mọicông việc, lưu trữ các kết quả trong các Beans và điều phối yêu cầunày đến một trong những trang JSP có thể hiển thị nó
Trang 8cơ sở dữ liệu Sau đây là một số ưu và nhược điểm của MySQLvới các hệ quản trị cơ sở dữ liệu khác:
1) Ư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 SQLServer, Oracle
- Theo một số web site thống kê, việc thực hiện cáclệnh insert, update, delete nhanh nhất trong các hệ quảntrị
- Miễn phí và mã nguồn mở (open source code)
2) Khuyết điểm.
- Chưa hổ trợ một số chuẩn ANSI SQL92 như khôngcho 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ạ
Trang 9- Hổ trợ sự mở rộng tag với custom tag.
Lợi điểm của JSP với PHP cũng như với ASP JSP được viếtbằng Java mà chúng ta đã biết với các API mở rộng chomạ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ônngữ mới
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ủaHTML Vì XML là tập con của SGML nên nó cũng tươngthí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ữ:
Trang 10XML
CDF SMIL CML MML
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ềnthông được truyền qua internet
CML : Chemical Markup Language – mô tả các công thứchóa học
MML: Mathematical Markup language- mô tả các phươngtrì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ònthiếu nhiều thuộc tính trong thế giới thực :
Trang 11JSP Technology Căn Bản Về JSP
- 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ớinhau 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 đĩ khicác cơ sở dữ liệu khác nhau cần chuyển đổi dữ liệu vớinhau lại khơng tương thích Vì vậy người làm cơng việcnày cần phải biết nhiều sản phẩm quản trị cơ sở dữ liệukhá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, … Để hiểu rỏhơn chúng tơi vẽ hai hình sau:
SQL Server Database
Oracle Database
Legacy ISAM / VSAM Database
POET Database Files
Mô Hình Chuyển Đổi Dữ Liệu
Trang 12JSP Technology Căn Bản Về JSP
SQL Server Database
Oracle Database
Legacy ISAM / VSAM Database
POET Database Files
Mô Hình Chuyển Đổi Dữ Liệu
Giữa CSDL Và XML
Common XML Format
Extensible Stylesheet Language Transformation (XSLT) làmột ngơn ngữ được tách ra từ ngơn ngữ XSL, “XSLT là mộtngơn ngữ dùng để chuyển đổi các XML document thành cácXML 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ị quantrọng trong hướng phát triển “phát sinh ngơn ngữ markuphướng người dùng”
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.
Trang 13JSP Technology Căn Bản Về JSP
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 HTMLtĩ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àiliệu kết quả, dùng:
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:
Để đơ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
Trang 14JSP Technology Căn Bản Về JSP
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
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 khicầ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ếtnối ngay cả chẳng có một tham chiếu incoming sessionnà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épchúng ta lưu trữ dữ liệu
Trang 15javax.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).
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 saobiể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();
Trang 16JSP Technology Căn Bản Về JSP
out.println(“Current time:” + new java.util.Date());
Biểu thức có thể được sử dụng trong các thuộc tính của cácelements khác Giá trị từ các biểu thức này sẽ được tính vàothờ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à:
jsp:setProperty name và value
<meta name="author" content="Vinh&An" />
<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"
Trang 17Scriptlets 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 %>
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">
Trang 18} else { hasExplicitColor = false;
} 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>
Một khai báo trong JSP cho phép chúng ta định nghĩa cácphươ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:
Trang 19<! 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>
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ó
Trang 20JSP Technology Căn Bản Về JSP
<%@ page attr_list %> : attr_list sẽ được mô tả phầnsau 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àytrong chương III Tag
Libraries
<jsp:root attr_list>
<! other elements >
</jsp:root>
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.vinhan.*” %>
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ẩnthậ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.*” %>
Trang 21JSP Technology Căn Bản Về JSP
Nếu import vào nhiều lớp hay packages thì cách nhaudấ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 ramộ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”
Trang 22JSP Technology Căn Bản Về JSP
Thuộc tính này xác định một trang JSP nên bất kỳ cácngoại lệ nào được tung ra nhưng không bắt ngoại lệ nàytrong 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ộttrang 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 (characterencoding), thuộc tính này hổ trợ cho bộ mã Unicode vàLatin-1, có giá trị mật định là “ISO-8859-1”
Code 4: pagedirective.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
<html>
<head>
<title>The page Directive</titlle>
<link rel="styleshhet" href="JSP-Styles.css"
Trang 23JSP Technology Căn Bản Về JSP
<h2>The page Directive</h2>
Ví dụ 4: pagedirective.jsp (tiếp theo)
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.2) %>
This page was accessed at <%= new Date() %> with auserID
Trang 24JSP Technology Căn Bản Về JSP
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àiliệu chính File được include thì được chèn vào trang vào lúcbiê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 III Các action chuẩn.
File được include vào không những chứa HTML tĩnh mà cònchứa được mã JSP động Đặc tính này cho phép chúng ta tạocá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ụnglạ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 khiJSP 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.vinhan.com/">my-company.com</a>.This page has been accessed <%= ++accessCount %>
times since server reboot It was last accessed from
Trang 25JSP Technology Căn Bản Về JSP
Code 6: includedirective.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
<title>The include Directive</title>
<link rel="styleshhet" href="JSP-Styles.css"
<p>Information about our products and services.</p>
<p>Vinh, Vinh, Vinh.</p>
<p>An, An, An.</p>
<%@ include file="contact.jsp" %>
</body>
</html>
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.
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
Trang 26JSP Technology Căn Bản Về JSP
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
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 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 >
Trang 27humility yesterday.
<a href="http://www.microsoft.com/Never.html">More details </a>
Code 9: item2.html
<b>Scott McNealy acts serious.</b> In an unexpected twist, wisecracking Sun head Scott McNealy was sober and subdued
at yesterday's meeting
<a href="http://www.sun.com/Imposter.html">More details </a>
Trang 28JSP Technology Căn Bản Về JSP
Code 11: item4.html
<b>Sportscaster uses "literally" correctly.</b> In an apparent slip of the tongue, a popular television commentator was heard to use the word "literally" when he did <i>not</i>
mean "figuratively."
<a href="http://www.espn.com/Slip.html">More details </a>
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 quamạng Tiến trình này tốn rất nhiều thời gian và cũng thất bạitrong Internet Explorer 4 và Netscape 3.x (chỉ hổ trợ JDK1.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êndịch cho nền Java 2 được cải tiến rất đáng kể so với các trìnhbiê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âuthuẫn trong cách thức mà chúng hổ trợ AWT component khácnhau, làm cho việc thử nghiệm và điều phối các giao tiếp ngườidù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à InternetExplorer mà cho phép chúng ta sử dụng Java 2 platform cho cácapplet 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úngkhi chúng gặp APPLET Thay vì thế, chúng ta phải sử dụng
Trang 29JSP Technology Căn Bản Về JSP
OBJECT tag đối với IE và EMBED tag đối với Netscape Hơn
nữa vì chúng ta không biết loại trình duyệt nào sẽ truy cập vàotrang chúng ta nên chúng ta phải hoặc là include cả OBJECTlẫn EMBED (đặt EMBED trong phần COMMENT củaOBJECT) 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
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
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.
Trang 30JSP Technology Căn Bản Về JSP
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ườidùng đến một bản sao cục bộ
iepluginurl
URL cho Internet Explorer mà có thể download Plug-In
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
trong JSP sử dụng như sau:
<jsp:plugin type=“applet” code=“MyApplet.class” width=“457” height=“350” >
Trang 31JSP Technology Căn Bản Về JSP
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ế
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 trongtiế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ử
Trang 32JSP Technology Căn Bản Về JSP
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.
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
Trang 33Đị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 tachỉ quan tân đến các khía cạnh API rồi ra các dấu hiệu chonhững hàm tạo của Bean và các phương thức truy cập thuộctính xử lý
Giống như bất kỳ lớp Java nào, các thể hiện của Bean đơnthuần chỉ là các đối tượng Java Chúng ta thường có sự lựachọn hoặc là tham chiếu tới Beans và các phương thức củachú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
Khi định nghĩa Bean chúng ta phải tuân theo các quy tắc sau:
- Tên lớp của Bean phải có tiếp vĩ ngữ là Bean chẳng hạnUserBean, DataAccessBean, Thật sự thì quy tắc này không
là yêu cầu bắt buộc nhưng nó là một định hướng thông dụng
và cho phép những nhà phát triển khác hiểu ngay lập tức vaitrò của lớp này
- Một Bean phải có một hàm tạo không có tham số
Trang 34TypeSpec 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
Trang 35JSP Technology JSP JavaBeans
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 giavào một session của client Có phạm vi trong cả mộtsession của client Bean này được lưu trữ trong đối
<jsp:setProperty name = “beanName” options />
options có thể hoặc (|) trong các thuộc tính sau:
options::=property =“*” |
property =“propertyName” | property =“propertyName” param =“paraName” | property =“propertyName”
value =“{<%= expr%> | string}”
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
Trang 36JSP Technology JSP JavaBeans
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
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)float or Float java.lang.Float.valueOf(string)long or Long java.lang.Long.valueOf(string)
Trang 37JSP Technology JSP JavaBeans
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ứcdù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áckhai 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ốntạ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 zURL URL
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ả haicặp phương thức cũng được
public void setAttributeName(int index, AttributeType value)
public AttributeType getAttributeName()
Trang 38JSP Technology JSP JavaBeans
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áchtường minh nhờ vào một lớp phụ dùng để mô tả các phương
thức được gọi là BeanInfo Khi Beans có tên là xxx được
biên dịch, trước tiên Bean container sẽ đi tìm lớp có tên là
xxxBeanInfo Nếu lớp này tồn tại, các thông tin trong lớp
xxxBeanInfo sẽ được xử lý trước và áp dụng cho cácphương thức được tìm thấy Các phương thức không được
mô tả trong xxxBeanInfo sẽ được áp dụng cách phân tích kiểu Introspector mặc định Xem thêm III Các giao tiếp bổ
trợ cho Bean.
Thuộc tính thật ra chỉ là những biến nằm trong một lớp, tuynhiên những biến này không nên sử dụng trực tiếp mà nênthông qua các phương thức để truy xuất chúng Thôngthường biến được dùng vào hai mục đích đó là gán dữ liệu
và lấy dữ liệu ra để tính toán Java đưa ra hai loại phươngthức để đáp ứng cho nhu cầu truy xuất biến đó là các
phương thức getter mang ý nghĩa đọc dữ liệu từ biến và các phương thức setter mang ý nghĩa gán dữ liệu cho biến.
Chúng ta hãy xem các ví dụ sau:
- Thuộc tính mang những giá trị đơn
Bean sau đây lấy thời gian của hệ thống
Code 15: Java file
package com.vinhan.bean;
import java util.*;
public class CurrentTimeBean { /*Data members*/
private int hours;
private int minutes;
Trang 39JSP Technology JSP JavaBeans
Code 15: Java file (tiếp theo)
public CurrentTimeBean() { Date now = new Date();
this.hours = now.getHours();
this.minutes = now.getMinutes();
} public int getHours() { return hours;
} public int getMinutes() { return minutes();
- Thuộc tính mang giá trị boolean
Code 17: Java file
} public void setAuthorized(boolean authorized) { this.authorized = authorized;
Trang 40JSP Technology JSP JavaBeans
public boolean isAuthorized() {
Code 17: Java file (tiếp theo)
return authorized;
}}
- Thuộc tính mang giá trị mảng
Ví dụ này sẽ xây dựng một component mà có thể thựchiện các tính toán tĩnh trên một dãy số
Code 19: Java file
} public double getAverage() { double sum = this.getSum();
if (sum == 0) return 0;
else return sum/numbers.length;