JSTL và các action thường sử dụng c:forEach, c:otherwise, c:choose
JavaServer Pages Standard Tag Library (JSTL)
Vào năm 1997 Sun Microsystems giới thiệu các
API Servlet.
Servlet đã tạo 1 sự khác biệt rất lớn cho các nhà phát triển Web bằng
CGI vì
servlet
mạnh mẽ và hiệu quả hơn. Tuy nhiên khi đưa vào áp dụng, các nhà lập
trình đã chỉ ra rằng servlet có một thiếu sót hết sức quan trọng đó là
các nhà phát triển web tạo ra giao diện về phía client bằng cách xuất ra
các đoạn code
HTML thông qua câu lệnh
print. Điều này gây khó khăn trong việc duy trì mở rộng code. Điều thiếu sót này nhanh chóng được khắc phục bằng
JSP cho phép nhúng các đoạn code Java.
Tuy nhiên, như trong hầu hết các trường hợp, giải pháp này lại có một thiếu sót của riêng nó: mã Java nhúng trong
HTML sẽ dẫn đến sự phức tạp trong các trang
JSP, sự kết hợp
code business logic và
presentation làm cho trang
JSP trở nên khó hiểu và khó duy trì. Hơn nữa, việc chỉ giới hạn trong một số thẻ tiêu chuẩn như <
jsp:
useBean> hay <
jsp:
include>,
JSP
có thể tốt cho những người phát triển Web thông hiểu Java, nhưng sẽ gây
khó khăn cho những người chưa có kinh nghiệm nhiều trong Java. Để đối
phó với khó khăn này, các nhà phát triển Java lợi dụng một ưu điểm của
Java là cho phép tạo ra các custom tag, rất nhiều custom tag được tạo ra
ví dụ như Jakarta Taglibs được tạo ra bởi Apache Software Foundation
Từ sự phát triển của
Jakatar Taglibs và những phản ứng tiêu cực khi phát triển web trên
JSP,
JavaServerPages Standard Tag Library (
JSTL) được sinh ra. Sự kết hợp giữa
Expression language và thư viện tiêu chuẩn toàn diện,
JSTL đã tận diệt sự cần thiết phải dùng
scriptlet và
expression trong trang
JSP
I. JSTL là gì: JSTL bao gồm các phần sau:
- Expression Language
- Thư viện các hành động tiêu chuẩn
- Thư viện cho validation
- Expression Language được cho là tính năng quan trọng nhất của
JSTL. Expression Language cho phép truy xuất vào các implicit object như
request, response, các biến liên quan đến scope
- Thư viện các hành động tiêu chuẩn cung cấp một nền tảng vững
chắc cho việc lập trình web từ việc lập vòng lập, import URLS đến kết
nối database, đọc XML….
II. Các thư viện thẻ của JSTL:
- Thư viện thẻ của JSTL được chia làm 4 loại như sau:
Tên thư viện (prefix) |
Mô tả |
Core (c) |
Chứa các hành động cơ bản như if, forEach…. |
Formatting (fmt) |
Định dạng và quốc tế hóa |
SQL (sql) |
Truy xuất CSDL |
XML (x) |
Phân tích và đọc dữ liệu từ XML |
1. Core Action: gồm các chức năng sau
- Send output to the current JspWriter
- Gửi output đến JspWriter hiện tại
- Thao tác trên các thành phần của Java Bean
- Triển khai statement if hay switch
- Xử lý các Exception
- Duyệt qua các mảng giá trị, chuỗi
- Tạo các URLs và import tài nguyên
- Redirect servlet responses
- Chuyển các trả lời của Servlet
- Tạo và hủy các biến trong scope
- Các Action trong Core:
Tên Action |
Ý nghĩa |
<c:catch> |
Catch những exception xảy ra trong code body |
<c:choose> |
Chọn 1 trong nhiều đoạn mã để thi hành khi thỏa mãn điều kiện nào đó |
<c:forEach> |
Vòng lặp quét hết tập hợp nào đó |
<c:forToken> |
Vòng lặp quét hết 1 chuỗi nào đó theo chuỗi phân cách |
<c:if> |
Thi hành đoạn code khi thỏa mãn điều kiện |
<c:import> |
Import một URL nào đó |
<c:otherwise> |
Xác định giá trị mặc định cho <c:choose> |
<c:out> |
Gửi output cho JspWriter hiện hành |
<c:param> |
Xác định 1 tham số URL cho <c:import> hay <c:url> |
<c:redirect> |
Điều hướng request sang URL mới |
<c:remove> |
Xóa 1 đối tượng trong 1 scope nào đó |
<c:set> |
Tạo 1 đối tượng trong 1 scope nào đó |
<c:url> |
Tạo 1 URL |
<c:when> |
Khai báo điều kiện trong <c:choose> |
2. Formatting Action:
JSTL formatting Action cho phép người lập trình quốc tế hóa trang web của mình. Người lập trình có thể:
- Xác định resource bundle cho các thông báo với nhiều ngôn ngữ
- Xác định khu vực để định dạng ngày tháng, tiền tệ, phần trăm
- Các Action trong Formatting
Tên Action |
Ý nghĩa |
<fmt:bundle> |
Xác định resoure bundle cho các messge đi kèm trong thẻ fmt:bundle |
<fmt:setBundle> |
Xác định resoure bundle và gán vào 1 biến để dùng sau này |
<fmt:formatDate> |
Định dạng ngày theo 1 vùng địa lý nào đó |
<fmt:formatNumber> |
Định dạng số theo 1 vùng địa lý nào đó |
<fmt:message> |
Truy xuất vào 1 message trong bundle |
III. Nguyên tắc thiết kế:
Để tận dụng tốt nhất của JSTL, bạn nên tìm hiểu những nguyên tắc thiết
kế của JSTL, các nguyên tắc này áp dụng đối với nhiều thẻ trong JSTL
nhưng không phải tất cả. Các nguyên tắc thiết kế thảo luận trongphần này
là:
- Qui ước đặt tên
- Phạm vi của biến
- Các thuộc tính động
- Xử lý lỗi
1. Qui ước đặt tên:
- Tên thẻ và tên thuộc tính của thẻ được đặt tên theo qui ước
đặt tên của Java: qui tắc Lạc Đà, từ đầu tiên là chữ thường, các từ tiếp
theo được viết hoa đầu từ. Ví dụ:
<c:out value='${param.amount}'/>
<c:forEach var='item' items='${names}' varStatus='status'>
2. Scoped Variables vs. Scripting Variables
- Các thẻ JSTL như là một ống dẫn giữa trang JSP và mã code của
Java. Thông qua ống dẫn này, thông tin được truyền từ trang JSP vào code
Java và ngược lại. Hãy xem xét ví dụ sau đây:
<c:forEach var='item' begin='1' end='10'>
value = <c:out value='${item}'/><br>
</c:forEach>- Trong đoạn mã trên, trang JSP sử dụng
thẻ <c:forEach> để gửi thông tin qua giá trị của biến “var” cho
class tag handler. Class tag handler tạo ra 1 đối tượng “item” như là
một biến cục bộ cho thẻ <c:forEach>
3. Các thuộc tính động:
- Giá trị của các thuộc tính trong JSTL có thể tĩnh hoặc động.
Giá trị của thuộc tính động có thể được xác định thông qua các
Expression Language (EL)
4. Xử lý lỗi:
- JSTL làm tất cả để tránh xảy ra các lỗi trong quá trình thi
hành. Trong nhiều trường hợp nếu bạn khai báo giá trị null hay chuỗi
rỗng cho thuộc tính, giá trị đó sẽ được chuyển đổi thành các hằng số vô
hại ( như “0” chẳng hạn)
IV. Thẻ General-Purpose and Conditional:
- Một số nhiệm vụ cơ bản của các nhà phát triển JSP bao gồm tạo
ra output, truy xuất và thay đổi giá trị các biến trên các scope, các
thuộc tính của JavaBean, thực các biểu thức điều kiện và xử lý
exceptions
- Các thẻ General-purpose:
- JSTL cung cấp 4 thẻ sau cho General Purpose:
<c:out>
<c:set>
<c:remove>
<c:catch>
- Ví dụ: chúng ta làm một ví dụ đơn giản về các thẻ general purpose như sau:
-
Trong ví dụ trên chúng ta dùng EL để truy xuất vào parameter
của request lấy giá trị của “buttonText”, và dùng <c:out> để xuất
giá trị. Khi thi hành chúng ta có kết quả như hình sau:
Trước khi Submit
Sau khi submit
V. Thẻ Conditional:
- JSTL cung cấp 4 thẻ cho Conditional:
<c:if>
<c:choose>
<c:when>
<c:otherwise>
- Ngoài ra JSTL còn cung cấp thêm 2 thẻ cho vòng lặp là <c:forEach> và <c:forToken>
- Ví dụ: chúng ta làm ví dụ kết hợp các thẻ trên với nhau như sau:
- Đầu tiên chúng ta hiển thị kết quả từ vòng lặp:
- Khi trang web chạy lần đầu chúng ta cho phép người dùng nhập vào các giá trị cần thiết cho vòng lặp
- Trong trường hợp người dùng nhập vào các giá trị không đúng, chúng ta xuất thông báo lỗi như sau:
- Khi thi hành chúng ta có kết quả sau:
- Khi nhập liệu sai định dạng chúng ta có thông báo sau:
Đũa Cùi
bodua.com
Tham khảo từ nguồn:
Core JSTL: Mastering the JSP™ Standard Tag Library |
By David M. Geary |