căn bản về jsp

104
Đồ án tốt nghiệp 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à http://www.jsp.com/thank.jsp?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. đáp ứng được khuynh hướng của Sun MicroSystem là “write one, run anywhere”. Các trang JSP 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 1

Upload: thien-nguyen-hoang

Post on 05-Jul-2015

2.592 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Căn bản về JSP

Đồ án tốt nghiệp

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à http://www.jsp.com/thank.jsp?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ó.

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.

Svth: Đinh Lê Giang Trang 1

Page 2: Căn bản về JSP

Đồ án tốt nghiệp

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.

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

Svth: Đinh Lê Giang Trang 2

Page 3: Căn bản về JSP

SGML HTML

XML

CDF

SMIL

CML

MML

Đồ án tốt nghiệp

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

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 :

Svth: Đinh Lê Giang Trang 3

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>

Page 4: Căn bản về JSP

Đồ án tốt nghiệp

- XML có mối quan hệ chặt chẽ với JSP, đặt tả JSP hổ trợ cú pháp XML, chúng ta có thể trộn lẫn mã chúng với nhau dễ dàng như JSP với HTML như thế chúng ta có thể dùng JSP tự động phát sinh trang XML.

- Hiện nay có rất nhiều sản phẩm quản trị cơ sở dữ liệu mà mỗi sản phẩm đều có các đặc tính riêng nó, do đó khi các cơ sở dữ liệu khác nhau cần chuyển đổi dữ liệu với nhau lại không tương thích. Vì vậy người làm công việc này cần phải biết nhiều sản phẩm quản trị cơ sở dữ liệu khác nhau. Do đó XML là một định dạng chuẩn mà các hệ quản trị cần hổ trợ. Hiện nay có nhiều hệ quản trị lớn hổ trợ XML như MS SQL Server, Oracle, …

b) XSLT.

Extensible Stylesheet Language Transformation (XSLT) là một ngôn ngữ được tách ra từ ngôn ngữ XSL, “XSLT là một ngôn ngữ dùng để chuyển đổi các XML document thành các XML document khác”. Nó được viết bằng XML, điều này có nghĩa rằng sự chuyển đổi trong XSLT được trình bày như một well-formed XML document. XSLT đóng vai trò quan trọng trong hướng phát triển “phát sinh ngôn ngữ markup hướng người dùng”.II. JSP scripting elements.

Các scripting elements trong JSP cho phép chúng ta chèn mã vào servlet mà sẽ được phát sinh từ trang JSP. Có ba dạng sau:

- 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

Svth: Đinh Lê Giang Trang 4

Page 5: Căn bản về JSP

Đồ án tốt nghiệp

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

Svth: Đinh Lê Giang Trang 5

Page 6: Căn bản về JSP

Đồ án tốt nghiệp

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

Page 7: Căn bản về JSP

Đồ án tốt nghiệp

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" "DTD/xhtml1-strict.dtd"><!-- Example of JSP Expressions. --><html>

<head><title>JSP Expressions</title><meta name="author" content="Giang" />

Svth: Đinh Lê Giang Trang 7

Page 8: Căn bản về JSP

Đồ án tốt nghiệp

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

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");

Svth: Đinh Lê Giang Trang 8

Page 9: Căn bản về JSP

Đồ án tốt nghiệp

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>

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>

Svth: Đinh Lê Giang Trang 9

Page 10: Căn bản về JSP

Đồ án tốt nghiệp

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

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

extendsSvth: Đinh Lê Giang Trang 10

Page 11: Căn bản về JSP

Đồ án tốt nghiệp

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

Svth: Đinh Lê Giang Trang 11

Page 12: Căn bản về JSP

Đồ án tốt nghiệp

Đị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” %>

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

</head><body><h2>The page Directive</h2>

Ví dụ 4: pagedirective.jsp (tiếp theo)

Svth: Đinh Lê Giang Trang 12

Page 13: Căn bản về JSP

Đồ án tốt nghiệp

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

Svth: Đinh Lê Giang Trang 13

Page 14: Căn bản về JSP

Đồ án tốt nghiệp

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

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>

Svth: Đinh Lê Giang Trang 14

Page 15: Căn bản về JSP

Đồ án tốt nghiệp

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> để 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>

Svth: Đinh Lê Giang Trang 15

Page 16: Căn bản về JSP

Đồ án tốt nghiệp

</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 unexpecteddevelopment, Microsoft big wig Bill Gates put on an open act ofhumility 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>

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="http://www.oracle.com/Mistake.html">More 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="http://www.espn.com/Slip.html">More 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:

Svth: Đinh Lê Giang Trang 16

Page 17: Căn bản về JSP

Đồ án tốt nghiệp

- Để sử dụng Swing, chúng ta phải gởi các Swing files qua mạng. Tiến trình này tốn rất nhiều thời gian và cũng thất bại trong Internet Explorer 4 và Netscape 3.x (chỉ hổ trợ JDK 1.02) mà Swing lại phụ thuộc vào JDK 1.1.

- Chúng ta không thể dùng Java 2D.

- Chúng ta không thể dùng gói collection (tập hợp) của Java 2.

- Mã của chúng ta chạy chậm hơn vì hầu hết các trình biên dịch cho nền Java 2 được cải tiến rất đáng kể so với các trình biên dịch từ JDK 1.1 trở xuống.

Hơn thế nữa, các phiên bản của các trình duyệt có một số mâu thuẫn trong cách thức mà chúng hổ trợ AWT component khác nhau, làm cho việc thử nghiệm và điều phối các giao tiếp người dùng trở nên phức tạp và nặng nề hơn. Để giải quyết các vấn đề này, Sun đã phát triển Java Plug-In cho Netscape và Internet 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 17

Page 18: Căn bản về JSP

Đồ án tốt nghiệp

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” /></jsp:params>

</jsp:plugin>

c) jsp:fallback action.

Svth: Đinh Lê Giang Trang 18

Page 19: Căn bản về JSP

Đồ án tốt nghiệp

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

Svth: Đinh Lê Giang Trang 19

Page 20: Căn bản về JSP

Đồ án tốt nghiệp

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 20

Page 21: Căn bản về JSP

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

- Đố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

Svth: Đinh Lê Giang Trang 21

Page 22: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

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.

- sessionBean đượ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 />

Svth: Đinh Lê Giang Trang 22

Page 23: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

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

<jsp:getProperty name = “beanName” property = “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)

Svth: Đinh Lê Giang Trang 23

Page 24: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

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)

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

Svth: Đinh Lê Giang Trang 24

Page 25: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

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 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ác phươ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.

4. Thuộc tính của Bean.

a) Các phương thức truy xuất.

Thuộc tính thật ra chỉ là những biến nằm trong một lớp, tuy nhiên những biến này không nên sử dụng trực tiếp mà nên thông qua các phương thức để truy xuất chúng. Thông thườ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ương thứ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.

b) Các loại thuộc tính.

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.legiang.bean;import java .util.*;public class CurrentTimeBean { /*Data members*/ private int hours; private int minutes; /* Methods */

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(); }

Svth: Đinh Lê Giang Trang 25

Page 26: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

}

Code 16: JSP file

<jsp:useBean id="time" class="com.legiang.bean.CurrentTimeBean"/>

<html><body>It is now <jsp:getProperty name="time" property="minutes"/> minutes past the hour.</body>

</html>

- Thuộc tính mang giá trị boolean.

Code 17: Java file

package com.legiang.bean;public class LogicBean { /*Data members*/ private boolean authorized; /*Methods*/ public LogicBean() { this.authorized = false; } public void setAuthorized(boolean authorized) { this.authorized = authorized;} public boolean isAuthorized() {

Code 17: Java file (tiếp theo)

return authorized; }}

Code 18: JSP file

<jsp:useBean id="logic" class="com.legiang.bean.LogicBean"/>

<html><body>Do you authorize?<br/>Answer:<jsp:getProperty name="logic" property="authorized"/></body>

</html>

- Thuộc tính mang giá trị mảng.

Svth: Đinh Lê Giang Trang 26

Page 27: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

Ví dụ này sẽ xây dựng một component mà có thể thực hiện các tính toán tĩnh trên một dãy số.

Code 19: Java file

package com.legiang.bean;import java.util.*;public class StatBean { /*Data members*/ private double[] numbers; /*Methods*/ public StatBean() { numbers = new double[0]; } public double getAverage() { double sum = this.getSum(); if (sum == 0) return 0; else return sum/numbers.length; } public double getSum() {

Code 19: Java file (tiếp theo)

double sum = 0; for (int i=0; i < numbers.length; i++) sum += numbers[i]; return sum; } public double[] getNumbers() { return numbers; }

public double getNumbers(int index) { return numbers[index]; } public void setNumbers(double[] numbers) { this.numbers = numbers; } public void setNumbers(int index, double value) { numbers[index] = value; } public int getNumbersSize() { return numbers.length; }}

Svth: Đinh Lê Giang Trang 27

Page 28: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

Code 20: JSP file

<jsp:useBean id="stat" class="com.lg.bean.StatBean"><% double[] mynums = {100, 250, 150, 50, 450}; stat.setNumbers(mynums);%>

</jsp:useBean><html>

<body>The average of <% double[] numbers = stat.getNumbers(); for (int i=0; i < numbers.length; i++) { if (i != numbers.length) out.print(numbers[i] + ","); else

Code 20: Java file (tiếp theo)

out.println("" + numbers[i]); }%> is equal to <jsp:getProperty name="stat" property="average" /></body>

</html>

Ngoài các loại thuộc tính trên, Java còn cung cấp một số thuộc tính nâng cao khác dùng cho các Bean đồ hoạ.

III. Các giao tiếp bổ trợ cho Bean.

Trong khi điều này không phải là yêu cầu đặc biệt thì có một số giao tiếp cho phép chúng ta cài đặt vào Beans. Các giao tiếp này có thể được dùng để mở rộng tính năng các Bean của chúng ta đối với các tình huống khác nhau.

1. Giao tiếp BeanInfo

Chúng ta đã biết về cơ chế tương phản (reflection) trong mục trước, nhưng có phương pháp khác mà một lớp Bean có thể báo cho Bean container (như JSP container) biết về các thuộc tính của nó bằng cách cài đặt giao tiếp BeanInfo. Giao tiếp BeanInfo cho phép chúng ta tạo ra một lớp đồng hành với Bean của chúng ta mà định nghĩa các thuộc tính và các cấp độ truy cập của nó. Giao tiếp có thể được dùng để thích ứng với các lớp Java đã có đối với việc sử dụng của Bean mà không cần thay đổi giao tiếp đã tạo. Nó cũng được sử dụng để che dấu các thuộc tính nào được truy cập thường xuyên từ client, vì thỉnh thoảng cơ chế reflection chuẩn của Java có thể phơi bày nhiều thông tin mà chúng ta lại không muốn như thế.

Svth: Đinh Lê Giang Trang 28

Page 29: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

Để tạo lớp BeanInfo chúng ta chỉ cần đặt tên lớp cùng với tiếp vị ngữ BeanInfo (như SimpleBeanBeanInfo) và cài đặt giao tiếp java.beans.BeanInfo. Quy tắc đặt tên này là cách báo cho Bean container (như JSP container) biết để xác định lớp BeanInfo thích hợp cho Bean chúng ta.

2. Giao tiếp Serializable

JavaBeans sau khi được thiết kế và đem vào sử dụng người dùng sẽ tuỳ ý thay đổi các thuộc tính mà Bean cung cấp. Tuy nhiên khi chấm dứt chương trình thì các thuộc tính này cũng mất đi. Lần sau khi dùng các thuộc tính này phải được khởi tạo và đặt lại giá trị mới. Như vậy chu trình sống của Bean chỉ hạn hẹp trong quá trình hoạt động của chương trình, không sử dụng lại sau này được. Java cung cấp một khả năng lưu lại các đối tượng JavaBeans lên đĩa bằng cơ chế Serializable. Khi một đối tượng hay Bean được lưu xuống tập tin nhị phân thì tất cả biến hay các đối tượng con nằm bên trong lớp cha đều được lưu theo.

Một số server hổ trợ cơ chế persistent session bằng cách ghi bất kỳ dữ liệu nào của session vào đĩa giữa các lần server ngừng hoạt động. Khi server hoạt đông trở lại thì dữ liệu được serialization được phục hồi trở lại. Một nguyên nhân tương tự đưa vào các server để hổ trợ cho việc nhóm các session lại trong các môi trường truyền thông chậm chạp (do hoạt động nhiều, ...). Nhiều server sử dụng cơ chế serialization để sao lặp dữ liệu của session giữa các web server trong nhóm. Nếu Beans của chúng ta không cài đặt giao tiếp Serializable thì server không thể lưu trữ hoặc chuyển Beans của chúng ta trong các tình huống này.

3. Giao tiếp HttpSessionBindingListener

Việc cài đặt giao tiếp HttpSessionBindingListener của Servlet API trong Beans chúng ta sẽ cho phép các thể hiện nhận được thông báo của các sự kiện session. Giao tiếp này khá đơn giản, chỉ cần định nghĩa hai phương thức:

public void valueBound(HttpSessionBindingListener event)public void valueUnBound(HttpSessionBindingListener event)

Phương thức valueBound() được gọi khi Bean được lưu trữ trong session của người dùng. Trong trường hợp của JSP, điều này sẽ thường xảy ra ngay khi Bean được khởi tạo bởi <jsp:useBean> tag mà có xác định phạm vi “session” trong thuộc tính scope.

Phương thức valueUnBound() được gọi khi đối tượng bị xoá khỏi session. Có vài tình huống làm cho Bean của chúng ta sẽ bị xoá khỏi session. Khi JSP container dự định chấm dứt một session của người dùng vì hoạt động kém, trước tiên JSP container xoá từng mục dữ liệu trong session, rồi kích hoạt valueUnBound(). Thứ hai, Sự kiện này sẽ được kích hoạt nếu servlet, scriptlet, hay đoạn mã Java nào đó xoá bỏ Bean khỏi session vì một số lý nguyên nhân.

Mỗi sự kiện kết hợp với giao tiếp HttpSessionBindingListener thì có thể sử dụng để đạt được sự truy cập vào đối tượng session. Việc cài đặt giao tiếp này

Svth: Đinh Lê Giang Trang 29

Page 30: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hảisẽ cho phép chúng ta tác động trở lại các sự kiện của session. Ví dụ đóng các nối kết không cần thiết, tạo các giao tác hoặc thực hiện các hoạt động bảo trì khác.

Svth: Đinh Lê Giang Trang 30

Page 31: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Chương III : TAG LIBRARIES

I. Tag library là gì ?

Trong kỹ thuật JavaServer Pages, các action là các element có thể tạo ra và truy cập vào các đối tượng của ngôn ngữ lập trình và xuất vào những luồng xuất chuẩn như màn hình, máy in,… JSP định nghĩa ra chín action chuẩn mà phải được cung cấp bởi bất kỳ engine nào.

Ngoài các action chuẩn này , từ JSP v1.1 trở lên cho phép xây dựng và phát triển các module có thể dùng lại được gọi là custom action. Trong trang JSP, một custom action được triệu gọi bằng cách dùng custom tag . Một tag library là một tập các custom tag.

Các ứng dụng có thể được thực hiện bằng custom action bao gồm xử lý form, truy cập cơ sở dữ liệu và các dịch vụ ở mức xí nghiệp khác như email, quản lý thư mục và điều khiển luồng. Trước khi custom action xuất hiện thì JSP có một cơ chế dùng lại mã là các thành phần JavaBean kết hợp với scriplet. Tuy nhiên với JavaBean có một bất lợi là xây dựng phức tạp và khó quản lý.

Các custom action làm dịu được vấn đề này bằng cách mang lại các lợi ích dưới góc độ khác của việc module hoá tính sử dụng lại cho các trang JSP. Các custom action gói gọn lại các tác vụ để chúng có thể được dùng lại trong hơn một ứng dụng và tăng hiệu xuất bằng cách khuyến khích phân chia công việc giữa các nhà phát triển thư viện và người sử dụng thư viện. Các tag library của JSP được tạo bởi các nhà phát triển, là người thành thạo ngôn ngữ lập trình Java và là chuyên gia trong giao tiếp với cơ sở dữ liệu và các dịch vụ khác. Các tag library được dùng bởi các nhà thiết kế ứng dụng web, là người có thể chỉ tập trung vào cách thức hiển thị hơn là quan tâm đến cách truy cập cơ sở dữ liệu và các dịch vụ khác.

Một số đặt tính của các custom tag là:

- Chúng có thể được tuỳ biến thông qua các thuộc tính từ một trang đang gọi.

- Chúng được phép truy cập vào tất cả đối tượng có sẵn trong trang JSP.

- Chúng có thể thay đổi lời đáp mà được phát sinh bởi một trang đang gọi.

- Chúng có thể được lồng với nhau và cho phép các tương tác phức tạp trong một trang.

- Chúng có thể truyền thông với nhau. Chúng ta có thể tạo và khởi tạo một thành phần JavaBean, tạo một biến tham chiếu đến Bean đó trong một tag và sau đó sử dụng Bean này trong tag khác.

Svth: Đinh Lê Giang Trang 33

Page 32: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

II. Cách dùng các tags trong JSP.

Phần này trình bày cách thức mà tác giả của trang web sử dụng tag library trong JSP và giới thiệu các loại tag khác nhau. Các ví dụ trong phần này sẽ được định nghĩa trong phần III.

1. Khai báo các tag library.

Trang JSP sẽ sử dụng các tag được định nghĩa trong một tag library bằng cách đưa vào taglib directive trong trang trước bất kỳ custom tag được sử dụng:

<%@ taglib uri = ‘/tlt’ prefix = ‘tlt’ %>

Thuộc tính uri tham chiếu tới URI đó là định danh duy nhất cho tag library. URI có thể là URI tương đối hay tuyệt đối. Nếu URI tương đối thì nó phải được ánh xạ đến một URI tuyệt đối trong taglib element của bộ mô tả triển khai ứng dụng Web, tập tin cấu hình này cùng với ứng dụng Web được phát triển theo bản đặt tả Java Servlet và JavaServer Pages.

Thuộc tính prefix định nghĩa một tiếp đầu ngữ để phân biệt với các tag library khác, do đó thuộc tính này giải quyết được vấn đề xung đột về các tên tag.

2. Các loại tag.

Những custom action được diễn đạt bằng cú pháp XML. Chúng có start tag, nội dung và end tag:

<tlt:tag>body

</tlt:tag>

Một tag mà không có nội dung được biểu diễn như sau:<tlt:tag />

a) Các tag đơn giản.

Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello World.”.

<tlt:helloWorld />

b) Các tag có thuộc tính. Một start tag của custom action có thể chứa các thuộc tính dưới dạng

attr = ‘value’. Các thuộc tính này tuỳ biến các tham số dùng trong các phương thức của một lớp java.

Các thuộc tính có thể được gán một hay nhiều tham số trong một đối tượng request hoặc từ một hằng chuổi. Chỉ có các kiểu thuộc tính trong bảng sau mới có thể được gán từ các giá trị tham số của request và của các hằng chuổi

Kiểu thuộc tínhKiểu thuộc tính Phương thức valueOf chuyển chuổiPhương thức valueOf chuyển chuổi

boolean or Boolean java.lang.Boolean.valueOf(String)

Svth: Đinh Lê Giang Trang 34

Page 33: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

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)

Giá trị thuộc tính có dạng <%= expression %> được tính vào thời gian yêu cầu. Giá trị của biểu thức tuỳ thuộc vào kiểu thuộc tính được xác định trong đối tượng cài đặt tag còn gọi là tag handler (tag handler trong phần định nghĩa các tag).

<tlt:helloWorld name=’DHBK Ha Noi’/>

c) Các tag có nội dung.

Tag có thể bao hàm các custom tag, scripting element, HTML, và nội dung nằm giữa start tag và end tag. Trong ví dụ sau sẽ đưa ra thông tin “lời chào” được cung cấp trong thân tag thay vì trong thuộc tính của nó.

<tlt:helloWorld>DHBK Ha Noi

</tlt:helloWorld>

d) Các tag định nghĩa các biến kịch bản.

Một tag có thể định nghĩa ra một biến mà biến này được dùng trong cùng một trang. Ví dụ sau đây minh hoạ cách thức định nghĩa và sử dụng một biến chứa một đối tượng được trả về.

e) Kết hợp các tag. Các tag kết hợp với nhau bằng các phương pháp của các đối tượng dùng

chung. Trong ví dụ sau, tag1 tạo một đối tượng có tên là obj1, sau đó được sử dụng lại bởi tag2. Qui tắc này được khuyến khích bởi bảng đặt tả JSP, một tag tạo ra một tên với thuộc tính id và tag thứ hai có thuộc tính name để dùng lại tên này.

<tlt:tag1 id=’obj1’ attr2=’value’/><tlt:tag2 name=’obj1’/>

Trong ví dụ kết tiếp, dùng các tag lồng nhau tương tự như trong XML và HTML.

<tlt:outerTag><tlt:innerTag />

<tlt:outerTag>

Svth: Đinh Lê Giang Trang 35

Page 34: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

III. Định nghĩa các tag.

Để sử dụng các custom tag trong trang JSP, chúng ta cần phải định nghĩa ba thành phần riêng biệt:

- Phát triển tag handler và các lớp trợ giúp cho tag.

- Khai báo tag trong bộ mô tả thư viện tag (tag library descriptor) dưới dạng tập tin XML.

- Tạo tập tin JSP có sử dụng custom tag.

Phần này mô tả các thuộc tính của tag handler và các bộ mô tả thư viện tag, cũng trình bày cách phát triển tag handler và các element của bộ mô tả thư viện đối với mỗi loại tag được giới thiệu trong phần trước.

1. Tag handler.

Tag handler là một đối tượng được gọi lên bởi JSP container để định trị cho custom tag trong xuốt quá trình thực thi của trang JSP có tham chiếu tới một tag nào đó. Các phương thức của tag handler được gọi bởi lớp cài đặt trang JSP vào các thời điểm khác nhau trong xuốt quá trình định trị cho tag.

Khi gặp start tag của custom tag thì lớp cài đặt trang JSP gọi các phương thức để khởi tạo các giá trị thích hợp và sau đó triệu gọi phương thức doStartTag. Khi gặp end tag của custom tag thì phương thức doEndtag được gọi.

Tuỳ theo mục đích của từng custom tag mà chúng ta xử lý các phương thức thích hợp trong từng giao tiếp cài đặt. Bảng sau mô tả các loại tag có các phương thức tương ứng để xử lý.

Loại tag handler Loại tag handler Các phương thức cần xử lý Các phương thức cần xử lý

Simple doStartTag, doEndTag, release

Attributes doStartTag, doEndTag, set/getAttribute1...N

Body, No Interaction

doStartTag, doEndTag, release

Body, Interaction doStartTag, doEndTag, release, doInitBody, doAfterBody

Tag handler có sự truy cập vào API mà cho phép nó truyền thông với trang JSP. Con đường vào API này là đối tượng pageContext, qua đó tag handler có thể truy cập vào mọi đối tượng ngầm định khác như request, session,

Svth: Đinh Lê Giang Trang 36

Page 35: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

application từ trang JSP. Các đối tượng ngầm định có thể có các thuộc tính kết hợp với chúng. Các thuộc tính như thế được truy cập qua các phương thức [get/set]Attribute thích hợp.

Nếu tag được lồng nhau thì tag handler cũng có thể truy cập handler này (được gọi là parent) cùng với toàn bộ tag.

Các tag handler phải được cài đặt hai giao tiếp hoặc Tag hoặc BodyTag. Các giao tiếp có thể được dùng để lấy đối tượng Java đã tồn tại và tạo ra một tag handler. Để định nghĩa các tag handler mới chúng ta có thể dùng các lớp TagSupport và BodyTagSupport như là các lớp cơ sở (xem III. 4. Tag handler được triệu gọi như thế nào?).

2. Tag library descriptor.

Tag library descriptor (TLD) là một tài liệu XML dùng để mô tả thư viện tag. Một TLD chứa toàn bộ thông tin về thư viện và mỗi tag chứa trong thư viện. JSP container và các công cụ phát triển JSP sử dụng TLD để xác định các tag.

Các element của TLD sau dùng để định nghĩa thư viện tag:

Code 21: HelloWorldTag.java

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><!-- a tag library descriptor --><taglib>

<tlibversion> <!-- Phiên bản của thư viện tag --><!-- Phiên bản của JSP mà tag handler phụ thuộc -->

<jspversion> <!--Tên mặt định đơn giản có thể dùng bởi công cụ tạo trang JSP để tạo tên với giá trị gợi nhớ; chẳng hạn shortname có thể được dùng như giá trị tiếp đầu ngữ thích hợp trong taglib directive và/hoặc tạo ra các tiếp đầu ngữ cho các id --><shortname> <uri> <!-- URI duy nhất xác định tag library --><info> <!-- Thông tin mô tả về tag library --><tag> ... </tag> ... </taglib>

Tag element yêu cầu đối với mọi tag để xác định một lớp có trong thư viện tag.

<tag><tagclass>classname</tagclass>...

</tag>

3. Các ví dụ.

Để tạo các custom tag chúng ta cần hai import gói cơ bản:

Svth: Đinh Lê Giang Trang 37

Page 36: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*; // tag extension

a) Các tag đơn giản.

-- Tag handlerTag handler

Đối với các tag đơn giản chỉ cần cài đặt hai phương thức của giao tiếp Tag là doStartTag và doEndTag. doStartTag được triệu gọi khi JSP container gặp start tag, nó trả về SKIP_BODY vì thân tag chẳng có nội dung nào cả. Ngược lại khi gặp end tag thì JSP container gọi doEndTag, trả về EVAL_PAGE nếu phần còn lại của trang cần phải định trị, nếu không trả về SKIP_PAGE.Lớp tag handler sẽ được cài đặt như sau:

Code 22: HelloWorldTag.java

public HelloWorldTag extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello World."); } catch (Exception ex) { throw new JspTagException("HelloWorldTag: " + e.getMessage()); } return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; }}

-- TLD elementTLD element

Các tag mà không có thân phải khai báo nội dung của thân là rỗng. Code 23: helloworld.tld

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglibPUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN""http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"><!--Nếu có JSP v1.2 thì đổi lại"http://java.sun.com/j2ee/dtds/jsptaglibrary_1_2.dtd"--><!-- a tag library descriptor --><taglib>

<tlibversion>1.0</tlibversion><jspversion>1.1</jspversion><shortname>legiang</shortname><uri></uri><info>A tag library from authors at http://www.legiang.com/.

Svth: Đinh Lê Giang Trang 38

Page 37: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

</info><tag>

<name>helloWorld</name><tagclass>com.legiang.HelloWorldTag</tagclass><info>Ví dụ với tag đơn giản nhất</info><!-- ‘EMPTY’ is insensitive case --><bodycontent>EMPTY</bodycontent>

</tag><!-- Other tags defined later... -->

</taglib>

-- JSP pageJSP page

Code 24: hello.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>Code 24: hello.jsp (tiếp theo)

<%@ taglib uri = "helloworld.tld" prefix = "legiang" %><title><legiang:helloWorld /></title><!-- stylesheet để hiển thị các tag như h1, …--><link rel = "stylesheet" href ="JSP-Styles.css" type = "text/css"/>

</head><body>

<h1><legiang:helloWorld /></h1><legiang:helloWorld />

</body></html>

b) Các tag có thuộc tính.

-- Định nghĩa các thuộc tính trong Định nghĩa các thuộc tính trong tag handlertag handler..

Đối với mỗi thuộc tínch của tag, chúng ta phải định nghĩa theo phong cách của JavaBean, tức là phải có phương thức get/set[Attribute] trong tag handler.

Hãy nhớ rằng, nếu thuộc tính được đặt tên là id và tag handler kết thừa từ lớp TagSupport thì chúng ta không cần định nghĩa các phương thức get/set[Attribute] bởi vì những thứ này đã được TagSupport làm sẵn.

Lớp tag handler sẽ được cài đặt như sau:

Code 25: HelloWorldTag.java (sữa lại trong Code 22 )

Svth: Đinh Lê Giang Trang 39

Page 38: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

public HelloWorldTag extends TagSupport { private String name = “World.”; public void setName(String name) { this.name = name; } public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello " + name); } catch (Exception ex) { throw new JspTagException("HelloWorldTag: " + e.getMessage());Code 25: HelloWorldTag.java (sữa lại trong Code 22) (tiếp theo)

} return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; }}

-- TLD elementTLD element

Đối với mỗi thuộc tính chúng ta phải xác định thuộc tính nào được yêu cầu (bắt buộc) và giá trị nào có thể được xác định bởi biểu thức. Nếu thuộc tính của tag không bắt buộc thì tag handler nên cung ấp giá trị mật định.

TLD cho tag handler ở trên như sau:

Code 26: TLD file (overwrite helloworld.tld)

... <!-- đoạn này tương tự như mục 1) --><tag>

<name>helloWorld</name><tagclass>com.legiang.HelloWorldTag</tagclass><info>Ví dụ với tag đơn giản nhất</info><attribute>

<name>name</name><required>false</required><rtexprvalue>false</rtexprvalue>

</attribute><!-- ‘EMPTY’ is insensitive case --><bodycontent>EMPTY</bodycontent>

</tag>

-- JSP pageJSP page

Code 27: paramtag.jsp

<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

Svth: Đinh Lê Giang Trang 40

Page 39: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

"DTD/xhtml1-strict.dtd"><html>

Code 27: paramtag.jsp (tiếp theo)

<head> <%@ taglib uri = "helloworld.tld" prefix = "legiang" %>

<title> Tag With Attributes </title><!-- stylesheet để hiển thị các tag như h1, …--><link rel = "stylesheet" href ="JSP-Styles.css" type = "text/css"/>

</head><body>

<h1><legiang:helloWorld name = "BKHN University" /></h1><legiang:helloWorld name = "DHBK Ha Noi" />

</body></html>

c) Các tag có nội dung.

-- Tag handlerTag handler

Tag handler cho loại này được cài đặt khác nhau phụ thuộc vào tag handler có tương tác với thân hay không. Tương tác có nghĩa là tag handler đọc hoặc sữa đổi nội dung của thân hoặc tạo ra giá trị lặp lại cho thân tag.

Các tag có tương tác với phần thân : nếu tag handler không cần tương tác với phần thần thì tag handler này nên cài đặt giao tiếp Tag hoặc dẫn xuất từ lớp TagSupport. Nếu thân của tag cần định trị thì doStartTag cần phải trả về EVAL_BODY_INCLUDE, ngược lại trả về SKIP_BODY.

Các tag có tương tác với phần thân : tag handler phải cài đặt giao tiếp BodyTag hoặc BodyTagSupport, thường cài đặt phương thức doInitBody và doAfterBody. Hai phương thức này tương tác với nội dung của thân được chuyển vào tag handler bởi lớp cài đặt trang JSP. Đối tượng BodyContent cung cấp vài phương thức để đọc và ghi nội dung của nó. Tag handler sử dụng các phương thức getString, getReader của BodyContent để trích thông tin từ phần thân và phương thức writeOut(out) để ghi các nội dung của thân vào luồng xuất. Phương thức getPreviousOut thường được sử dụng để bảo đảm rằng kết quả trả về của tag handler thì có sẳn đối với toàn bộ tag handler. Các phương thức chính được dùng trong loại tag này:

doInitBody : được gọi sau khi nội dung của thân được gán nhưng trước khi được định giá trị, thường được dùng để thực hiện khởi tạo giá trị mà tuỳ thuộc vào nội dung của thân.

doAfterBody: được gọi sau khi nội dung của thân được định trị. Nếu thân được trị nhiều lần lặp đi lặp lại nên trả về EVAL_BODY_TAG, ngược lại trả về SKIP_BODY.

release : tag handler nên xác lập lại trạng thái của nó và giải phóng các tài nguyên dành riêng bằng phương thức release.

Svth: Đinh Lê Giang Trang 41

Page 40: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Ví dụ sau đọc nội dung của thân, chuyển nội dung đó, và sau đó ghi lại những thay đổi vào luồng xuất.

Code 28: TransformTag.java

public class TransformTag extends BodyTagSupport { public int doAfterBody() throws JspTagException { BodyContent bc = getBodyContent(); String body = bc.getString(); bc.clearBody(); try { getPreviousOut().print(body.transform()); } catch (IOException e) { throw new JspTagException("TransformTag: " + e.getMessage()); } return SKIP_BODY; }}

-- TLD elementTLD element

TLD ở đây chỉ sữa đổi lại các ví dụ trên trong bodycontent tag và đặt tên file là transform.tld

<tag>...<bodycontent>JSP<bodycontent>

<tag>

Với các tag có phần thân thì bodycontent tag có hai giá trị. Một là JSP, phần thân bao gồm custom tag, scripting element và văn bản HTML. Tất cả các thứ còn lại có giá trị là tagdependent. Chú ý rằng giá trị của element này không ảnh hưởng tới tiến trình thông dịch của thân.

-- JSP pageJSP page

Code 29: transformtag.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> <%@ taglib uri = "transform.tld" prefix = "legiang" %>

<title> Tag With Body </title><!-- stylesheet để hiển thị các tag như h1, …--><link rel = "stylesheet" href ="JSP-Styles.css" type = "text/css"/>

</head><body>

Svth: Đinh Lê Giang Trang 42

Page 41: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

<h1> Tag With Body </h1><legiang:transform>

Hi! BKHN University</legiang:transform>

</body></html>

d) Các tag định nghĩa các biến kịch bản.

-- Tag handlerTag handler

Tag handler đảm nhận việc tạo và gán đối tượng được tham chiếu bởi biến kịch bản vào ngữ cảnh có thể truy cập từ một trang. Để Làm được điều này bằng cách dùng hoặc phương thức pageContext.setAttribute(name, value, scope) hoặc pageContext.setAttribute(name, value). Thông thường một thuộc tính chuyển vào custom tag phải xác định “tên” của biến đối tượng; Tên này có thể truy xuất bằng cách gọi phương thức get[Attribute] của thuộc tính (xem 2) Các tag có thuộc tính).

Nếu giá trị của biến kịch bản phụ thuộc vào đối tượng hiện tại trong tag handler thì nó có thể truy xuất đối tượng này bằng cách dùng pageContext.setAttribute(name, scope). Các giá trị của tham số scope được tóm tắc trong bảng sau:

Phạm viPhạm vi Có thể truy cập từCó thể truy cập từ Thời gian sống Thời gian sống

page Trang hiện hành

Cho tới khi lời đáp gởi trở lại user hoặc yêu cầu được chuyển tới trang mới

request Trang hiện hành và bất kỳ trang được include hay forward nào

Cho tới khi lời đáp gởi trở lại user

session Yêu cầu hiện hành và bất kỳ yêu cầu tiếp theo trong cùng browser

Đời sống của một phiên làm việc (session)

application Bất kỳ yêu cầu hiện tại và tương lai nào từ cùng một ứng dụng

Đời sống của một ứng dụng

Ngoài việc cài đặt giá trị của biến trong tag handler, chúng ta còn phải định nghĩa một lớp dẫn xuất từ lớp TagExtrInfo. Lớp này cung cấp thông tin cho JSP container về đặt tính của của biến kịch bản, phải cài đặt phương thức getVariableInfo để trả về một mảng các đối tượng VariableInfo chứa các thông tin sau: tên biến, lớp của biến, liệu biến này có tham khảo tới một giá trị đối tượng mới hay đã có, tính sẳn dùng của biến này.

Bảng sau mô tả tính sẳn dùng của biến kịch bản và các phương thức để xác lập và xác lập lại giá trị của biến.

Svth: Đinh Lê Giang Trang 43

Page 42: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Value Availability Methods

NESTED Giữa start tag và end tag.

Trong doInitBody và doAfterBody đối với tag handler cài đặt BodyTag; ngược lại trong doStartTag.

AT_BEGIN Từ start tag cho đến cuối trang.

Trong doInitBody, doAfterBody, và doEndTag đối với tag handler cài đặt BodyTag; ngược lại trong doStartTag và doEndTag.

AT_END Sau end tag cho tới cuối trang.

Trong doEndTag.

Lớp tag handler sau lấy dữ liệu từ JNDI lookup được lưu trữ như là thuộc tính của đối tượng pageContext cùng với tên của biến kịch bản.

Code 30: LookupTag.java

public LookupTag extends TagSupport { private String type; private String name; public void setName(String name) { this.name = name; } public void setType(String type) { this. type = type; } public int doStartTag() { return SKIP_BODY; } public int doEndTag() throws JspException { try { InitialContext context = new InitialContext(); Object obj = (Object)context.lookup(name); pageContext.setAttribute(getId(), obj);

Code 30: LookupTag.java (tiếp theo)

} catch(javax.naming.NamingException e) { throw new JspException("Unable to look up " + name + " due to " + e.getMessage()); } return EVAL_PAGE; }}

Biến kịch bản sẽ được định nghĩa trong lớp dẫn xuất từ lớp TagExtraInfo. Do biến được truyền vào như các thuộc tính của tag nên sẽ được truy xuất bởi phương thức getAttributeString của lớp TagData và dùng để lấp đầy

Svth: Đinh Lê Giang Trang 44

Page 43: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

hàm tạo của VariableInfo. Để cho phép biến kịch bản được dùng trong phần còn lại của trang thì phạm vi của biến nên gán bằng AT_END.

Code 31: LookupTagTei.java

public class LookupTagTEI extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData data) { VariableInfo info1 = new VariableInfo( data.getAttributeString("id"), data.getAttributeString("type"), true, VariableInfo.AT_END); VariableInfo[] info = { info1 } ; return info; }}

-- TLD elementTLD element

Chúng ta cần phải báo cho JSP container biết nó nên dùng lớp TagExtraInfo để tạo ra biến kịch bản với phạm vi thích hợp. Đoạn TLD có tên lookup.tld như sau:

Code 32: TLD file

...<tag>

<tagclass>com.legiang.LookupTag </tagclass><teiclass>com.legiang.LookupTagTEI</teiclass><attribute>

<name>name</name><required>true<required><rtexprvalue>false</rtexprvalue>

</attribute><attribute>

<name>type</name><required>true<required><rtexprvalue>false</rtexprvalue>

</attribute></tag>...

-- JSP pageJSP page

Code 33: JSP file

Svth: Đinh Lê Giang Trang 45

Page 44: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

...<%@ taglib uri = "lookup.tld" prefix = "legiang" %><!-- dùng trong body của JSP --><legiang:lookup id = "sv" type = "UserTransaction" name = "java:comp/ UserTransaction "><!-- Giả sử trong lớp UserTransaction có phương thức begin --><% sv.begin() %>

4. Tag handler được triệu gọi như thế nào?

Giao tiếp Tag định nghĩa một qui ước truyền thông cơ bản giữa tag handler và lớp cài đặt trang JSP. Giao tiếp này định nghĩa chu kỳ sống và các phương thức được triệu gọi khi gặp phải start tag và end tag của một action.

Lớp cài đặt trang JSP triệu gọi các phương thức setPageContext, setParent, và các phương thức cài đặt thuộc tính trước khi gọi phương thức doStartTag. Lớp này cũng bảo đảm rằng phương thức release sẽ được gọi trong tag handler trước khi kết thúc trang. Ví dụ sau thực hiện từng bước cách gọi tag handler.

Code 34: Cách thực hiện tag handler không có BodyContent

ATag t = new ATag();t.setPageContext(...);t.setParent(...);t.setAttribute1(value1);t.setAttribute2(value2);t.doStartTag();t.doEndTag();t.release();

Giao tiếp BodyTag mở rộng từ giao tiếp Tag bằng cách định nghĩa thêm các phương thức cho phép tag handler truy cập vào thân của nó. Giao tiếp này cung cấp ba phương thức mới:

setBodyContent: tạo nội dung của thân tag và thêm vào tag handler.doInitBody: được gọi trước khi định trị thân của tag.DoAfterBody: được gọi trước khi định trị thân của tag.

Ví dụ:

Code 35: Cách thực hiện tag handler có BodyContent

t.doStartTag();out = pageContext.pushBody();t.setBodyContent(out);/* thực hiện các khởi tạo cần thiết sau khi nội dung của thân được gán */

Svth: Đinh Lê Giang Trang 46

Page 45: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

t.doInitBody(); t.doAfterBody(); /**//* Khi doAfterBody trả về EVAL_BODY_TAG chúng ta lặp lại phần định trị cho thân tag */... t.doAfterBody(); /**/t.doEndTag();t.pageContext.popBody();t.release();

Svth: Đinh Lê Giang Trang 47

Page 46: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Phần II: Phần II: Phân Tích – Thiết Kế – Cài ĐặtPhân Tích – Thiết Kế – Cài ĐặtChương IV: PHÂN TÍCH – THIẾT KẾ

I. Phân Tích.

1. Đặt vấn đề.

Xuất phát từ nhu cầu thực tế trong quản lý công việc ở cac công ty hiện nay còn nhiều nhược điểm, việc người quản lý ở cấp càng cao càng không nắm bắt thông tin, không trực tiếp quản lý được tốc độ làm việc của nhân viên mình là khá phổ biến. Hơn nữa trong thời buổi kinh tế thị trường thời buổi của công nghệ thông tin mỗi con người có quá nhiều công việc phải làm, họ không có thời gian rảnh rỗi để ngồi làm báo cáo rồi cuối tuần đem nộp cho quản lý, họ muốn được ở nhà nhưng vẫn biết công việc của mình phải làm trong ngày là gì?, họ muốn có một khoảng thời gian dù ít ỏi để tranh thủ nghỉ ngơi.

Để một phần nào tháo gỡ các khó khăn, nhược điểm và xuất phát từ các yêu cầu thực tế của một số công ty chương trình QUẢN LÝ CÔNG VIỆC TRÊN WEB đã được ra đời. Trong khuôn khổ của một đồ tốt nghiệp đại học do thời gian, các kiến thức nhất là về chuyên môn nghiệp vụ còn hạn chế chắc chắn không tránh khỏi những sai sót. Song với sự nổ lực hết sức nhằm hoàn thành tốt công việc nhưng do thời gian nghiên cứu thực hiện không nhiều, lượng công việc tương đối lớn, trang thiết bị, tài liệu chưa đầy đủ và trình độ hạn chế cho nên chắc chắn đề tài này sẽ có ít nhiều khiếm khuyết từ thực tế đến ý tưởng lập trình, mong được sự lượng thứ và chỉ bảo thêm của các Thầy, Cô.

Rất mong nhận được sự đóng góp ý kiến chân thành từ thầy cô và các bạn để chương trình hoàn thiện hơn sớm được đưa vào sử dụng thực tế.

2. Định nghĩa các yêu cầu.

Quản Lý

- Phân công công việc cho từng nhân viên.

- Kiểm tra tiến độ thực hiện.

- Đánh giá công việc.

- Thống kê.

- Giải đáp thắc mắc.

- Lập bảng đánh giá nhân viên bằng biểu đồ.

- Tổng hợp báo cáo.

- Thiết lập chế độ làm việc trực tiếp giữa hai nhân viên.

Nhân Viên

Svth: Đinh Lê Giang Trang 48

Page 47: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

- Xem các công việc được giao.

- Báo cáo tiến độ thực hiện theo ngày.

- Đề xuất cách giải quyết công việc theo ngày.

- Đóng góp ý kiến xây dựng công ty.

- Báo cáo công việc thực hiện xong.

- Xem các đánh giá của bên quản lý.

Quản Trị Hệ Thống (Admin)

- Tạo/Xoá/Sữa user.

- Thêm/Xoá/Sữa các quyền.

- Gán quyền cho user.

- Refresh database.

- Restore database.

- Cập nhật database.

3. Phạm vi đề tài. Về Dữ Liệu

Cho phép lưu trữ trong một năm phát sinh dữ liệuDữ liệu cập nhật trực tuyến

Về Giao Diện Hệ thống hoạt động trên môi trường Web

Về Mạng Hoạt động trong môi trường mạng Intranet

Về xử lý Thống kê

Thiết lập chế độ làm việc giữa hai nhân viên Lập báo cáo Làm tươi/ Phục hồi CSDL

4. Mô hình xử lý quan niệm.

a) Sơ đồ ngữ cảnh.

Svth: Đinh Lê Giang Trang 49

Page 48: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

b) Sơ đồ phân rã chức năng.

Svth: Đinh Lê Giang Trang 50

Page 49: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

c) Sơ đồ hệ thống.

- Mức 1:

Svth: Đinh Lê Giang Trang 51

Page 50: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

- Mức 2:

Phân rã từ xử lý 4_Phan Cong.

Svth: Đinh Lê Giang Trang 52

Page 51: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Phân rã từ xử lý 5_Cap Nhat CV.

Svth: Đinh Lê Giang Trang 53

Page 52: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Phân rã từ xử lý 6_Thong Ke.

Phân rã từ xử lý 9_Tong Hop Bao Cao.

Svth: Đinh Lê Giang Trang 54

Page 53: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Phân rã từ xử lý 13_Bao Cao Tien Do CV.

Phân rã từ xử lý 16_ Cap Nhat Permission.

Svth: Đinh Lê Giang Trang 55

Page 54: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Phân rã từ xử lý 19_ Cap Nhat User.

Phân rã từ xử lý 20_Gan Quyen.

5. Mô hình dữ liệu quan niệm.

Sơ đồ thực thể kết hợp (ERD):Svth: Đinh Lê Giang Trang 56

Page 55: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Svth: Đinh Lê Giang Trang 57

Page 56: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

II. Thiết Kế.

1. Thiết kế xử lý.

a) Sơ đồ hệ thống mức vật lý.

b) Các đơn vị thiết kế.

Cập nhật công việc.Thêm công việc:Nhập: TenCV & NoiDung & MaDA.Xuất: Thông báo đã thêm / thông báo lỗi.Sữa công việc:Nhập: TenCV | NoiDung | MaDA | DaXong.Xuất: Thông báo đã sữa / thông báo lỗi.Xoá công việc:Nhập: MaCV.Xuất: Thông báo đã xoá / thông báo lỗi.

Phân công công việc.Nhập: MaNV & một hoặc nhiều MaCV & NgayBD, NgayKT.Xuất: Thông báo đã phân công / thông báo lỗi.

Đánh giá công việc.Nhập: MaDG vào bảng Works.Xuất: Thông báo đã đánh giá / thông báo lỗi.

Kiểm tra tiến độ công việc.Chỉ hiện thị các báo cáo tiến độ của nhân viên.

Thiết lập chế độ làm việc.Nhập: MaNV & MaCV & ThietLap vào bảng PhanCong.Xuất: Thông báo đã chuyển giao công việc / thông báo lỗi.

Svth: Đinh Lê Giang Trang 58

Page 57: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Báo cáo tiến độ công việc.Nhập: MaCV & TienDo & Ngay | GhiChu | Kèm tập tin.Xuất: Thông báo báo cáo đã chuyển đi / thông báo lỗi.

Thay đổi mật khẩu.Nhập: Usename & Password củ | Password & Confirm Password mới.Xuất: Thông báo đã đổi mật khẩu / thông báo lỗi.

Thống kê công việc.Thống kê công việc theo ba tiêu chuẩn:

+ Từ ngày đến ngày.+ Theo đánh giá (xếp loại).+ theo đề án.

Làm tươi cơ sở dữ liệu.Nhập: Tên CSDL mới cần phục hồi khi bị hỏng & làm tươi từ ngày nào đến ngày nào | từ tháng nào đến tháng nào | năm nào.Xuất: Thông báo đã làm tươi CSDL / thông báo lỗi.

Phục hồi cơ sở dữ liệu.Nhập: Tên CSDL cần phục hồi (đã có từ làm tươi CSDL).Xuất: Thông báo đã phục hồi hoàn toàn / thông báo lỗi.

c) Một số giải thuật được thể hiện bàng lưu đồ.

Thêm công việc.

Svth: Đinh Lê Giang Trang 59

Page 58: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Phân công công việc.

Svth: Đinh Lê Giang Trang 60

Page 59: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Thống kê công việc.

Svth: Đinh Lê Giang Trang 61

Page 60: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Làm tươi cơ sở dữ liệu.

Svth: Đinh Lê Giang Trang 62

Page 61: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Svth: Đinh Lê Giang Trang 63

Page 62: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

2. Thiết kế cơ sở dữ liệu

a) Mô hình dữ liệu vật lý.

Sơ đồ thực thể kết hợp (ERD):

b) Bảng mô tả chi tiết.

Svth: Đinh Lê Giang Trang 64

Page 63: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Table Vùng Diễn Giải

Kiểu Kích Thướ

c

Giới hạn Giá Trị

Giá Trị

Ngầm định

Ràng buộc

GOPY MAGY Mã Góp Ý

Text 10 Khoá Chính (PK)

MANV Mã Nhân Viên

Text 9 Khoá Ngoại (FK)

NOI DUNG

Nội Dung

Text 50

NGAY Ngày Datetime

>=ngày hiện tại

ngày hiện tại

FILES MAFILE Mã File Int >=1 Khoá Chính (PK)

MABC Mã Báo Cáo

Text 10 Khoá Ngoại (FK)

TENFILE Tên File Text 30FILESIZE Kích

thước File

Long

CONTENTTYPE

Loại Nội Dung File Được Tải Lên Server

Text 30

BAOCAOTONGHOP

MABCTH Mã Báo Cáo Tổng Hợp

Text 10 Khoá Chính (PK)

MACV Mã Công Việc

Int >=1 Khoá Ngoại (FK)

Svth: Đinh Lê Giang Trang 65

Page 64: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

TONDONG

Số LượngCV Còn Tồn Đọng

Int >=1

NGAY Ngày Datetime

>=ngày hiện tại

ngày hiện tại

CVTUONGLAI

Công Việc Sẽ Làm Trong Tuần Tới

DEXUAT Đề Xuất Text 80DANHGIA

MADG Mã Đánh Giá

Int >=1 Khoá Chính (PK)

PHANHOI

Phản Hồi

Text 50

MAXL Mã Xếp Loại

Text 80 Khoá Ngoại (FK)

NHANVIEN

MANV Mã Nhân Viên

Int >=1 Khoá Chính (PK)

MAGROUP

Mã Nhóm

Int >=1 Khoá Ngoại (FK)

TENNV Tên Nhân Viên

Text 25

NGAYSINH

Ngày Sinh

Datetime

< ngày hiện tại

DIACHI Địa chỉ Text 50PHAI Phái Bit Là số

nguyên 0 hoặc 1

PHONE Điện Thoại

Text 9

Svth: Đinh Lê Giang Trang 66

Page 65: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

USERNAME

Tên Người Sử Dụng

Text 16

PASSWORD

Mật Khẩu

Text 16

BAOCAONGAY

MABCN Mã Báo Cáo Ngày

Text 10 Khoá Chính (PK)

MACV Mã Công Việc

int >=1 Khoá Ngoại (FK)

TIENDO Tiến Độ Float 4NGAY Ngày Date

time>=ngày hiện tại

ngày hiện tại

GHICHU Ghi Chú Text 80DEXUAT Đề Xuất

Ý KiếnText 50

WORKS MACV Mã Công Việc

Int >=1 Khoá Chính (PK)

MADA Mã Đề An

Int >=1 Khoá Ngoại (FK)

MADG Mã Đánh Giá

Int >=1 Khoá Ngoại (FK)

TENCV Tên Công Việc

Text 20

NOIDUNG

Nội Dung

Text 100

DAXONG Đã Xong

Bit 0 hoặc 1

DEAN MADA Mã Đề An

Int >=1 Khoá Chính (PK)

TENDA Tên đề An

Text 30

DIADIEM

Địa Điểm

Text 40

Svth: Đinh Lê Giang Trang 67

Page 66: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

XEPLOAI

MAXL Mã Xếp Loại

Int >=1 Khoá Chính (PK)

XEPLOAI Xếp Loại

Text 30

GHICHU Ghi Chú Text 80PHANCONG

MANV Mã Nhân Viên

Text 9 Khoá Ngoại (FK)

MACV Mã Công Việc

Int >=1 Khoá Ngoại (FK)

NGAYBD Ngày Bắt Đầu

Datetime

NgayBD > Ngay KT

Ngày hiện tại

THIETLAP

Thiết lập

Bit 1 0

NGAYKT Ngày Kết Thúc

Datetime

NgayKT > Ngay BD

> Ngày hiện tại

GROUPS MAGROUP

Mã Nhóm

Int >=1

TENGROUP

Tên Nhóm

Text 30 Khoá Chính (PK)

TRGGROUP

Trưởng Nhóm

Text 9

NGAYNC Ngày Nhận Chức

Datetime

GROUPS_PER

MAPER Mã Quyền

Int >=1 Khoá Chính (PK)

MAGROUP

Mã Nhóm

Int >=1 Khoá Chính (PK)

PERMISIONS

MAPER Mã Quyền

Int >=1 Khoá Chính (PK)

TENPER Tên Quyền

Text 20

GHICHU Ghi Chú Text 80

Svth: Đinh Lê Giang Trang 68

Page 67: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

c) Các ràng buộc toàn vẹn .

(RB1) MAGY là khoá chính của GOPY. (RB2) MAFILE là khoá chính của FILES. (RB3) MABCTH là khoá chính của BAOCAOTONGHOP. (RB4) MADG là khoá chính của DANHGIA. (RB5) MANV là khoá chính của NHANVIEN. (RB6) MABCN là khoá chính của BAOCAONGAY. (RB7) MACV là khoá chính của WORKS. (RB8) MADA là khoá chính của DEAN. (RB9) MAXL là khoá chính của XEPLOAI. (RB10) MANV&MACV là khoá chính của PHANCONG. (RB11) MAPER là khoá chính của PERMISSION. (RB12) MAGROUP là khoá chính của GROUPS. (RB13) MAPER & MAGROUP là khoá chính của GROUP_PER. (RB14) MANV là khoá ngoại của GOPY tham chiếu từ

NHANVIEN. (RB15) MABC là khoá ngoại của FILES tham chiếu từ

BAOCAONGAY. (RB16) MACV là khóa ngoại của BAOCAOTONGHOP tham

chiếu từ WORKS (RB17) MAXL là khoá ngoại của DANHGIA tham chiếu từ

XEPLOAI. (RB18) MAGROUP là khoá ngoại của NHANVIEN tham chiếu từ

GROUPS. (RB19) MACV là khoá ngoại của BAOCAONGAY tham chiếu từ

WORKS. (RB20) MADG là khoá ngoại của WORKS tham chiếu từ

DANHGIA. (RB21) MADA là khoá ngoại của WORKS tham chiếu từ DEAN. (RB22) MANV là khoá ngoại của PHANCONG tham chiếu từ

NHANVIEN. (RB23) MACV là khoá ngoại của PHANCONG tham chiếu từ

WORKS. (RB24) MAPER & MAGROUP là khoá ngoại của GROUP_PER

tham chiếu từ GROUPS & PERMISSION. (RB25) Ngày nhận chức > Ngày sinh + 24. (RB26) Ngày kết thúc >= Ngày bắt đầu. (RB27) Một công việc có thể có nhiều nhân viên nhưng tại một thời

điểm chỉ có một nhân viên thực hiện một công việc.

Svth: Đinh Lê Giang Trang 69

Page 68: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

d) Bảng tầm ảnh hưởng.

Works NhanVien

PhanCong

GopY

Files BaoCao

Ngay

BaoCaoTongHop

DanhGia

XepLoai

Groups Groups_Per

Permissions

DeAn

T S X T S X T S X T S X T S X T S X T S X T S X T S X T S X T S X T S X T S X

RB1 X

RB2 X

RB3 X

RB4 X

RB5 X

RB6 X

RB7 X

RB8 X

RB9 X

RB10 X

RB11 X

RB12 X

RB13 X

RB14 X X

RB15 X X

RB16 X X

RB17 X X

RB18 X X

RB19 X X

RB20 X X

RB21 X X

RB22 X

RB23 X

RB24

RB25 X X

Svth: Đinh Lê Giang Trang 70

Page 69: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

RB26 X X

RB27

Svth: Đinh Lê Giang Trang 71

Page 70: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

3. Thiết kế chương trình.Sơ đồ cấu trúc chương trình.

4. Thiết kế giao diện.Các Site map (thay thế cho sơ đồ dịch chuyển trạng thái).

Svth: Đinh Lê Giang Trang 72

Page 71: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Svth: Đinh Lê Giang Trang 73

Page 72: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Svth: Đinh Lê Giang Trang 74

Page 73: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Svth: Đinh Lê Giang Trang 75

Page 74: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Svth: Đinh Lê Giang Trang 76

Page 75: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Chương V : TRIỂN KHAI ỨNG DỤNGI. Các phần mềm cần thiết.

Đây là ứng dụng độc lập nền nên nó có thể chạy trên các hệ điều hành khác nhau như các hệ thống Windows, Unix, …. Do đó chúng ta có thể cài đặt hệ điều hành thuộc một trong các hệ thống trên và các phần mềm sau:

- Jakarta-Tomcat là một Servlet/JSP container. Thật ra theo lý thuyết, ứng dụng này có thể chạy trên bất kỳ container hay web server nào có hổ trợ Servlet/JSP nhưng chúng tôi chưa thử nghiệm trên container khác Jakarta-Tomcat 3.1.

- JDK 1.2 trở lên.

- MySQL Server 3.23.27 bản beta. Hiện nay đã ra bản 4.0.

- JDBC Driver loại bốn hổ trợ cho MySQL Server: mm.msql-2.0.4.

- Xalan và Xerces để chuyển XML thành HTML bằng cách sử dụng XSLT.

- Một trong các web browser sau: Netscape, Inernet Explorer, Opera tất cả từ 4.0 trở lên. Ứng dụng này đã thử nghiệm trên các web browser này.

- VietKey hoặc bất kỳ bộ gõ tiếng việt nào khác.

II. Triển khai ứng dụng web.

Ứng dụng web (ứng dụng server-side java) là một tập các trang JSPs, Servlets, HTML và các tài nguyên khác được gói gọn trong một gói duy nhất và chạy trên nhiều platform từ nhiều nhà sản xuất khác nhau. Ứng dụng Web được xác định trong một đường dẫn đặt biệt ở web server

Một ứng dụng web có thể gồm các thành phần sau:

- JavaServer Pages

- Servlets

- Các lớp tiện ích

- Các tài như xml, html, …

- Enterprise JavaBean (EJB) đối với các ứng dụng xử lý phân tán.

- Các media như images, sounds, …

- Các đối tượng client như javabeans, applets, các lớp, …

Svth: Đinh Lê Giang Trang 78

Page 76: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Mô hình hoạt động của The Web Work. The Web Work hoạt động dựa trên mô hình ba lớp (3 layer). Sau đây là mô hình ba lớp tổng quát của ứng dụng Web.

Trên nền Java hổ trợ cả hai kỷ thuật xử lý Web động là Servlet và JSP. Do đó với từng kỷ thuật tôi có chi tiết hai mô hình (có thể nhiều hơn) dựa trên mô hình ba lớp tổng quát này và gọi là Kiến Trúc Mô Hình Một và Mô Hình Hai.

Ứng dụng sử dụng cả hai mô hình web trên nền Java là Kiến Trúc Mô Hình Một và Mô Hình Hai mà đã và đang còn tranh luận trên các sites nỗi tiếng như javaworld.com, developer.com, weblogic.com.

Trong mô hình một, một trang JSP đảm nhận cả việc xử lý yêu cầu và trả về các kết quả cho client. Ở đây vẫn có sự tách biệt giữa xử lý và hiện thị bởi vì tất cả sự truy cập dữ liệu đều được Beans thực hiện. Mô hình này thích hợp cho các ứng dụng đơn gian, thích hợp với các trang JSP có nhiều mã HTML. Xem hình vẽ sau:

Svth: Đinh Lê Giang Trang 79

Page 77: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

Trong mô hình kiến trúc hai, đó là sự kết hợp cả hai kỷ thuật xử lý web động là Servlet và JSP. Mô hình này rất thích với với các ứng dụng có xử lý phức tạp. Ở đây, Servlets hoạt động như một trạm điều khiển (controller) chịu trách nhiệm xử lý các yêu cầu và khởi tạo các components (Beans, Custom Tag) cho JSP sử dụng. Mô hình này tách phần xử lý và trình bày rỏ ràng nhất.

Svth: Đinh Lê Giang Trang 80

Page 78: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc HảiIII. Hướng dẫn sử dụng.

Sau khi đã cài đặt ứng dụng, bạn mở browser, trong address bar gõ địa chỉ: htttp://servername:port/work/html/showLogin.html .

- servername: tên server của bạn, trên máy cục bộ thường là localhost.

- port: số cổng mà web server đang mở. Nếu số port là 80 thì thông số port không cần nhập.

Nếu bạn sử dụng thường xuyên ứng dụng, bạn nên gán giá trị mật định cho browser với địa chỉ trên. Khi bạn mở browser, ứng dụng tự động được gọi mà bạn không cần phải gõ địa chỉ trên address bar. Thực hiện công việc này trong ba web browser: Internet Explorer, Netscape, Opera như sau:

- Internet Explorer:

Vào Tools menu, chọn Internet Options. Trong hộp thoại Internet Options, chọn General tab, trong khung Home page có Address textbox cho phép bạn gõ địa chỉ trên.

- Netscape:

Vào Edit menu, chọn Preferences…. Trong hộp thoại Preferences, chọn navigator trong hộp thoại category, hiện ra một trang Navigator, chọn Home page button, trong khung Home Page có Location textbox nhập vào địa chỉ trên.

- Opera:

Vào Navigation menu, chọn Set home page…, hiện ra một input box cho chép bạn nhập địa chỉ mới vào.

Svth: Đinh Lê Giang Trang 81

Page 79: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

KẾT LUẬNỨng dụng đã đáp ứng được yêu cầu đề ra trong giai đoạn phân tích thiết kế hệ

thống.

Ứng dụng kết hợp được các công nghệ độc lập nền JSP, XML, XSLT, MySQL Server do đó có thể chạy trên nhiều nền, nhiều Web Server và nhiều Web Broswer khác nhau.

Về cơ sở dữ liệu, sơ đồ thực thể kết hợp đạt dạng chuẩn ba.

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

HƯỚNG PHÁT TRIỂNCác hướng phát triển sau sẽ làm cho ứng dụng hoàn thiện hơn.

- Mở rộng ứng dụng với quy mô lớn hơn, có khả năng trao đổi dữ liệu và xử lý với ứng dụng khác.

- Phát triển ứng dụng để download các files báo cáo về client.

- Quản lý các hình ảnh liên quan về công việc cho ứng dụng sinh động hơn.

- Dùng DOM xử lý XML ngay tại client.

- Cài đặt các ràng buột toàn vẹn trên database server trong phiên bản mới của hệ quản trị cơ sở dữ liệu MySQL (phiên bản 4.0). Do phiên bản hiện tại (đang sử dụng MySQL 3.23.27) không hổ trợ khoá ngoại, check, rule và trigger.

Svth: Đinh Lê Giang Trang 82

Page 80: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải

DANH SÁCH WEB SERVERS HỔ TRỢ JSPĐể chạy được JSP chúng ta cần một trong các Web Server sau. Hãy xem các

hướng dẫn cài đặt, nơi đặt các JSP files, … để thực thi được trong Web Servers đều có đầy đủ trong từng Web Server khi chúng ta download về.

Tên Web Servers

Thuộc Tổ Chức /

Công TyTrang Web

Jakarta Tomcat Apache Org.

http://jakarta.apache.org/

JavaServer Web

Developmet Kit (JSWDK)

Sun Microsystem

http://java.sun.com/products/servlet/download.html

JRun Allaire Inc.

http://www.allaire.com/products/jrun/

ServletExec New Atlanta

http://newatlanta.com/

LiteWebServer

Gefion Software

http://www.gefionsoftware.com/

Java WebServer

Sun Microsystem

http://www.sun.com/software/jwebserver/try/

WebSphere IBM Corp. http://www.ibm.com/

Resin Caucho Technolog

y

http://www.caucho.com/

Svth: Đinh Lê Giang Trang 83

Page 81: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

BẢNG THUẬT NGỮaction

Một element trong trang JSP có thể tác động lên những đối tượng ngầm định và đối tượng server-side khác hoặc có thể định nghĩa biến kịch bản mới (xem element).

custom actionMột action được định nghĩa linh hoạt bởi bộ mô tả thư viện tag và tập các lớp java và được đưa vào trang JSP bằng taglib directive.

declaration Một scripting element mà khai báo các method, biến, hoặc cả hai trong trang JSP. Có cú pháp <%! javacode %> (xem scripting element).

directiveMột element trong trang JSP có nhiệm vụ hướng dẫn JSP container và được thông dịch vào thời gian runtime. Có cú pháp <%@ %> (xem JSP container và scripting element).

element Trình thông dịch JSP công nhận element như là một thành phần trong trang JSP. Một element có thể là directive, action, scripting element. Element bắt đầu với start tag, nội dung và end tag, nếu không có nội dung thì nó dùng cú pháp empty tag.

expression Một scripting element chứa biểu thức của ngôn ngữ java và được đặt vào đối tượng ngầm định out. Có cú pháp <%= java expression %>

implicit object Một đối tượng server-side được định nghĩa bởi JSP container và luôn có sẳn trong trang JSP mà không cần khai báo. Có các đối tượng như request, response, pageContext, session, application, out, config, page, exception.

JSP containerMột thực thể ở cấp hệ thống cung cấp sự hoạt động, quản lý chu trình sống cho các thành phần (conponent) JSP và Servlet.

JSP page implementation classMột lớp của ngôn ngữ lập trình java, cụ thể là một Servlet, được trình bày vào thời gian runtime của một trang và nhận đối tượng request rồi trả về một đối tượng response. Lớp cài đặt trang có thể dùng các dịch vụ của JSP container, gồm cả Servlet API và JSP API.

persistentMột đối tượng được serialization vào đĩa và các thiết bị lưu trữ khác. Persistent có các dạng như files, RDBMS (Relational database management systems), ODBMS (Object database management systems).

Svth: Đinh Lê Giang Trang 84

Page 82: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

reflectionLà cơ chế cho phép mã Java tìm ra các thông tin về các trường, phương thức và hàm tạo của các lớp được tải.

scripting elementLà declaration, scriptlet hay expression, đặt tả JSP định nghĩa các thứ này theo cú pháp tag. Toàn bộ nội dung ngữ cảnh được viết theo ngôn ngữ java.

scriptletMột scripting element chứa bất kỳ đoạn mã của ngôn ngữ kịch bản nào trong trang JSP. JSP v1.2 là phiên bản mới nhất chỉ hổ trợ ngôn ngữ java trong các trang JSP. Có cú pháp <% javacode %>. Tuy nhiên có một số JSP container hổ trợ ngôn ngữ javascript như RESIN.

serializationLà một tiến trình lưu trữ toàn bộ một đối tượng vào đĩa hoặc các thiết bị lưu trữ khác. Ngược lại, một tiến trình phục hồi đối tượng thì gọi là deserialization.

servletMột kỹ thuật server-side được viết bằng Java, JSP phát triển dựa trên nền tảng của servlet.

tag Gồm đoạn văn bản nằm giữa cặp dấu <>, có tên, thuộc tính. Có ba loại tag: start tag, end tag, và empty tag.

Ví dụ:

<book> <!-- start tag -->

content

</book> <!-- end tag -->

<book name=’ Core Servlet & JSP’/> <!-- empty tag -->

tag handlerMột lớp java được cài đặt các giao tiếp Tag hoặc TagBody mà được trình bày vào lúc thời gian runtime đối với một custom action.

tag libraryMột tập các custom action được mô tả trong bộ mô tả thư viện tag (tag library descriptor) và các lớp java.

tag library descriptorMột tài liệu XML mô tả thư viện tag.

transient

Svth: Đinh Lê Giang Trang 85

Page 83: Căn bản về JSP

Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải

Ngược lại với persistent, hầu hết các đối tượng trong bộ nhớ được gọi là transient, có nghĩa là chúng sẽ chết đi khi các tham chiếu của chúng ra khỏi phạm vi hoặc tắc nguồn điện.

Svth: Đinh Lê Giang Trang 86

Page 84: Căn bản về JSP

Ñoà aùn toát nghieäp Gvhd: Ts.Nguyeãn Thuùc Haûi

TÀI LIỆU THAM KHẢO

Tên Tài Liệu Tác Giả Năm Loại Tài Liệu

Ach1 Servlets and JSP Marty Hall 2000 Sách

JSP JavaBeans Framework By IBM 2000 Web site

Tag Libraries Tutorial (v 1.0) Sun Microsystem 2000 Web site

Xalan 2.0 & Xerces 1.3 (API) By apache.org 2001 Web site

XML and Java Hiroshi Maruyama 1999 Sách

XML Professional Didier Martin 2000 Sách

Luận văn tốt nghiệp Các khóa trước

Web Books CD Rom

Giáo trình lý thuyết và bài tập Java Nguyễn Tiến Dũng (Chủ Biên)

1999 Sách

Lập trình ứng dụng Web với JSP/ Servlet

Nguyễn Phương Lan – Hoàng Đức Hoàng

2001 Sách

Java Lập Trình Cơ Sở Dữ Liệu Nguyễn Tiến Nguyễn Văn Tâm Nguyễn Văn Hoài

2001 Sách

Svth: Đinh Lê Giang Trang 87