1.Các JSP element dùng cho Bean.
a) jsp:useBean element
Cho phép chúng ta tải một Bean với tên và phạm vi xác định vào trang JSP.
Cú pháp:
<jsp:useBean id = “beanName” scope = “value”
typeSpec>
<!-- các element khác --> </jsp:useBean>
Nếu khơng cĩ body, tức là khơng cĩ tag nào trong thân của jsp:useBean thì cĩ cú pháp là empty tag.
TypeSpec cĩ thể hoặc (|) trong các thuộc tính sau:
TypeSpec ::= class = “className” |
class = “className” type = “typeName” |
type = “typeName” class = “className” |
beanName = “beanName” type = “typeName” |
type = “typeName” beanName = “beanName” |
type = “typeName” Các giá trị của thuộc tính scope:
- page
Đây là giá trị mặc định của scope. Bean với giá trị này sẽ cĩ sẵn từ javax.servlet.jsp.PageContext trong trang hiện hành. Bean sẽ được loại bỏ khi một response gởi trở về client hoặc request được chuyển tới một trang mới.
- 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.
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. - application
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:
options::=property =“*” |
property =“propertyName” |
property =“propertyName” param =“paraName” |
property =“propertyName”
value =“{<%= expr%> | string}”
c) jsp:getProperty element
Lấy giá trị của thuộc tính Bean để hiển thị giá trị này trong trang kết quả.
Cú pháp:
<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:
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
Property Type Conversion to String
boolean Java.lang.Boolean.toString(boolean) byte Java.lang.Byte.toString(byte) char Java.lang.Character.toString(char) double Java.lang.Double.toString(double) int Java.lang.Integer.toString(int) float 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()
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 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.
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.
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
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 tố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.*;
public class CurrentTimeBean { /*Data members*/
private int hours; private int minutes;
/* Methods */
Code 15: Java file (tiếp theo)
public CurrentTimeBean() { Date now = new Date(); this.hours = now.getHours(); this.minutes = now.getMinutes(); }
public int getHours() { return hours;
}
public int getMinutes() { return minutes(); } } Code 16: JSP file <jsp:useBean id="time" class="com.legiang.bean.CurrentTimeBean"/>
<html> <body>
It 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
package com.legiang.bean; public class LogicBean { /*Data members*/
private boolean authorized; /*Methods*/
public LogicBean() { this.authorized = false; }
public void setAuthorized(boolean authorized) { this.authorized = authorized;
}
public boolean isAuthorized() {
Code 17: Java file (tiếp theo)
return authorized; } } Code 18: JSP file <jsp:useBean id="logic" class="com.legiang.bean.LogicBean"/> <html> <body> Do you authorize?<br/> Answer:<jsp:getProperty name="logic" property="authorized"/> </body> </html>
Đồ án tốt nghiệp Gvhd: Ts.Nguyễn Thúc Hải
Ví dụ này sẽ xây dựng một component mà cĩ thể thực hiện các tính tốn tĩnh trên một dãy số.
Code 19: Java file
package com.legiang.bean; import java.util.*;
public class StatBean { /*Data members*/
private double[] numbers; /*Methods*/
public StatBean() {
numbers = new double[0]; }
public double getAverage() { double sum = this.getSum(); if (sum == 0)
return 0; else
return sum/numbers.length; }
public double getSum() {
Code 19: Java file (tiếp theo)
double sum = 0;
for (int i=0; i < numbers.length; i++) sum += numbers[i];
return sum; }
public double[] getNumbers() {
return numbers; }
public double getNumbers(int index) { return numbers[index];
}
public void setNumbers(double[] numbers) { this.numbers = numbers;
}
public void setNumbers(int index, double value) { numbers[index] = value;
public int getNumbersSize() { return numbers.length; }
}
Code 20: JSP file
<jsp:useBean id="stat" class="com.lg.bean.StatBean"> <% double[] mynums = {100, 250, 150, 50, 450}; stat.setNumbers(mynums); %> </jsp:useBean> <html> <body> The average of <%
double[] numbers = stat.getNumbers(); for (int i=0; i < numbers.length; i++) { if (i != numbers.length)
out.print(numbers[i] + ","); else
Code 20: Java file (tiếp theo)
out.println("" + numbers[i]); }
%>
is equal to <jsp:getProperty name="stat" property="average" />
</body> </html>
Ngồ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ạ.