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.
1. Giao tiếp BeanInfo
Chúng ta đã biết về cơ chế tương phản (reflection) trong mục trước, nhưng cĩ phương pháp khác mà một lớp Bean cĩ thể báo cho Bean container (như JSP container) biết về các thuộc tính của nĩ bằng cách cài đặt giao tiếp
BeanInfo. Giao tiếp BeanInfo cho phép chúng ta tạo ra một lớp đồng hành với Bean của chúng ta mà định nghĩa các thuộc tính và các cấp độ truy cập của nĩ. Giao tiếp cĩ thể được dùng để thích ứng với các lớp Java đã cĩ đối với việc sử dụng của Bean mà khơng cần thay đổi giao tiếp đã tạo. Nĩ cũng được sử dụng để che dấu các thuộc tính nào được truy cập thường xuyên từ client, vì thỉnh thoảng cơ chế reflection chuẩn của Java cĩ thể phơi bày nhiều thơng tin mà chúng ta lại khơng muốn như thế.
Để 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.
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
Hải
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.
3. Giao tiếp HttpSessionBindingListener
Việc cài đặt giao tiếp HttpSessionBindingListener của Servlet API trong Beans chúng ta sẽ cho phép các thể hiện nhận được thơng báo của các sự kiện session. Giao tiếp này khá đơn giản, chỉ cần định nghĩa hai phương thức:
public void valueBound(HttpSessionBindingListener event) public void valueUnBound(HttpSessionBindingListener event)
Phương thức valueBound() được gọi khi Bean được lưu trữ trong session của người dùng. Trong trường hợp của JSP, điều này sẽ thường xảy ra ngay khi Bean được khởi tạo bởi <jsp:useBean> tag mà cĩ xác định phạm vi “session” trong thuộc tính scope.
Phương thức valueUnBound() được gọi khi đối tượng bị xố khỏi session. Cĩ vài tình huống làm cho Bean của chúng ta sẽ bị xố khỏi session. Khi JSP container dự định chấm dứt một session của người dùng vì hoạt động kém, trước tiên JSP container xố từng mục dữ liệu trong session, rồi kích hoạt valueUnBound(). Thứ hai, Sự kiện này sẽ được kích hoạt nếu servlet,
scriptlet, hay đoạn mã Java nào đĩ xố 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.
Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải
Chương III : TAG LIBRARIES
I. Tag library là gì ?
Trong kỹ thuật JavaServer Pages, các action là các element cĩ thể tạo ra và truy cập vào các đối tượng của ngơn ngữ lập trình và xuất vào những luồng xuất chuẩn như màn hình, máy in,… JSP định nghĩa ra chín action chuẩn mà phải được cung cấp bởi bất kỳ engine nào.
Ngồ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 hố 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.
II. Cách dùng các tags trong JSP.
Phần này trình bày cách thức mà tác giả của trang web sử dụng tag library trong JSP và giới thiệu các loại tag khác nhau. Các ví dụ trong phần này sẽ được định nghĩa trong phần III.
1. Khai báo các tag library.
Trang JSP sẽ sử dụng các tag được định nghĩa trong một tag library bằng cách đưa vào taglib directive trong trang trước bất kỳ custom tag được sử dụng:
<%@ taglib uri = ‘/tlt’ prefix = ‘tlt’ %>
Thuộc tính uri tham chiếu tới URI đĩ là định danh duy nhất cho tag
library. URI cĩ thể là URI tương đối hay tuyệt đối. Nếu URI tương đối thì nĩ
phải được ánh xạ đến một URI tuyệt đối trong taglib element của bộ mơ tả
triển khai ứng dụng Web, tập tin cấu hình này cùng với ứng dụng Web được phát triển theo bản đặt tả Java Servlet và JavaServer Pages.
Thuộc tính prefix định nghĩa một tiếp đầu ngữ để phân biệt với các tag
library khác, do đĩ thuộc tính này giải quyết được vấn đề xung đột về các tên tag.
2. Các loại tag.
Những custom action được diễn đạt bằng cú pháp XML. Chúng cĩ start tag, nội dung và end tag:
<tlt:tag> body </tlt:tag>
Một tag mà khơng cĩ nội dung được biểu diễn như sau: <tlt:tag />
a) Các tag đơn giản.
Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello World.”.
Đồ án tốt nghiệp Gvhd: Ts. Nguyễn Thúc Hải
<tlt:helloWorld />
b) Các tag cĩ thuộc tính.
Một start tag của custom action cĩ thể chứa các thuộc tính dưới dạng attr = ‘value’. Các thuộc tính này tuỳ biến các tham số dùng trong các phương thức của một lớp java.
Các thuộc tính cĩ thể được gán một hay nhiều tham số trong một đối tượng request hoặc từ một hằng chuổi. Chỉ cĩ các kiểu thuộc tính trong bảng sau mới cĩ thể được gán từ các giá trị tham số của request và của các hằng chuổi
Kiểu thuộc tính
Kiểu thuộc tính Phương thức valueOf chuyển chuổiPhương thức valueOf chuyển chuổi
boolean or Boolean java.lang.Boolean.valueOf(String) 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
e) Kết hợp các tag.
Các tag kết hợp với nhau bằng các phương pháp của các đối tượng dùng chung. Trong ví dụ sau, tag1 tạo một đối tượng cĩ tên là obj1, sau đĩ được sử dụng lại bởi tag2. Qui tắc này được khuyến khích bởi bảng đặt tả JSP, một tag tạo ra một tên với thuộc tính id và tag thứ hai cĩ thuộc tính name để dùng lại tên này.
<tlt:tag1 id=’obj1’ attr2=’value’/> <tlt:tag2 name=’obj1’/>
Trong ví dụ kết tiếp, dùng các tag lồng nhau tương tự như trong XML và HTML.
<tlt:outerTag> <tlt:innerTag /> <tlt:outerTag>