JSP Technology.doc

88 819 2
JSP Technology.doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

JSP Technology

Trang 1

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

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ể thaythế 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

Trang 2

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

Cả ba định hướng này đều có chổ đứng của nó Chẳng có định hướng nào hổ trợ đầy đủ cho mọi ứng dụng

Trước khi đi vào chi tiết công nghệ JSP, chúng tôi có một vài so sánh các công nghệ được sử dụng trong ứng dụng với các công nghệ khác.

I Một số so sánh các công nghệ được sử dụng với công nghệ khác?

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.

Trang 3

- Phần động được viết bằng Java, chứ không phải bằng các ngôn ngữ script như VBScript, JavaScript Vì thế nó mạnh mẽ hơn tốt hơn đối với các ứng dụng phức tạp cần các thành phần sử dụng lại.

- JSP chạy được trên nhiều hệ điều hành và web servers khác nhau ngay cả với IIS của Microsoft (cần có plugins từ Webphere, JRun, )

- Hổ trợ sự mở rộng tag với custom tag.

b) JSP với PHP.

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

3 Tầm quan trọng của XML cùng với XSLT.

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

Trang 4

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

CDF : Channel Difinition Format – cho phép các tác giả của các Web sites cho phép các người đăng ký biết khi nào Web site này thay đổi, CDF đã được giới thiệu trong IE4 vì vậy nó chỉ làm việc với IE của Microsoft.

SMIL : Synchronized Multimedia Integration Language – được sử dụng để đồng bộ hóa các dòng dữ liệu đa truyền thông được truyền qua internet.

CML : Chemical Markup Language – mô tả các công thức hóa học.

MML: Mathematical Markup language- mô tả các phương trình, biểu thức toán học.

Tính tự mô tả dữ liệu của XML : các tags mô tả các vấn đề, các đối

tượng gần gủi với thế giới thực Chúng ta sẽ thấy rõ hơn với hai ví dụ sau, đây là ví dụ minh họa nên nó còn thiếu nhiều thuộc tính trong thế giới thực :

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

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

Ví dụ với XML tags

Trang 5

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

XML là một định dạng chuẩn mà các hệ quản trị cần hổ trợ Hiện nay có nhiều hệ quản trị lớn hổ trợ XML như MS SQL Server, Oracle, …

b) XSLT.

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

II JSP scripting elements.

Các scripting elements trong JSP cho phép chúng ta chèn mã vào servlet

mà sẽ được phát sinh từ trang JSP Có ba dạng sau:

- Biểu thức có dạng <%= expressions %>, được định giá trị và chèn

vào luồng xuất của servlet.

- Scriptlet có dạng <% code %>, được chèn vào phương thức

_jspService của servlet (được gọi là service).

- Khai báo có dạng <%! code %>, được chèn vào thân của lớp servlet,

như là các field của lớp thông thường.

Template text

Trong nhiều trường hợp, phần lớn các trang JSP chỉ bao gồm HTML tĩnh,

được biết như là template text Có hai ngoại lệ phụ cho quy tắc “template text

được chuyển thẳng sang HTML tĩnh” Đầu tiên, nếu chúng ta muốn có <%

trong luồng xuất thì chúng ta cần phải đặt <\% trong template text Thứ hai,

nếu chúng ta muốn có chú thích trong JSP mà không có trong tài liệu kết quả,

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:

Trang 6

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

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.

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

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

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.

Trang 7

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

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.

Biến này có kiểu là javax.servlet.ServletContext, có phạm vitrong toàn ứng dụng (application) ServletContext lấy từ một đối

tượng cấu hình servlet là getServletConfig().getContext() Cáctrang 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

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 vilà 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 íchtrong ngôn ngữ lập trình Java, có kiểu là java.lang.Object và có

phạm vi trang (page).

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

Trang 8

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

2 Biểu thức trong JSP

Biểu thức trong JSP được dùng để chèn các giá trị trực tiếp vào luồng xuất Nó có dạng sau:

<%= Java expressions %>

Biểu thức này được định trị, được chuyển thành chuổi, và được chèn vào trong trang Sự định trị diễn ra ở thời gian runtime (khi trang được yêu cầu) và do đó có đầy đủ quyền truy cập các thông tin của yêu cầu này Ví dụ sau đây mô tả ngày/giờ mà trang được yêu cầu:

Current time: <%= new java.util.Date() %>

Trong Java mỗi câu lệnh đều có dấu ‘;’ kết thúc dòng Tại sao biểu thức trong JSP lại không có dấu ‘;’? Vì biểu thức này được đưa vào luồng xuất

chẳng hạn như PrintWriter Với ví dụ trên có thể chuyển vào servlet như sau:

PrintWriter out = response.getWriter();

out.println(“Current time:” + new java.util.Date());

a) Biểu thức như là giá trị trong elements khác.

Biểu thức có thể được sử dụng trong các thuộc tính của các elements khác Giá trị từ các biểu thức này sẽ được tính vào thời gian yêu cầu (request time) Các elements cho phép sử dụng biểu thức trong các thuộc tính của chúng là:

jsp:setProperty name và 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"

Trang 9

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

<meta name="author" content="Giang" /> <meta name="keywords" content=

"JSP,expressions,JavaServer,Pages,servlets" /> <meta name="description" content=

Code 1: expression.jsp (tiếp theo)

"A quick example of JSP expressions." /> <link rel="stylesheet" href="JSP-Styles.css"

<li>Your session ID: <%= session.getId() %></li>

<li>The <code>testParam</code> form parameter:

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

Trang 10

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

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>

Trang 11

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

4 Khai báo trong JSP

Một khai báo trong JSP cho phép chúng ta định nghĩa các phương thức hoặc các trường (biến) có phạm vi toàn trang Khai báo sẽ được chèn vào

trong lớp của servlet (bên ngoài phương thức _jspService được gọi bởi service

để xử lý một yêu cầu) Một khai báo có dạng sau: <%! Java Code %>

Các khai báo trong JSP thì không phát sinh ra bất kỳ thông xuất nào, chúng thường được dùng để liên kết với các biểu thức hoặc scriptlets Chẳng hạn, đây là một trang JSP mà in ra số lần truy cập vào trang.

<title>JSP Declarations </title>

<link rel="styleshhet" href="JSP-Styles.css" type="text/css" /> </head>

<h1>JSP Declarations</h1>

<%! private int accessCount = 0; %>

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

</body> </html>

III JSP directives.

Directives là các lệnh (chỉ thị) đến JSP container để xử lý trang JSP,chúng tác động lên toàn bộ cấu trúc của lớp servlet Chúng có dạng sau:

<%@ directive {attr=“value”} %>

Cú pháp này thì dễ để soạn thảo, ngắn gọn, súc tích nhưng không tương thích với XML (Cú pháp XML ở dưới).

Directives thì không xuất bất kỳ thứ gì ra luồng xuất out Chỉ có badirectives trong JSP: page, include và taglib.

Cú pháp XML

Trang 12

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

Tương tự như scripting elements, các directives cũng có hai dạng cú pháp:

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

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

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

Trang 13

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

Thuộc tính này mô tả các kiểu sẵn dùng trong môi trường kịch

bản (theo java) Chúng ta có thể import vào từng lớp hoặc cả

một gói (package).

<%@ page import=“package.class | package.*” %> Nếu import vào nhiều lớp hay packages thì cách nhau dấu “,”.

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.

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.

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.

Định nghĩa một chuỗi có thể truy xuất từ servlet bằng phương

thức getServletInfo().

Trang 14

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

<%@ page info=“Some Message” %>

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.

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.

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

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

<title>The page Directive</titlle> <link rel="styleshhet" href="JSP-Styles.css" type="text/css" />

Trang 15

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

</head> <body>

<h2>The page Directive</h2>

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

private String randomID() {

int num = (int)(Math.random()*10000000.0);

Cookie[] cookies = request.getCookies();

String oldID = ServletUtilities.getCookieValue(cookies, "userID",

<% JSP Expressions (xem phần I.II.2) %>

This page was accessed at <%= new Date() %> with a userID cookie of <%= oldID %>.

</body> </html>

2 The include directive

Chúng ta sử dụng include directive để đưa một file vào tài liệu JSP chính

vào lúc tài liệu dịch thành servlet (mà thường vào lần đầu tiên truy cập vào trang này) Có cú pháp như sau:

Trang 16

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

<%@ include=“Relative URL” %>

Thật sự JSP chia làm hai nhánh để include một file vào một tài liệu chính File được include thì được chèn vào trang vào lúc biên dịch, Còn nhánh

còn lại thì được chèn vào tại thời gian yêu cầu (request) với element là

jsp:include sẽ được trình bày trong mục IV Các action chuẩn.

File được include vào không những chứa HTML tĩnh mà còn chứa được mã JSP động Đặc tính này cho phép chúng ta tạo các thanh định hướng, các phần thông tin cần tương tác, đếm số trang, riêng trên một file khi chúng ta có nhiều trang sử dụng lại chúng Nếu file được include thay đổi thì tất cả JSP files sử dụng nó cần phải được cập nhật lại.

Ví dụ về include directive

File đầu tiên là một đoạn của trang chứa các thông tin tương tác cần

thiết cho file thứ hai dùng lại bằng include directive.

Code 5: contact.jsp

<%@ page import="java.util.Date" %>

<% Các biến sau sẽ trở thành các fields trong servlet khi JSP file gọi file này %>

<%! private int accessCount = 0; private Date accessDate = new Date();

private String accessHost = "<i>No previous access</i>"; %>

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

Trang 17

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

<title>The include Directive</title>

<link rel="styleshhet" href="JSP-Styles.css" type="text/css" />

<p>Information about our products and services.</p> <p>Le, Le, Le.</p>

<p>Giang, Giang, Giang.</p>

<%@ include file="contact.jsp" %>

</body> </html>

3 The taglib directive

Directive này định nghĩa thư viện tag và tiếp đầu ngữ cho những custom

tag được sử dụng trong trang JSP Có cú pháp sau:

<%@ taglib uri=“URIToTagLib” prefix=“tagPrefix”%>

taglib directive sẽ được trình bày chi tiết trong chương III.

IV Các action chuẩn.

Actions chẳng qua là elements được định nghĩa trong bản đặc tả JSP và

luôn luôn có sẵn trong các JSP file mà không cần import vào bất kỳ thứ gì và

chúng có cú pháp XML Có chín actions chuẩn: jsp:include, jsp:useBean,

jsp:setProperty, jsp:getProperty, jsp:plugin, jsp:forward, jsp:fallback,jsp:params, jsp:param sẽ được giới thiệu trong mục này.

1 Action chèn vào files ở thời gian request.

Với include directive cho phép chúng ta thêm vào các tài liệu chứa mã

JSP vào nhiều trang khác nhau nhưng lại có vấn đề là đòi hỏi chúng ta phải cập nhật lại ngày sữa đổi của trang khi file được include thay đổi Để loại bỏ

vấn đề này đặt tả JSP cung cấp cho chúng ta một action là <jsp:include> để

Trang 18

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

include các file vào thời gian yêu cầu (request) Mặc khác, do trang được biên

dịch thành servlet vào thời gian yêu cầu vì thế các file được include không thểchứa mã JSP Cú pháp của action này là:

<jsp:include page=“Relative URL” flush=“true”>

Ví dụ sau sử dụng jsp:include action để include bốn file html, ví dụ này

chỉ hiện thị các thông tin của các web sites nỗi tiếng.

<li><jsp:include page="item1.html" flush="true" /></li> <li><jsp:include page="item2.html" flush="true" /></li> <li><jsp:include page="item3.html" flush="true" /></li> <li><jsp:include page="item4.html" flush="true" /></li>

</ol> </body> </html>

Code 8: item1.html

<b>Bill Gates acts humble.</b> In a startling and unexpected development, Microsoft big wig Bill Gates put on an open act of

Trang 19

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

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

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

Trang 20

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

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

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

Tuy nhiên, lại thật không may mắn là APPLET tag bình thường sẽ

không làm việc với Plug-In vì các trình duyệt được thiết kế riêng chỉ sử dụng máy ảo (Virtual Machine) có sẳn của chúng khi chúng gặp APPLET Thay vì

thế, chúng ta phải sử dụng OBJECT tag đối với IE và EMBED tag đối với

Netscape Hơn nữa vì chúng ta không biết loại trình duyệt nào sẽ truy cập vào trang chúng ta nên chúng ta phải hoặc là include cả OBJECT lẫn EMBED (đặt EMBED trong phần COMMENT của OBJECT) hoặc là xác định loại trình

duyệt vào thời gian yêu cầu để dùng tag đúng cho loại trình duyệt đó Quá

trình này thì hiển nhiên nhưng nhàm chán và mất thời gian.

Action jsp:plugin chỉ dẫn server xây dựng một tag thích hợp cho các

applet mà sử dụng Plug-In.

a) jsp:plugin action.

Phương cách đơn giản nhất để sử dụng jsp:plugin là cung cấp cho nóbốn thuộc tính: type, code, width, height Chúng ta định giá trị “applet” cho

thuộc tính type và ba thuộc tính còn lại sử dụng giống như APPLET tag bìnhthường Với ngoại lệ là các action thì có cú pháp XML nên các thuộc tínhtrong nó cũng phải theo qui ước XML Ví dụ với APPLET tag trong HTML

Trang 21

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

Ngoài bốn thuộc tính này jsp:plugin còn có các thuộc tính sau và hầu

hết giống (nhưng không phải là tất cả) như các thuộc tính của APPLET tag.

codebase, align, archive, hspace, name, vspace, title

Giống như APPLET tag.

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:param name=“PARAM1” value=“VALUE1” />

Trang 22

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

</jsp:params> </jsp:plugin>

c) jsp:fallback action.

jsp:fallback cung cấp văn bản thay thế đối với các trình duyệt không hổ

trợ OBJECT hay EMDEB Chúng ta sử dụng action này giống như là dùng văn

bản thay thế được đặt trong APPLET tag Ví dụ chúng ta có thể thay thế

Code 13: Sử dụng jspfallback

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;

Trang 23

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

<jsp:forward page=“<%= dest %>” />

Action này cho phép điều phối một request hiện hành vào lúc runtimeđến một tài nguyên tĩnh, trang JSP hay lớp servlet trong cùng một ứng dụng.

b) Sử dụng component trong JSP.

Chúng ta có thể sử dụng các actions sau để sử dụng lại các component(Beans) trong JSP: jsp:useBean, jsp:setProperty, jsp:getProperty Các action

này được trình bày trong chương II.

Trang 24

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

Trang 25

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

Bean được sử dụng trong bất kỳ trang nào trong ứng dụng hiện hành (cả request hiện tại và tương lai).

b) jsp:setProperty element

Gán một giá trị hoặc nhiều giá trị (thuộc tính mảng) của thuộc tính vào Bean.

Cú pháp:

<jsp:setProperty name = “beanName” options />

options có thể hoặc (|) trong các thuộc tính sau:

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 Tuynhiên, phương thức getter không cần trả về kiểu String một cách tường minhvì 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:

boolean Java.lang.Boolean.toString(boolean)

Trang 26

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

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ốcthí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.

boolean or Boolean java.lang.Boolean.valueOf(string) byte or Byte java.lang.Byte.valueOf(string) char or Character java.lang.Character.valueOf(string) double or Double java.lang.Double.valueOf(string) int or Integer java.lang.Integer.valueOf(string) float or Float java.lang.Float.valueOf(string) long or Long java.lang.Long.valueOf(string)

a)Introspector là gì?

Introspector là bộ phân tích mà qua đó Java xem xét các đoạn mã của

chương trình để tìm ra những phương thức dùng để xây dựng và áp dụng cho từng thuộc tính cũng như tình huống cụ thể Chúng ta không cần quan tâm đến các khai báo phức tạp khác Ví dụ thiết lập hai phương thức sau:

public void setAge(int age)public int getAge()

Theo cách này Bean container sẽ hiểu là chương trình muốn tạo ra thuộc tính là age có kiểu int – Bean container sẽ chuyển các thuộc tính theo quy tắc:

FoorBar  foorBar

URL  URL

Trang 27

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

b)Thiết kế các phương thức mẫu dùng cho thuộc tính.

Đối với thuộc tính mang những trị đơn, hai phương thức getter và

setter được viết theo mẫu sau (với getter và setter xem 4.Thuộc tính của Bean):

public void setAttributeName(AttributeType param)public AttributeType getAttributeName()

Đối với thuộc tính mang những trị kiểu boolean, phương thức getter

được dùng với tiếp đầu ngữ là is thay cho get:

public void setAttributeName(AttributeType param)public boolean isAttributeName()

Đối với thuộc tính gồm nhiều phần tử (index attribute) các phương thức

getter và setter cũng được thiết lập tương tự Chúng ta có thể sử dụng một

cặp phương thức hay cả hai cặp phương thức cũng được.

public void setAttributeName(int index, AttributeType value)

public AttributeType getAttributeName()

và/hoặc

public void setAttributeName(AttributeType[] value)public AttributeType[] getAttributeName()

c) Khai báo các phương thức một các tường minh.

Nếu không muốn bộ phân tích Introspector ngầm định, chúng ta có thể

khai báo và xử lý các phương thức một cách tường minh nhờ vào một lớp phụ

dùng để mô tả các phương thức được gọi là BeanInfo Khi Beans có tên là xxxđược biên dịch, trước tiên Bean container sẽ đi tìm lớp có tên là xxxBeanInfo.

Nếu lớp này 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 để

Trang 28

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

đá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;

Trang 29

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

</body> </html>

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

Code 17: Java file

public boolean isAuthorized() {

Code 17: Java file (tiếp theo)

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

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

Code 19: Java file

Trang 30

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

public double getAverage() { double sum = this.getSum();

public double getSum() {

Code 19: Java file (tiếp theo)

Trang 31

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

double[] numbers = stat.getNumbers(); for (int i=0; i < numbers.length; i++) {

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

Trang 32

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

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

Để 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)

Trang 33

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

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 độngkém, trước tiên JSP container xoá từng mục dữ liệu trong session, rồi kíchhoạ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 sẽ 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.

Trang 34

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

Trang 35

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

boolean or Boolean java.lang.Boolean.valueOf(String) byte or Byte java.lang.Byte.valueOf(String) char or Character java.lang.Character.valueOf(String) double or Double java.lang.Double.valueOf(String) int or Integer java.lang.Integer.valueOf(String) float or Float java.lang.Float.valueOf(String) long or Long java.lang.Long.valueOf(String)

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

Trang 36

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

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

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ệntag, 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ớimột tag nào đó Các phương thức của tag handler được gọi bởi lớp cài đặttrang 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

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

Trang 37

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

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ớitrang JSP Con đường vào API này là đối tượng pageContext, qua đó taghandler có thể truy cập vào mọi đối tượng ngầm định khác như request,

session, 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 handlernà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 trongthư 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" ?>

Trang 38

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

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

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

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

Đố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ântag chẳng có nội dung nào cả Ngược lại khi gặp end tag thì JSPcontainer 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

Trang 39

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

public HelloWorldTag extends TagSupport { public int doStartTag() throws JspException {

try { pageContext.getOut().print("Hello World."); } catch (Exception ex) {

throw new JspTagException("HelloWorldTag: " + <info>Ví dụ với tag đơn giản nhất</info>

<! ‘EMPTY’ is insensitive case > <bodycontent>EMPTY</bodycontent> </tag>

<! Other tags defined later >

Trang 40

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

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 =

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

- Định nghĩa các thuộc tính trong tag 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 )

public HelloWorldTag extends TagSupport { private String name = “World.”;

Ngày đăng: 21/08/2012, 16:17

Hình ảnh liên quan

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. - JSP Technology.doc

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 Xem tại trang 47 của tài liệu.
4. Mô hình xử lý quan niệm. a) Sơ đồ ngữ cảnh. - JSP Technology.doc

4..

Mô hình xử lý quan niệm. a) Sơ đồ ngữ cảnh Xem tại trang 54 của tài liệu.
5. Mô hình dữ liệu quan niệm. - JSP Technology.doc

5..

Mô hình dữ liệu quan niệm Xem tại trang 62 của tài liệu.
Nhập: MaDG vào bảng Works. - JSP Technology.doc

h.

ập: MaDG vào bảng Works Xem tại trang 63 của tài liệu.
Hiển thị bảng thống kê - JSP Technology.doc

i.

ển thị bảng thống kê Xem tại trang 68 của tài liệu.
- Xoá các mẩu tin trong các bảng phát sinh - JSP Technology.doc

o.

á các mẩu tin trong các bảng phát sinh Xem tại trang 69 của tài liệu.
d) Mô hình dữ liệu vật lý. - JSP Technology.doc

d.

Mô hình dữ liệu vật lý Xem tại trang 70 của tài liệu.
e) Bảng mô tả chi tiết. - JSP Technology.doc

e.

Bảng mô tả chi tiết Xem tại trang 71 của tài liệu.
g) Bảng tầm ảnh hưởng. - JSP Technology.doc

g.

Bảng tầm ảnh hưởng Xem tại trang 77 của tài liệu.
Mô Hình Ứng Dụng Web 3 Lớp Tổng Quát - JSP Technology.doc

nh.

Ứng Dụng Web 3 Lớp Tổng Quát Xem tại trang 85 của tài liệu.
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 - JSP Technology.doc

rong.

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 Xem tại trang 86 của tài liệu.

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan