Với include directive cho phép chúng ta thêm vào các tài liệu chứa mã JSP vào nhiều trang khác nhau nhưng lại cĩ vấn đề là địi hỏi chúng ta phải cập nhật lại ngày sữa đổi của trang khi file được include thay đổi. Để loại bỏ vấn đề này đặt tả JSP cung cấp cho chúng ta một action là <jsp:include> để include các file vào thời gian yêu cầu (request). Mặc khác, do trang được biên dịch thành servlet vào thời gian yêu cầu vì thế các file
được include khơng thể chứa mã JSP. Cú pháp của action này
là:
<jsp:include page=“Relative URL” flush=“true”>
Ví dụ sau sử dụng jsp:include action để include bốn file html, ví dụ này chỉ hiện thị các thơng tin của các web sites nỗi tiếng.
Code 7: includerequest.jsp
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<!-- Example of including files at request time. --> <html>
<head>
<title>What’s New</title>
<link rel="stylesheet" href="JSP-Styles.css" type="text/css" /> </head> <body> <center> <table boder="5"> <tr>
<th class="title">What's New at JspNews.com </th> </tr> </table> </center> 744 747 750 753 756 759 762 765 768 771 774 777
JSP Technology Căn Bản Về JSP
<p>Here is a summary of our four most recent news stories:</p>
<ol>
<li><jsp:include page="item1.html" flush="true" /></li>
<li><jsp:include page="item2.html" flush="true" /></li>
<li><jsp:include page="item3.html" flush="true" /></li>
<li><jsp:include page="item4.html" flush="true" /></li>
</ol> </body> </html>
Code 8: item1.html
<b>Bill Gates acts humble.</b> In a startling and unexpected development, Microsoft big wig Bill Gates put on an open act of
humility yesterday.
<a href="http://www.microsoft.com/Never.html">More details...</a>
Code 9: item2.html
<b>Scott McNealy acts serious.</b> In an unexpected twist, wisecracking Sun head Scott McNealy was sober and subdued at
yesterday's meeting.
<a href="http://www.sun.com/Imposter.html">More
details...</a>
Code 10: item3.html
<b>Larry Ellison acts conciliatory.</b> Catching his competitors
off guard yesterday, Oracle prez Larry Ellison referred to his rivals in friendly and respectful terms.
<b href="http://www.oracle.com/Mistake.html">More details...</a> 54 780 783 786 789 792 795 798 801 804 807 810 813
JSP Technology Căn Bản Về JSP
Code 11: item4.html
<b>Sportscaster uses "literally" correctly.</b> In an apparent slip of the tongue, a popular television commentator was heard to use the word "literally" when he did <i>not</i> mean "figuratively."
<a href="http://www.espn.com/Slip.html">More details...</a>
2.
2. Action chèn vào Applets cho Java Plug-In.Action chèn vào Applets cho Java Plug-In.
Với JSP, chúng ta khơng cần cĩ bất kỳ cú pháp đặc biệt nào để
include vào các applet; chỉ dùng APPLET tag của HTML bình
thường. Tuy nhiên, các applet này phải sử dụng từ JDK 1.1 trở xuống vì cả hai trình duyệt phổ biết nhất là Netscape 4.x và Internet Explorer 5.x vẫn chưa hổ trợ JDK 1.2. Do đĩ applet cĩ một số giới hạn sau:
- Để sử dụng Swing, chúng ta phải gởi các Swing files qua mạng. Tiến trình này tốn rất nhiều thời gian và cũng thất bại trong Internet Explorer 4 và Netscape 3.x (chỉ hổ trợ JDK 1.02) mà Swing lại phụ thuộc vào JDK 1.1.
- Chúng ta khơng thể dùng Java 2D.
- Chúng ta khơng thể dùng gĩi collection (tập hợp) của Java 2. - Mã của chúng ta chạy chậm hơn vì hầu hết các trình biên dịch cho nền Java 2 được cải tiến rất đáng kể so với các trình biên dịch từ JDK 1.1 trở xuống.
Hơn thế nữa, các phiên bản của các trình duyệt cĩ một số mâu thuẫn trong cách thức mà chúng hổ trợ AWT component khác nhau, làm cho việc thử nghiệm và điều phối các giao tiếp người dùng trở nên phức tạp và nặng nề hơn. Để giải quyết các vấn đề này, Sun đã phát triển Java Plug-In cho Netscape và Internet Explorer mà cho phép chúng ta sử dụng Java 2 platform cho các applet trong nhiều trình duyệt khác nhau.
Tuy nhiên, lại thật khơng may mắn là APPLET tag bình thường
sẽ khơng làm việc với Plug-In vì các trình duyệt được thiết kế riêng chỉ sử dụng máy ảo (Virtual Machine) cĩ sẳn của chúng khi chúng gặp APPLET. Thay vì thế, chúng ta phải sử dụng 816 819 822 825 828 831 834 837 840 843 846
JSP Technology Căn Bản Về JSP
OBJECT tag đối với IE và EMBED tag đối với Netscape. Hơn
nữa vì chúng ta khơng biết loại trình duyệt nào sẽ truy cập vào trang chúng ta nên chúng ta phải hoặc là include cả OBJECT lẫn EMBED (đặt EMBED trong phần COMMENT của OBJECT) hoặc là xác định loại trình duyệt vào thời gian yêu cầu để dùng tag đúng cho loại trình duyệt đĩ. Quá trình này thì hiển nhiên nhưng nhàm chán và mất thời gian.
Action jsp:plugin chỉ dẫn server xây dựng một tag thích hợp
cho các applet mà sử dụng Plug-In.
1)
1) jsp:plugin action.jsp:plugin action.
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
<APPLET CODE=“MyApplet.class” WIDTH=457 HEIGHT=350> </APPLET>
sử dụng jsp:plugin action như sau: <jsp:plugin type=“applet” code=“MyApplet.class” width=“457” height=“350” />
Ngồ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.
jreversion
Xác định số phiên bản của Java Runtime Environment, các giá trị cĩ thể nhận là “1.1”, “1.2”. nspluginurl 849 852 855 858 861 864 867 870 873 876 879
JSP Technology Căn Bản Về JSP
URL cho Netscape mà cĩ thể download Plug-In. Giá trị mật định sẽ hướng người dùng đến web site của Sun, nhưng với intranet chúng ta cĩ thể muốn chỉ dẫn người dùng đến một bản sao cục bộ.
iepluginurl
URL cho Internet Explorer mà cĩ thể download Plug-In.
2)
2) jsp:param và jsp:params action.jsp:param và jsp:params action.
jsp:param được dùng trong các actions khác như:
jsp:include, jsp:forward, jsp:plugin. Action này dùng để
cung cấp cặp tên và giá trị (name/value) cho các actions
trên. Cụ thể với jsp:plugin, thì action này sẽ định rõ tên và giá trị mà được truy cập từ trong applet bởi getParameter.
Tất cả jsp:param actions đều phải nằm trong jsp:params
action. Ví dụ: Code 12: Sử dụng Applet <APPLET CODE=“MyApplet.class” WIDTH=457 HEIGHT=350> <PARAM NAME=“PARAM1” VALUE=“VALUE1”> <PARAM NAME=“PARAM2” VALUE=“VALUE2”> </APPLET>
trong JSP sử dụng như sau:
<jsp:plugin type=“applet” code=“MyApplet.class” width=“457” height=“350” > <jsp:params> <jsp:param name=“PARAM1” value=“VALUE1” /> <jsp:param name=“PARAM2” value=“VALUE2” /> </jsp:params> </jsp:plugin> 3)
3) jsp:fallback action.jsp:fallback action.
60 882 885 888 891 894 897 900 903 906 909 912
JSP Technology Căn Bản Về JSP
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. Ví dụ chúng ta cĩ thể thay thế
Code 13: Sử dụng jspfallback
<APPLET CODE=“MyApplet.class” WIDTH=457 HEIGHT=350>
<B> Error: this example requires Java. </B> </APPLET> với <jsp:plugin type=“applet” code=“MyApplet.class” width=“457” height=“350” > <jsp:fallback>
<b> Error: this example requires Java. </b> </jsp:fallback>
</jsp:plugin>
3.
3. Actions dùng để forward và sử dụng Components.Actions dùng để forward và sử dụng Components. 1)
1) Chuyển các request từ các trang JSP.Chuyển các request từ các trang JSP.
Tình huống chuyển request phổ biến nhất là request đĩ, đầu tiên, bắt nguốn từ servlet và servlet đĩ chuyển request này đến trang JSP. Lý do để servlet thường xử lý request gốc là để kiểm tra các tham số trong request và thiết lập Beans nên địi hỏi nhiều cơng việc lập trình và nĩ thuận tiện để lập trình trong servlet hơn là trong tài liệu JSP. Nguyên nhân mà trang đích thường lại là tài liệu JSP là JSP rất đơn giản trong tiến trình tạo ra tài liệu HTML.
Tuy nhiên điều này chỉ là định hướng thường dùng chứ khơng cĩ nghĩa là chỉ cĩ một cách để thực hiện. Do đĩ để đơn giản và dễ sử dụng hơn trong việc nhúng mã
RequestDispatcher trong một scriptlet chúng ta cĩ thể sử dụng jsp:forward action. Ví dụ: Code 14: Sử dụng jspforward <% String dest; 915 918 921 924 927 930 933 936 939 942 945 948
JSP Technology Căn Bản Về JSP if (Math.random() > 0.5) { dest = “page1.jsp”; } else { dest = “page2.jsp”; } %>
<jsp:forward page=“<%= dest %>” />
Action này cho phép điều phối một request hiện hành vào
lúc runtime đến một tài nguyên tĩnh, trang JSP hay lớp
servlet trong cùng một ứng dụng.
2)
2) Sử dụng component trong JSP.Sử dụng component trong JSP.
Chúng ta cĩ thể sử dụng các actions sau để sử dụng lại các
component (Beans) trong JSP: jsp:useBean, jsp:setProperty, jsp:getProperty. Các action này được trình bày trong chương II. 951 954 957 960 963
JSP Technology JSP JavaBeans
Chương II
Chương II JSP JavaBeansJSP JavaBeans
I.
I. Khái niệm và các quy ước của Bean.Khái niệm và các quy ước của Bean.
1.
1. Khái niệm.Khái niệm.
Mơ hình thành phần (component) trong JSP được tập trung vào các component phần mềm của Java được gọi là Bean.
Đị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 API: tuân theo các quy ước được xác định bởi
JavaBean API, cho phép JSP container tương tác với Beans ở
mức lập trình mặc dù JSP container thực sự chẳng hiểu Bean
thực hiện những gì và hoạt động ra sao. Đối với JSP, chúng ta chỉ quan tân đến các khía cạnh API rồi ra các dấu hiệu cho những hàm tạo của Bean và các phương thức truy cập thuộc tính xử lý.
Giống như bất kỳ lớp Java nào, các thể hiện của Bean đơn thuần chỉ là các đối tượng Java. Chúng ta thường cĩ sự lựa chọn hoặc là tham chiếu tới Beans và các phương thức của chúng trực tiếp qua mã Java trong các lớp khác hoặc là thơng qua các scripting element trong trang JSP. Vì các scripting
element cũng theo các quy ước của Bean nên chúng ta cĩ thể
làm việc với Beans mà khơng cần phải viết một đoạn mã Java
nào. Bean container như JSP container, cĩ thể cung cấp sự
truy cập dễ dàng vào Beans và các thuộc tính của chúng.
2.
2. Các quy ước của Bean.Các quy ước 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ố.
66 966 969 972 975 978 981 984 987 990 993 996
JSP Technology JSP JavaBeans
- 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ạ.
II.
II. JSP sử dụng Beans.JSP sử dụng Beans.
1.
1. Các JSP element dùng cho Bean.Các JSP element dùng cho Bean.1) 1)
1) jsp:useBean elementjsp: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 999 1002 1005 1008 1011 1014 1017 1020 1023 1026 1029
JSP Technology JSP JavaBeans
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.
- 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).
2)
2) jsp:setProperty elementjsp: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}”
3)
3) jsp:getProperty elementjsp: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.
2. Phương pháp chuyển kiểu tự động JSP Phương pháp chuyển kiểu tự động JSP Bean 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 1032 1035 1038 1041 1044 1047 1050 1053 1056 1059 1062
JSP Technology JSP JavaBeans
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
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.
3. Tìm hiểu cách Tìm hiểu cách INTROSPECTOR làm việc.INTROSPECTOR làm việc.
1) 1) Introspector là gì?Introspector là gì? 72 1065 1068 1071 1074
JSP Technology JSP JavaBeans
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
2)
2) Thiết kế các phương thức mẫu dùng choThiết kế các phương thức mẫu dùng cho
thuộc tính.
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()
3)
3) Khai báo các phương thức một các tườngKhai báo các phương thức một các tường
minh. minh. 1077 1080 1083 1086 1089 1092 1095 1098 1101 1104 1107 1110
JSP Technology JSP JavaBeans
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