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 |