1. Trang chủ
  2. » Luận Văn - Báo Cáo

Ngôn ngữ cài đặt JavaServer Pages - JSP.doc

67 1,3K 3
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Định dạng
Số trang 67
Dung lượng 685,5 KB

Nội dung

Ngôn ngữ cài đặt JavaServer Pages - JSP

Trang 1

Phần IGIỚI THIỆU VỀ NGÔN NGỮ CÀI ĐẶT

Chương ICĂN BẢN VỀ JSP

JavaServer Pages (JSP) là một kỹ thuật server-side do đó chúng takhông thể thực hiện bất kỳ hành động nào ở client JSP cho phép chúng tatách thành phần động của trang ra khỏi thành phần tĩnh HTML Rất đơngiả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 Van Dau book.” với URL là

http://localhost:8100/thanhk.jsp?title=Van+Dau

Thanks for reading <i><%=request.getParameter(“title”)%><i>book.Kỹ thuật JSP là một thành phần trong đại gia đình Java; nó sử dùngngôn ngữ kịch bản dựa vào ngôn ngữ lập trình Java, và các trang JSP được

biên dịch thành servlets Từ đó chúng ta cũng nhận biết được, JSP thì không

phụ thuộc bất kỳ nền (platform) nào Nó đáp ứng được khuynh hướng củaSun 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ểncủ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ìnhhuố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

Trang 2

trữ các kết quả trong các Beans và điều phối yêu cầu này đến một trongnhữ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ướngnà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ánhcác công nghệ được sử dụng trong ứng dụng với các công nghệ khác

I So sánh JSP với các công nghệ khác.

I.1 JSP với ASP

ASP là công nghệ tương đương từ Microsoft JSP có ba lợi thế so vớiASP

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

I.2 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 Javamà 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

II Các thành phần script của JSP.

Các thẻ bọc mã trong JSP cho phép chúng ta chèn mã vào servlet mã

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

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

luồng xuất của servlet.

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

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

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

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

Template text

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

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

“template text được chuyển thẳng sang HTML tĩnh” Đầu tiên, nếu chúng

ta muốn có <% trong luồng xuất thì chúng ta cần phải đặt <\% trong

template text Thứ hai, nếu chúng ta muốn có chú thích trong JSP mà không

có trong tài liệu kết quả, dùng:

Trang 3

II.1 Các biến được định nghĩa sẵn trong JSP

Để đơn giản hoá mã trong các biểu thức hay scriptlets trong JSP,

người ta cung cấp cho chúng ta chín đối tượng đã được định nghĩa trước, cóngười còn gọi là các đối tượng ngầm định Do các khai báo trong JSP nằm

ngoài phương thức _jspService (được gọi bởi service) nên các đối tượng này

không cho phép các khai báo truy cập vào

request

Biến này có kiểu là javax.servlet.http.HttpServletRequest, có phạm vi

trong một yêu cầu (request) Nó cho phép chúng ta truy cập vào các tham

số của request như loại request (GET, POST, …) và các incoming HTTP

header (cookies)

response

Có kiểu là javax.servlet.http.HttpServletResponse, có phạm vi toàn

trang (page) Chú ý rằng vì luồng xuất thì thường làm vật đệm cho nên việc

gán mã tình trạng của HTTP và response header thì hợp lý trong JSP, mặc

dù điều này thì không được phép trong servlet một khi đã có luồng xuất nào

được gởi đến client

out

Có kiểu javax.servlet.jsp.JspWriter và phạm vi trong một trang (page) Dùng để gởi các thông xuất đến client Đối tượng out được dùng thường

Trang 4

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.

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

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

II.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ồngxuấ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ènvào trong trang Sự định trị diễn ra ở thời gian runtime (khi trang được yêu

Trang 5

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ểuthứ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());

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 elementskhá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ộctính của chúng là:

Tên Element Tên thuộc tính

jsp:setProperty name và value

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

II.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ứchoặ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

III Xử lý nhúng và chuyển hướng giữa các trang

Trang 6

Trong quá trình xử lý và chuyển dữ liệu cho form chúng ta có thểnhúng và triệu gọi những trang JSP khác với trang hiện hành.Ví dụ chúng

ta có thể đưa một trang HTML hoặc JSP vào trong trang JSP hiện tại để hổtrợ thêm thư viện hay tính năng bổ sung nào đó Hay khi nhận được dữ liệusubmit từ trình khách, trang JSP nhận được dữ liệu có thể chuyển hướnghoặc triệu gọi đến trang JSP khác

III.1 Nhúng file vào trang với chỉ thi include

Chỉ thị <%include %> thường dùng để dem một nội dung file htmlhay jsp bên ngoài vào trang hiện hành Cú pháp sử dụng như sau:

<%@include file = “filename”%>

Ví dụ: Trong chương trình chúng ta có sử dụng các hàm thư viện chứatrong file Common.jsp Thư viện này được đưa vào trang JSP hiện hành nhưsau:

<%@include file = “Common.jsp”%>

III.2 Sử dụng thẻ <jsp:include>

Chỉ thị %@include % chỉ dùng để nhúng các mã nguồn tĩnh Nếumuốn nhúng kết quả kết xuất từ các trang jsp, servlet hay html khác vàotrang hiện hành chúng ta sử dụng thẻ <jsp:include> với cú pháp như sau:

<jsp:page include page = “filename” flush = “true”/>

Ví dụ: trong chương trình sử dụng thẻ <jsp:include> để nhúng kết quảcủa trang Header.jsp, Footer.jsp vào các trang JSP như sau:

<jsp:include page = “Header.jsp” flush = “true”/>

<jsp:include page = “Footer.jsp” flush = “true”/>

III.3 Chuyển tham số bằng thẻ <jsp:param>

Khi nhúng trang bằng thẻ <jsp:include> bạn có thể chuyển tham sốcho trang được nhúng để nhận được kết xuất linh động hơn bằng cách sửdụng thẻ con <jsp:param>

Ví dụ

testParam.jsp

<jsp: include page = “testParam2.jsp” flush = “true”>

<jsp:param name = “greeting” value = “Welcome”/>

Trang 7

String param = request.getParameter (“greeting”);

out.println (“Goi tham so tu test2.jsp”);

out.println (“param: “ + param);

%>

III.4 Chuyển tiếp đến trang khác với thẻ <jsp:include>

Chúng ta sử dụng thẻ <jsp:forward> để triệu gọi và chuyển dữ liệucho trang jsp khác xử lý Trong ví dụ sau chúng ta có 3 trang JSP Trang thứnhất hiển thị form đăng nhập yêu cầu nhập vào tên username và password.Trang thứ hai kiểm tra: nếu username, password trùng với username,password cho trước thì thông báo đăng nhập thành công, còn nếu khôngđúng hoặc rỗng sẽ chuyển đến trang thứ 3 thông báo yêu cầu đăng nhậpnhững trường còn thiếu

<form method = post action = “security.jsp”>

Username: <input type = text name = “username”>

Password: <input type = password name = “password”>

<input type = submit value = Login>

Trang 8

<jsp:param name = “sError” value = “Ban nhap lai username &password”/>

III.5 Thẻ jsp:plugin

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

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

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

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

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

Giống như APPLET tag.

iepluginurl

Trang 9

URL cho Internet Explorer mà có thể download Plug-In.

III.6 Thẻ jsp:fallback

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

III.7 Chuyển trang

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.vandau.*” %>

page directive định nghĩa một số thuộc tính phụ thuộc vào trang và giao tiếp

giữa các thuộc tính này với JSP container.

language

Định nghĩa ngôn ngữ kịch bản được sử dụng trong scriptlets, biểu

thức và khai báo Trong JSP 1.2 là phiên bản mới nhất chỉ có hổ trợ “java”cho thuộc tính này do đó “java” này cũng là giá trị mật định

<%@ page language=“java” %>

extends

Thuộc tính này chỉ định lớp cha (superclass) của servlet sẽ được phát

sinh cho trang JSP, có dạng sau:

<%@ page extends=“package.class” %>

Chú ý rằng khi sử dụng thuộc tính này phải hết sức cẩn thận vì tạiserver có thể đã dùng lớp cha mật định

import

Trang 10

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

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

<%@ page errorPage=“Ralative URL” %>

Ngoại lệ tung ra sẽ có sẵn trong biến ngầm định exception.

Trang 11

Xác định trang JSP hiện thời có thể hoạt động như một trang lỗi chomộ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:

III.8 Chuyển hướng sang trang mới với sendRedirect()

Ngoài việc chuyển tiếp chúng ta có thể sử dụng phương thứcsendRedirect() để chuyển hướng và triệu gọi trang JSP khác xử lý Sự khácnhau giữa chuyển tiếp (forward) và chuyển hướng (redirect) đó là lệnhsendRedirect () chỉ thực hiện triệu gọi trang mà không chuyển tham số củatrang hiện hành cho trang chuyển hướng

Ví dụ: từ trang security.jsp ta có thể chuyển hướng đến trangthongbao.jsp bằng lệnh như sau:

IV.1 Khái niệm

Servlet là các thành phần đối tượng nhúng trên trình chủ Web serverthực hiện xử lý yêu cầu và sinh ra các trang Web động trả về máy khách.Để sử dụng được Servlet chúng ta cần có các trình chủ hiểu Java và hỗ trởtriệu gọi Servlet như Apache, Jrun, Web Logic …

Ví dụ sau là một Servlet cơ bản

import javax.servlet.*;

import java.io.*;

public class helloWorldServlet extends GnericServlet

{

Trang 12

public void service (ServletRequest request, ServletResponseresponse) throws IOException

IV.2 Các phương thức xử lý cơ bản của Servlet

Lớp GenericServlet là phần cài đặt tổng quát cho đặc tả giao tiếp(interface) mang tên Servlet Theo đặc tả của giao tiếp Servlet do Sunđưa ra một servlet cơ bản cần có những phương thức phục vụ cho cácnhu cầu khởi tạo (init), hoạt động và phục vụ (service), hủy (destroy),trả về thông tin cấu hình (getServletConfig), trả về thông tin tư thân củaservlet (getServletInfo) Cụ thể lớp giao tiếp Servlet được mô tả nhưsau:

interface Servlet

{

void destroy ()ServletConfig getServletConfig ();

String getServletInfo ();

void init (ServletConfig config);

void service (ServletRequest req, ServletResponse res);

}

IV.2.1 Phương thức khởi tạo init ()

public void init ()

Phương thức khởi tạo này được gọi khi lần đầu tiên trình chủ Webserver nạp mã thực thi của servlet từ tập tin class vào bộ nhớ và bắt đầucho phép servlet hoạt động Chúng ta có thể dựa vào phương thức này đểkhởi tạo các biến môi trường và giá trị ban đầu cần thiết cho quá trình thựcthi servlet sẽ diễn ra tiếp theo Thường trong phương thức init () ta khởi tạogiá trị mảng, tạo sẵn kết nối với cơ sở dữ liệu, nạp các lớp thư viện cầnthiết… Ví dụ chúng ta có thể nạp trình điều khiển JDBC truy xuất cơ sở dữliệu, tạo sẵn kết nối đến nguồn dữ liệu cho servlet trong phương thức init ()như sau:

public class staffView extends GenericServlet

Trang 13

String DBDriver = “sun.jdbc.odbc.JdbcOdbcDriver”;

String strConn = “jdbc:odbc:quanliNV”;

Connection con;

public init (){

Class.forName (DBDriver) newInstance ();

Conn = DriverManager.getConnection (strConn);

}}

IV.2.2 Phương thức phục vụ service ()

public void service (ServletRequest req, ServletResponse res) throwsIOException

Sau khi phương thức init () đã hoàn tất, trình chủ Web server sẽ triệugọi đến phương thức phục vụ service () Phương thức này được xem là trungtâm xử lý của servlet mà chúng ta cần phải cài đặt Khi trình chủ nạpservlet vào bộ nhớ, phương thức init () chỉ được gọi duy nhất một lần trongphương thức service () có thể được triệu gọi nhiều lần ứng với mỗi yêu cầuservlet phát sinh từ trình duyệt phía máy khách Bên trong phương thứcservice () chúng ta có thể sử dụng đối tượng tham số ServletRequest vàServletResponse để tiếp nhận dữ liệu từ trình khách chuyển lên và kết xuấtkết quả phản hồi trở lại trình khách

IV.2.3 Phương thức hủy destroy ()

Khi servlet không còn dùng nữa hoặc hết thời gian qui định lưu giữtrong bô nhớ của trình chủ Web server, nó sẽ bị trình chủ giải phóng Trướckhi servlet bị hủy phươg thức destroy () sẽ được gọi Nếu như chúng ta dùngphương thức init () để thực hiện khởi tạo biến cho servlet thì phương thứcdestroy () ngược lại có thể dùng để dọn dẹp tài nguyên mà các biến chiếmgiữ, đóng các kết nối mà phương thức init () đã mở…

Ví dụ: public destroy ()

Trang 14

{conn.close ();

}

IV.2.4 Phương thức getServletConfig () và getServletInfo ()

Hai phương thức này nhằm mục đích cung cấp thông tin Phương thứcgetServletConfig () giúp người sử dụng servlet có được đối tượngServletConfig chưa các thông tin khởi tạo từ môi trường ngoài đưa vàoservlet, getServletInfo () trả về một chuỗi thông tin mô tả ý nghĩa và mụcđích của servlet

public String getServletInfo ();

public ServletConfig getServletConfig ();

IV.3 Chu trình sống của Servlet và JSP

Chu trình sống của servlet

Chu trình sống tính từ khi servlet bắt đầu được hệ thống gọi nạp vàobộ nhớ cho đến khi nó bị loại khỏi trình chủ Web server vì không còn cầnđến nữa Quá trình sống của servlet trải qua các giai đoạn sau:

Khởi tạo servlet

Trình chủ Web server khởi tạo servlet bằng cách gọi đến phương thứcinit () mà servlet cài đặt Phương thức này chỉ gọi một lần duy nhất Chúng

ta có thể lợi dụng cơ hội này để khởi tạo các biến toàn cục mà servlet sẽ sửdụng sau này

Thực thi servlet

Khi trình duyệt hoặc các trang JSP triệu gọi servlet thông qua địa chỉURL, trình chủ Web server sẽ chính thức gọi servlet thực thi thông qua cácphương thức như doGet (), doPost () hoặc service () Ví dụ khi chúng ta gọitrực tiếp servlet từ địa chỉ URL, phương thức doGet () của servlet sẽ đượcgọi Nếu chúng ta gọi servlet thông qua thao tác post cua thẻ <form> thìphương thức doPost () sẽ được gọi Sau khi các phương thức này được gọi

Trang 15

thực thi xong, servlet vẫn giữ lại trong bộ nhớ để phục vụ cho các lần triệugọi tiếp theo Đây cũng chính là ưu điểm làm cho servlet thực thi nhanh cácứng dụng CGI.

Dọn dẹp servlet

Servlet không giữ lại trong bộ nhớ vĩnh viễn, sẽ đến lúc cần loạiservlet khỏi bộ nhớ Ví dụ như khi nhà quản trị muốn dừng hệ thống, muốnWebserver khởi động lại để giải phóng rác trong bộ nhớ tăng hiệu suấtthực hiện… Trước khi chấm dứt, Web server sẽ gọi đến phương thức hủydestroy () của servlet Đây là cơ hội để servlet thực hiện một số thao tácdọn dẹp cần thiết như lưu dữ liệu xuống đĩa, ghi nhớ trạng thái của servletđể phục vụ cho lần khởi động sau, đóng kết nối với cơ sở dữ liệu… Và mặcdù Java có thể tự động thu gom rác trong bộ nhớ nhưng nếu chúng ta đã cấpphát một khối lượng bộ nhớ lớn cho servlet trong quá trình làm việc, chúng

ta nên thực hiện giải phóng chúng trong phương thức destroy ()

Chu trình sống của JSP

Tương tự như chu trình sống của servlet, trang JSP cũng có cbhu trìnhsống xác định tính từ khi hệ thống đọc biên dịch trang JSP, gọi thực thi vàloại trang khỏi bộ nhớ Chu trình sống của JSP trải qua các giai đoạn sau:

Nạp trang

Kể từ giai đoạn này, quá trình nạp trang tương tư như servlet Chỉ cómột khác biệt đó là servlet chỉ được nạp một lần trong khi mã trang JSPmặc dù đã biên dịch nhưng phải nạp lại nhiều lần mỗi khi Web server nhậnđược yêu cầu trang từ trình duyệt

Khởi tạo

Trang 16

Khi nạp mã trang thành công, Web server sẽ gọi đến phương thứckhởi tạo trang Và mặc dù, JSP được biên dịch ra servlet như phương thứckhởi tạo cho trang JSP lại mang tên jspInit () chứ không phải là init () nhưservlet.

Thực thi

Sau quá trình khởi tạo, Web server sẽ gọi đến phương thức_jspService () Phương thức _jspService sẽ chuyển cho chúng ta hai lớp đốitượng HttpServletRequest và HttpServletResponse để đọc và ghi kết xuấttrả về trình khách

Dọn dẹp

Khi trang JSP đã thực thi xong, trình chủ Web server sẽ gọi phươngthức jspDestroy () để giải phóng mã trang khỏi bộ nhớ Tương tự như trongservlet, chúng ta có thể cài đặt phương thức jspDestroy () thực hiện chứcnăng giảp phóng vùng nhớ hoặc đóng kết nối trả tài nguyên về cho hệthống

IV.4 Ưu và khuyết điểm của Servlet so với JSP

Do mã trang JSP khi thực thi đều được biên dịch ra servlet cho nên tấtcả những gì servlet làm được cũng đồng nghĩa với trang JSP làm được Viếttrang JSP đôi lúc đơn giản hơn viết servlet vì không cần phải qua bướcđăng ký và biên dịch thủ công Tuy nhiên chúng ta cũng nên biết một sốtrường hợp phân biệt giữa JSP và servlet và cách sử dụng chúng

JSP có thể trộn lẫn mã Java với các thẻ HTML cho nên thiết kế trangJSP thường đơn giản và dễ bổ sung hơn so với servlet Tuy nhiên đây cũnglà yếu tố không nên lạm dụng đối với JSP Nếu chúng ta tập trung tất cảmã Java vào cũng với mã HTML, một khi dự án mỡ rộng và trở nên phứctạp, việc bảo trì và nâng cấp ứng dụng Web với hàng trăm trang JSP sẽ rấtkhó khăn Trong quá trình phát triển ứng dụng Web theo nhóm, việc trộnlẫn mã JSp sẽ rất khó khăn Trong qua trình phát triển ứng dụng Web theonhóm, việc trộn lẫn mã Java và HTML trong trang JSP cho thấy không hiệuquả Khó có thể tách rời giữa công việc viết mã cho ứng dụng và nhóm xâydựng giao diện Mã trang JSP ở dạng thuần văn bản nên thường không cheđược mã nguồn của logic chương trình

Với servlet, tuy phải biên dịch và đăng ký thủ công với trình chủnhưng bù lại tính bảo mật cao hơn Chúng ta chủ cần cung cấp cho trình chủWeb server bản servlet nhị phân (file class) đã qua bước biên dịch mãkhông cần đến mã nguồn của servlet ban đầu Mặc khác, các servlet có thểtương tác liên hoàn, với nhau để tạo nên những kết xuất tùy biến và đadạng trước khi trả kết quả về cho trình khách Servlet có thể phân rã cácđơn thể của dự án và phát triển độc lập nhau như các thành phần riêng biệtđể ráp lại trong một tổng thể chung Tuy nhiên, việc kết xuất trong servletthường dựa vào phương thức print () hoặc println () Công việc quyết định

Trang 17

giao diện cho kết xuất hoàn toàn phụ thuộc vào lập trình viên với hàng loạtcác lệnh print () hay println () rất khó quản lý.

Quyết định sử dụng JSP, Servlet hay kết hợp cả hai là tuỳ vào từng dựán và mục đích của chương trình mà chúng ta muốn phát triển Thôngthường đối với những dự án nhỏ, yêu cầu thời gian nhanh, JSP là lưa chọnthích hợp nhất Trường hợp với dự án cần sự độc lập và chỉ thiên về xử lý

ta nên sử dụng servlet Trường hợp với dự án lớn chúng ta nên kết hợp cảservlet và JSP Mô hình kết hợp tốt nhất giữa servlet và JSP thường đượcgọi là MCV (Model – View – Controler) trong đó servlet đóng vai trò trungtâm điều khiển (controler) đưa ra các quyết định xử lý JSP đóng vai trò thểhiện giao diện hay hiển thị dữ liệu đã xử lý Quy trình tính toán logic củaứng dụng được giao lại cho các thành phần JavaBean hay EJB

Trang 18

Chương II

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ânchia 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à quantâ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 trangJSP

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

Trang 19

- Chúng có thể được lồng với nhau và cho phép các tương tác phứctạ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ởitạ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.

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

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

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

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

Trang 20

<tlt:helloWorld />

II.2.2 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ácphươ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 đốitượng request hoặc từ một hằng chuổi Chỉ có các kiểu thuộc tính trongbảng sau mới có thể được gán từ các giá trị tham số của request và của cáchằng chuổi

Kiểu thuộc tính Phương thức valueOf chuyển chuổ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 gianyê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=’Phan Van Dau’/>

II.2.3 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ó.

Trang 21

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ụngmột biến chứa một đối tượng được trả về

ii 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’/>

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.

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

Trang 22

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 Các phương thức cần xử lý

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, 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ácphươ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

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

II.4 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:

HelloWorldTag.java

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE taglib

Trang 23

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

II.5 Các ví dụ

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

import javax.servlet.jsp.*;

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

1 Các tag đơn giản

-Tag 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ôngtrả về SKIP_PAGE

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

HelloWorldTag.java

public HelloWorldTag extends TagSupport {

public int doStartTag() throws JspException {

Trang 24

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 >

Trang 25

hello.jsp (tiếp theo)

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

<title>

<vandau:helloWorld />

</title>

<! stylesheet để hiển thị các tag như h1, … >

<link rel = "stylesheet" href ="JSP-Styles.css" type =

II.5.1 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:

HelloWorldTag.java

public HelloWorldTag extends TagSupport {

private String name = “World.”;

public void setName(String name) {

this.name = name;

}

Trang 26

public int doStartTag() throws JspException {

try {

pageContext.getOut().print("Hello " + name);

} catch (Exception ex) {

throw new JspTagException("HelloWorldTag: " +

TLD file (overwrite helloworld.tld)

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

Trang 27

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

<title> Tag With Attributes </title>

<! stylesheet để hiển thị các tag như h1, … >

<link rel = "stylesheet" href ="JSP-Styles.css" type =

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:

Trang 28

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ượclạ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

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

TransformTag.java

public class TransformTag extends BodyTagSupport {

public int doAfterBody() throws JspTagException {

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

Trang 29

<%@ taglib uri = "transform.tld" prefix = "vandau" %>

<title> Tag With Body </title>

<! stylesheet để hiển thị các tag như h1, … >

<link rel = "stylesheet" href ="JSP-Styles.css" type =

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 vi Có thể truy cập từ Thời gian sống

page Trang hiện hành Cho tới khi lời đáp

Trang 30

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 theotrong cùng browser

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

applicat

ion

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 ứngdụ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 đặtphươ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ớimộ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

NESTED Giữa start tag và

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.

LookupTag.java

Trang 31

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;

InitialContext context = new InitialContext();

Object obj = (Object)context.lookup(name);

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

LookupTagTei.java

public class LookupTagTEI extends TagExtraInfo {

public VariableInfo[] getVariableInfo(TagData data) {

Trang 32

return info;

}

}

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:

<%@ taglib uri = "lookup.tld" prefix = "vandau" %>

<! dùng trong body của JSP >

<vandau:lookup id = "sv" type = "UserTransaction"

name = "java:comp/ UserTransaction ">

<! Giả sử trong lớp UserTransaction có phương thức begin >

<% sv.begin() %>

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

Trang 33

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.

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

ATag t = new ATag();

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

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. - Ngôn ngữ cài đặt JavaServer Pages - JSP.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 (Trang 30)
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. - Ngôn ngữ cài đặt JavaServer Pages - JSP.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 (Trang 30)
I.4. Mô hình xử lý quan niệm I.4.1. Sơ đồ ngữ cảnh - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
4. Mô hình xử lý quan niệm I.4.1. Sơ đồ ngữ cảnh (Trang 47)
I.4.2. Sơ đồ phân rã chức năng - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
4.2. Sơ đồ phân rã chức năng (Trang 47)
Bảng chi tiết NV Bảng chi tiết NV - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
Bảng chi tiết NV Bảng chi tiết NV (Trang 48)
I.4.3. Sơ đồ hệ thống - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
4.3. Sơ đồ hệ thống (Trang 48)
Bảng cập nhật user - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
Bảng c ập nhật user (Trang 49)
Bảng cập  nhật user - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
Bảng c ập nhật user (Trang 49)
I.5. Mô hình dữ liệu quan niệm Sơ đồ thực thể kết hợp - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
5. Mô hình dữ liệu quan niệm Sơ đồ thực thể kết hợp (Trang 50)
Bảng cập nhật user - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
Bảng c ập nhật user (Trang 51)
II.1.1. Sơ đồ hệ thống mức vật lý - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
1.1. Sơ đồ hệ thống mức vật lý (Trang 51)
Mở bảng NHANVIEN - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
b ảng NHANVIEN (Trang 53)
Mở bảng permission - Ngôn ngữ cài đặt JavaServer Pages - JSP.doc
b ảng permission (Trang 54)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w