Đị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 là một đối tượng Java bất kỳ cài đặt interface Serializable. Chúng ta thường truy xuất các đối tượng Java thông qua thuộc tính của nó, với JavaBean điều này cũng hoàn toàn tương tự nhưng thường JavaBean không sử dụng trực tiếp cú pháp Java để truy xuất thuộc tính. JavaBean sử dụng các thẻ tương tự như HTML để định nghĩa Bean, thiết lập hoặc lấy về các giá trị 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ạ.
67 trang |
Chia sẻ: maiphuongdc | Lượt xem: 1443 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Luận văn Chương trình Quản lý nhân sự Công ty TNHH kỹ thuật Xoài, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
). Phương thức _jspService sẽ chuyển cho chúng ta hai lớp đối tượng HttpServletRequest và HttpServletResponse để đọc và ghi kết xuất trả 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ương thức jspDestroy () để giải phóng mã trang khỏi bộ nhớ. Tương tự như trong servlet, chúng ta có thể cài đặt phương thức jspDestroy () thực hiện chức nă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ất cả những gì servlet làm được cũng đồng nghĩa với trang JSP làm được. Viết trang 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ế trang JSP thường đơn giản và dễ bổ sung hơn so với servlet. Tuy nhiên đây cũng là 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ức tạ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ất khó khăn. Trong quá trình phát triển ứng dụng Web theo nhóm, việc trộn lẫn mã JSp sẽ rất khó khăn. Trong qua trình phát triển ứng dụng Web theo nhóm, việc trộn lẫn mã Java và HTML trong trang JSP cho thấy không hiệu quả. Khó có thể tách rời giữa công việc viết mã cho ứng dụng và nhóm xây dự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à đa dạ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 servlet thường dựa vào phương thức print () hoặc println (). Công việc quyết định 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ạt cá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ông thường đối với những dự án nhỏ, yêu cầu thời gian nhanh, JSP là lưa chọn thí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 được gọi là MCV (Model – View – Controler) trong đó servlet đóng vai trò trung tâ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.Chương II
Tag Libraries
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.
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:
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:
body
Một tag mà không có nội dung được biểu diễn như sau:
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.”.
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á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í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 đượ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).
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ó.
Phan Van Dau
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ề.
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.
Trong ví dụ kết tiếp, dùng các tag lồng nhau tương tự như trong XML và HTML.
Đị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.
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ý
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, 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 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
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library1.1//EN"
"">
... ...
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.
classname
...
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ông trả 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 {
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 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.
helloworld.tld
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"">
<!--Nếu có JSP v1.2 thì đổi lại
""-->
1.0
1.1
vandau
A tag library from authors at
helloWorld
HelloWorldTag
Ví dụ với tag đơn giản nhất
EMPTY
JSP page
hello.jsp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
hello.jsp (tiếp theo)
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;
}
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello " + name);
} catch (Exception ex) {
throw new JspTagException("HelloWorldTag: " +
e.getMessage());
HelloWorldTag.java
}
return SKIP_BODY;
}
public int doEndTag() {
return EVAL_PAGE;
}
}
TLD 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:
TLD file (overwrite helloworld.tld)
...
helloWorld
HelloWorldTag
Ví dụ với tag đơn giản nhất
name
false
false
EMPTY
JSP page
paramtag.jsp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
Tag With Attributes
II.5.2. Các tag có nội dung
Tag 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.
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.
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 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
...
JSP
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 page
transformtag.jsp
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"DTD/xhtml1-strict.dtd">
Tag With Body
Tag With Body
Hi! TH 40 University
II.5.3. Các tag định nghĩa các biến kịch bản
Tag 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 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 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.
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.
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);
} 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 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) {
VariableInfo info1
= new VariableInfo(
data.getAttributeString("id"),
data.getAttributeString("type"),
true,
VariableInfo.AT_END);
VariableInfo[] info = { info1 } ;
return info;
}
}
TLD 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:
TLD file
...
com.vandau.LookupTag
com.vandau.LookupTagTEI
name
true
false
type
true
false
...
JSP page
JSP file
...
<vandau:lookup id = "sv" type = "UserTransaction"
name = "java:comp/ UserTransaction ">
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à 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();
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ụ:
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 */
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();
Chương II