Đố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 setAttributeNameAttributeType p
Trang 1- 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ạ
TypeSpec có thể hoặc (|) trong các thuộc tính sau:
TypeSpec ::= class = “className” |
class = “className” type = “typeName” |
type = “typeName” class = “className” |
Trang 2beanName = “beanName” type = “typeName” |
type = “typeName” beanName = “beanName” |
- request
Bean có giá trị này thì có sẵn từ đối tượng ServletRequest của trang hiện hành và bất kỳ trang được include hay forward nào bằng cách sử dụng phương thức getAttribute(name) Bean sẽ bị huỷ bỏ khi một response gởi trở về client
- session
Bean được sử dụng trong bất kỳ trang nào có tham gia vào một session của client
Có phạm vi trong cả một session của client Bean này được lưu trữ trong đối tượng HttpSession
Trang 3options có thể hoặc (|) trong các thuộc tính sau:
options::=property =“*” |
property =“propertyName” | property =“propertyName” param =“paraName” |
<jsp:getProperty name = “beanName” property = “propertyName” />
2 Phương pháp chuyển kiểu tự động JSP Bean
Các thuộc tính của một thành phần JSP thì không giới hạn giá trị chuổi (string) nhưng rất quan trọng để hiểu rằng tất cả giá trị của thuộc tính được truy cập qua
<jsp:getProperty> tag sẽ được chuyển thành kiểu chuổi Tuy nhiên, phương thức getter không cần trả về kiểu String một cách tường minh vì JSP container sẽ tự động chuyển giá trị trả về này thành kiểu String nếu cần thiết Đối với các kiểu dữ liệu cơ bản của Java, sự chuyển đổi được thể hiện trong bảng sau:
Property Type Conversion to String
Trang 4float Java.lang.Float.toString(float)
long Java.lang.Long.toString(long)
Tương tự, tất cả phương thức setter của thuộc tính được truy cập với
<jsp:setProperty> tag sẽ được tự động chuyển từ String sang một kiểu gốc thích hợp bởi JSP container Điều này được thực hiện qua các phương thức của các lớp
vỏ bọc Java
Property Type Conversion from String
boolean or Boolean java.lang.Boolean.valueOf(string)
byte or Byte java.lang.Byte.valueOf(string)
char or Character java.lang.Character.valueOf(string)
double or Double java.lang.Double.valueOf(string)
int or Integer java.lang.Integer.valueOf(string)
float or Float java.lang.Float.valueOf(string)
long or Long java.lang.Long.valueOf(string)
3 Tìm hiểu cách INTROSPECTOR làm việc
a) Introspector là gì?
Introspector là bộ phân tích mà qua đó Java xem xét các đoạn mã của chương trình để tìm ra những phương thức dùng để xây dựng và áp dụng cho từng thuộc tính cũng như tình huống cụ thể Chúng ta không cần quan tâm đến các khai báo phức tạp khác Ví dụ thiết lập hai phương thức sau:
public void setAge(int age)
public int getAge()
Trang 5Theo 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
Z z
URL URL
b) Thiết kế các phương thức mẫu dùng cho thuộc tính
Đối với thuộc tính mang những trị đơn, hai phương thức getter và setter được viết theo mẫu sau (với getter và setter xem 4.Thuộc tính của Bean):
public void setAttributeName(AttributeType param)
public AttributeType getAttributeName()
Đối với thuộc tính mang những trị kiểu boolean, phương thức getter được dùng với tiếp đầu ngữ là is thay cho get:
public void setAttributeName(AttributeType param)
public boolean isAttributeName()
Đối với thuộc tính gồm nhiều phần tử (index attribute) các phương thức getter và setter cũng được thiết lập tương tự Chúng ta có thể sử dụng một cặp phương thức hay cả hai cặp phương thức cũng được
public void setAttributeName(int index, AttributeType value)
public AttributeType getAttributeName()
và/hoặc
public void setAttributeName(AttributeType[] value)
public AttributeType[] getAttributeName()
c) Khai báo các phương thức một các tường minh
Trang 6Nếu không muốn bộ phân tích Introspector ngầm định, chúng ta có thể khai báo
và xử lý các phương thức một cách tường minh nhờ vào một lớp phụ dùng để mô
tả các phương thức được gọi là BeanInfo Khi Beans có tên là xxx được biên dịch, trước tiên Bean container sẽ đi tìm lớp có tên là xxxBeanInfo Nếu lớp này tồn tại, các thông tin trong lớp xxxBeanInfo sẽ được xử lý trước và áp dụng cho các phương thức được tìm thấy Các phương thức không được mô tả trong xxxBeanInfo sẽ được áp dụng cách phân tích kiểu Introspector mặc định Xem thêm III Các giao tiếp bổ trợ cho Bean
4 Thuộc tính của Bean
a) Các phương thức truy xuất
Thuộc tính thật ra chỉ là những biến nằm trong một lớp, tuy nhiên những biến này không nên sử dụng trực tiếp mà nên thông qua các phương thức để truy xuất chúng Thông thường biến được dùng vào hai mục đích đó là gán dữ liệu và lấy
dữ liệu ra để tính toán Java đưa ra hai loại phương thức để đáp ứng cho nhu cầu truy xuất biến đó là các phương thức getter mang ý nghĩa đọc dữ liệu từ biến và các phương thức setter mang ý nghĩa gán dữ liệu cho biến
b) Các loại thuộc tính
Chúng ta hãy xem các ví dụ sau:
- Thuộc tính mang những giá trị đơn
Bean sau đây lấy thời gian của hệ thống
Code 15: Java file
package com.legiang.bean;
import java util.*;
Trang 7public class CurrentTimeBean {
/*Data members*/
private int hours;
private int minutes;
Trang 8It is now <jsp:getProperty name="time" property="minutes"/> minutes past the hour
</body>
</html>
- Thuộc tính mang giá trị boolean
Code 17: Java file
public boolean isAuthorized() {
Code 17: Java file (tiếp theo)
return authorized;
}
}
Code 18: JSP file
Trang 9- 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 10double sum = this.getSum();
public double getSum() {
Code 19: Java file (tiếp theo)
Trang 11public void setNumbers(int index, double value) { numbers[index] = value;
double[] numbers = stat.getNumbers();
for (int i=0; i < numbers.length; i++) {
if (i != numbers.length)
out.print(numbers[i] + ",");
Trang 12III Các giao tiếp bổ trợ cho Bean
Trong khi điều này không phải là yêu cầu đặc biệt thì có một số giao tiếp cho phép chúng ta cài đặt vào Beans Các giao tiếp này có thể được dùng để mở rộng tính năng các Bean của chúng ta đối với các tình huống khác nhau
1 Giao tiếp BeanInfo
Chúng ta đã biết về cơ chế tương phản (reflection) trong mục trước, nhưng có phương pháp khác mà một lớp Bean có thể báo cho Bean container (như JSP container) biết về các thuộc tính của nó bằng cách cài đặt giao tiếp BeanInfo Giao tiếp BeanInfo cho phép chúng ta tạo ra một lớp đồng hành với Bean của chúng ta mà định nghĩa các thuộc tính và các cấp độ truy cập của nó Giao tiếp có thể được dùng để thích ứng với các lớp Java đã có đối với việc sử dụng của Bean
mà không cần thay đổi giao tiếp đã tạo Nó cũng được sử dụng để che dấu các thuộc tính nào được truy cập thường xuyên từ client, vì thỉnh thoảng cơ chế
Trang 13reflection 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
Trang 143 Giao tiếp HttpSessionBindingListener
Việc cài đặt giao tiếp HttpSessionBindingListener của Servlet API trong Beans chúng ta sẽ cho phép các thể hiện nhận được thông báo của các sự kiện session Giao tiếp này khá đơn giản, chỉ cần định nghĩa hai phương thức:
public void valueBound(HttpSessionBindingListener event)
public void valueUnBound(HttpSessionBindingListener event)
Phương thức valueBound() được gọi khi Bean được lưu trữ trong session của người dùng Trong trường hợp của JSP, điều này sẽ thường xảy ra ngay khi Bean được khởi tạo bởi <jsp:useBean> tag mà có xác định phạm vi “session” trong thuộc tính scope
Phương thức valueUnBound() được gọi khi đối tượng bị xoá khỏi session Có vài tình huống làm cho Bean của chúng ta sẽ bị xoá khỏi session Khi JSP container
dự định chấm dứt một session của người dùng vì hoạt động kém, trước tiên JSP container xoá từng mục dữ liệu trong session, rồi kích hoạt valueUnBound() Thứ hai, Sự kiện này sẽ được kích hoạt nếu servlet, scriptlet, hay đoạn mã Java nào đó xoá bỏ Bean khỏi session vì một số lý nguyên nhân
Mỗi sự kiện kết hợp với giao tiếp HttpSessionBindingListener thì có thể sử dụng
để đạt được sự truy cập vào đối tượng session Việc cài đặt giao tiếp này 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
Chương III : TAG LIBRARIES
I Tag library là gì ?
Trang 15Trong 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
Trang 16Mộ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
Trang 17Thuộ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
a) Các tag đơn giản
Một tag đơn giản sau triệu gọi một action và xuất ra lời chào “Hello World.”
<tlt:helloWorld />
b) Các tag có thuộc tính
Một start tag của custom action có thể chứa các thuộc tính dưới dạng attr =
‘value’ Các thuộc tính này tuỳ biến các tham số dùng trong các phương thức của một lớp java
Các thuộc tính có thể được gán một hay nhiều tham số trong một đối tượng request hoặc từ một hằng chuổi Chỉ có các kiểu thuộc tính trong bảng sau mới có thể được gán từ các giá trị tham số của request và của các hằng chuổi
Kiểu thuộc tính Phương thức valueOf chuyển chuổi
boolean or Boolean java.lang.Boolean.valueOf(String)
Trang 18byte 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