Hướng dẫn sử dụng JSP Standard Tag Library (JSTL) trong Java

Trong bài viết này, tôi sẽ hướng dẫn các bạn sử dụng JSP Standard Tag Library trong Java hay còn gọi tắt là JSLT trong Java JSP. Nhắc đến lập trình web với jsp/servlet chúng ta sẽ sử dụng một số kiểu thẻ Scriptlet để viết code Java vào trong trang jsp.Tuy nhiên Java không khuyến khích chúng ta sử dụng nhiều code java vào trang jsp đó.Lý do tại sao? Các bạn có thể đọc qua bài viết này của tôi. Vậy nên JSTL sinh ra giúp chúng ta khắc phục những hạn chế trên, cũng như việc lập trình sẽ nhanh hơn, tối ưu hơn.

Hướng dẫn sử dụng JSP Standard Tag Library (JSTL) trong Java

1. JSTL là gì?

JSTL là viết tắt của cụm từ JSP Standard Tag Library (JSTL) là một thư viện thẻ chuẩn cung cấp các thẻ để kiểm soát hành vi trang, lặp đi lặp lại và các lệnh điều khiển, các thẻ quốc tế hóa, và các thẻ SQL, JSTL được viết ngay tại trang JSP.
Từ sự phát triển của Taglibs và những nhược điểm khi xử lý code business logic cũng như những người mới học Java trở nên khó hiểu hơn thì JavaServerPages Standard Tag Library (JSTL) được sinh ra cùng với đó JSTL kết hợp với biểu thức Expression language (EL), JSTL đã loại bỏ scriptlet khi viết code trong trang JSP.

2. Điều kiện cần để sử dụng Standard Tag Library (JSTL)

download thư viện library jstl

Java-Servlet-Tag-Library-JSTL-logoĐể sử dụng JSTL trong các trang JSP của bạn, bạn cần phải tải về các thư viện JSTL cho bộ chứa Servlet (container servlet) của bạn.Thông thường những thư viện chúng ta đặt trong thư mục WEB-INF/lib của project. Và nếu project của bạn là Maven thì bạn cần phải khai báo các thư viện này trong pom.xml.
  • Nếu Project bình thường các bạn cần download thư viện JSTL tại đây:

Link download JSTL. Click vào để download.

>>> Sau khi download về thì các bạn có như sau:

download thư viện jstl trong jsp

 

  • Nếu là Project Maven các bạn sử dụng đoạn code này đặt trong file pom.xml như sau:

Với maven thì eclipse tự động download thư viện JSTL về cho các bạn khi đặt đoạn code trên trong file pom.xml, kiểm tra thư viện trong thư mục WEB-INF/lib:

thư viện thẻ chuẩn jstl trong jsp thư viện

 

3. Các thư viện thẻ chuẩn của Standard Tag Library (JSTL)

jstl trong java

Dựa vào trang chủ của thư viện JSTL chúng ta có 5 loại chính như sau:
Chức năng Mô tả – Khai báo
Các thẻ cơ bản
(Core Tags)
Chứa các lệnh điều khiển như như if, choose when otherwise,vòng lặp như forEach…. Để sử dụng JSTL core tags, bạn cần khai báo vào trong trang JSP đang sử dụng như sau:
  • <%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
Các thẻ định dạng và địa phương hóa (quốc tế hóa).

(Formatting and Localization Tags)

Thông thường loại thẻ này dùng để định dạng và quốc tế hóa, thường sử dụng như để định dạng số, ngày tháng năm…muốn sử dụng bạn cần khai báo vào trong trang JSP đang sử dụng như sau:
  • <%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt” prefix=”fmt” %>
Các thẻ SQL
(SQL Tags)
Các thẻ JSTL SQL cung cấp các hỗ trợ cho việc tương tác với cơ sở dữ liệu quan hệ như MySql, SQL server, Oracle … Thông thường chúng ta sử dụng loại thẻ này để truy xuất CSDL, muốn sử dụng bạn cần khai báo vào trong trang JSP đang sử dụng như sau:
<%@ taglib uri=”http://java.sun.com/jsp/jstl/sql” prefix=”sql” %>
Các thẻ XML
(XML Tags)
Chức năng chính của loại thẻ này là phân tích và đọc dữ liệu từ file XML.Muốn sử dụng bạn cần khai báo vào trong trang JSP đang sử dụng như sau:
  • <%@ taglib uri=”http://java.sun.com/jsp/jstl/xml” prefix=”x” %>
Các thẻ hàm JSTL
(JSTL Functions Tags)
Thẻ JSTL cung cấp một số chức năng mà chúng ta có thể sử dụng để thực hiện các toán tử thông dùng, thông thường là String như nối chuỗi… Muốn sử dụng bạn cần khai báo vào trong trang JSP đang sử dụng như sau:
  • <%@ taglib uri=”http://java.sun.com/jsp/jstl/functions” prefix=”fn” %>

4. Ý nghĩa các thẻ Standard Tag Library (JSTL)

  • Core Tags – Các thẻ tandard Tag Library (JSTL) cơ bản

Tên thẻ Ý 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>
  • Các thẻ định dạng và địa phương hóa – Formatting Action:

Tên thẻ Ý 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
  • Các thẻ SQL (SQL Tags) trong JSTL

Thẻ Miêu tả
<sql:setDataSource> Tạo một DataSource đơn giản chỉ thích hợp cho prototype
<sql:query> Thực thi SQL query được định nghĩa trong phần thân của nó hoặc thông qua thuộc tính sql
<sql:update> Thực thi SQL update được định nghĩa trong phần thân của nó hoặc thông quan thuộc tính sql
<sql:param> Thiết lập một parameter trong một lệnh SQL tới giá trị đã xác định
<sql:dateParam> Thiết lập một parameter trong một lệnh SQL tới giá trị java.util.Date đã xác định
<sql:transaction > Cung cấp các phần tử database action được lặp với một Connection đã chia sẻ, thiết lập để thực thi tất cả các lệnh
  • Các thẻ XML (XML Tags) trong JSTL

Thẻ Miêu tả
<x:out> Giống <%= … >, nhưng dành cho các XPath Expression
<x:parse> Sử dụng để parse XML data được xác định hoặc thông qua một thuộc tính hoặc trong phần thân thẻ
<x:set > Thiết lập một biến tới giá trị của một XPath expression
<x:if > Ước lượng XPath Expression và nếu nó là true, thì nó xử lý phần thân thẻ. Nếu điều kiện là false, phần thân bị bỏ qua
<x:forEach> Lặp qua các node trong một tài liệu XML
<x:choose> Thẻ điều kiện đơn giản mà thiết lập một context cho hoạt động điều kiện loại trừ, được đánh dấu bởi <when> và <otherwise> trong JSTL
<x:when > Thẻ phụ của <choose> mà bao phần thân thẻ nếu Expression được ước lượng là ‘true’
<x:otherwise > Thẻ phụ của <choose> mà theo sau các thẻ <when> và chỉ chạy khi nếu tất cả điều kiện trước là ‘false’
<x:transform > Áp dụng một phép biến đổi XSL trên một tài liệu XML
<x:param > Sử dụng cùng với thẻ transform để thiết lập một parameter trong XSLT stylesheet
  • Các thẻ hàm JSTL(JSTL Functions Tags)

Hàm (function) Miêu tả
fn:contains() trong JSTL Kiểm tra nếu một chuỗi input chứa chuỗi phụ đã cho
fn:containsIgnoreCase() trong JSTL Kiểm tra nếu một chuỗi input chứa chuỗi phụ đã cho trong trường hợp không phân biệt kiểu chữ
fn:endsWith() trong JSTL Kiểm tra nếu một chuỗi input kết thúc với suffix đã cho
fn:escapeXml() trong JSTL Các ký tự thoát mà có thể được phiên dịch như XML markup
fn:indexOf() trong JSTL Trả về index bên trong một chuỗi về sự xuất hiện đầu tiên của chuỗi phụ
fn:join() trong JSTL Kết hợp tất cả phần tử trong một mảng thành một chuỗi
fn:length() trong JSTL Trả về số item trong một tập hợp, hoặc số ký tự trong một chuỗi
fn:replace() trong JSTL Trả về một chuỗi là kết quả của việc thay thế một chuỗi input với một chuỗi đã cho
fn:split() trong JSTL Chia một chuỗi thành một mảng các chuỗi phụ
fn:startsWith() trong JSTL Kiểm tra nếu một chuỗi input bắt đầu với prefix đã cho
fn:substring() trong JSTL Trả về một tập con của một chuỗi
fn:substringAfter() trong JSTL Trả về một tập con của một chuỗi ở sau một chuỗi phụ đã cho
fn:substringBefore() trong JSTL Trả về một tập con của một chuỗi ở trước một chuỗi phụ đã cho
fn:toLowerCase() trong JSTL Biến đổi tất cả ký tự của một chuỗi thành chữ thường
fn:toUpperCase() trong JSTL Biến đổi tất cả ký tự của một chuỗi thành chữ hoa
fn:trim() trong JSTL Gỡ bỏ các khoảng trống trắng từ hai đầu của một chuỗi

5. Áp dụng JSP Standard Tag Library (JSTL) quá các ví dụ

Java-Servlet-Tag-Library-JSTL-logoTrong phần này, tôi sẽ hướng dẫn các bạn những ví dụ cụ thể về JSTL trong jsp với phần core jstl, những phần khác cũng hoàn toàn tương tự cách sử dụng:

Chuẩn bị tất cả những thư viện cần:

Tôi sẽ hướng dẫn các bạn thực hiện dựa vào:

  1. Eclipse IDE
  2. Library Spring Framework, Library JSTL, Library Common Logging

Tạo project và cấu hình các file cần sử dụng:

Tạo project demojstl gồm các file như sau:

web.xml

dispatcher-servlet.xml

package com.itphutran.controller

File SinhVien.java

SinhVienController.java

index.jsp

Để hỗ trợ cho việc demo, các bạn cần nắm kỹ các toán tử của biểu thưc EL

Bằng với
(equals)
== eq
Không bằng
(Not equals)
!= ne
Nhỏ hơn
(Less than)
< lt
Lớn hơn
(Greater than)
> gt
Nhỏ hơn hoặc bằng
(Less than or equals)
<= le
Lớn hơn hoặc bằng
(Greater than or equals)
>= ge

 

Cấu trúc dự án:

cấu trúc dự án thư viện chuẩn jstl

Sử dụng các thẻ JSTL – JSP Standard Tag Library:

  • Sử dụng thẻ <c:forEach> -dùng để lặp quét hết danh sách nào đó:

Tại trang index.jsp để hiển thị danh sách từ controler truyền sang view, chúng ta áp dụng vòng lặp foreach của thẻ tiêu chuẩn jstl như sau:

Để bạn đọc dễ hình dung, chúng tôi có mô hình bên dưới:

Hướng dẫn sử dụng JSP Standard Tag Library (JSTL) trong Java

Kết quả:

kết quả khi sử dụng foreach của jstl

  • Sử dụng <c:if> được sử dụng để kiểm tra một điều kiện nào đó là đúng hay sai:

Chúng ta sẽ làm demo ví dụ bên dưới:

Bài toánKiểm tra xem id của sinh viên thứ 3 trong danh sách là số chẵn hay lẻ, nếu là lẻ thì in ra mã của sinh viên đó là số lẻ.

Bạn đọc có thể hình dùng và dễ hiểu hơn qua mô hình bên dưới:

if trong jstl

Lưu ý: <c:if> chỉ có duy nhất một trường hợp, không có else.

Kết quả:

  • c:choose – c:when – c:otherwise: Tương tự như trường hợp sử dụng if -> else if -> else if… else hoặc như trường hợp switch case (có thể hiểu như vậy với trường hợp c:choose – c:when – c:otherwise trong JSTL )

Cũng với bài toán trên, Bài toánKiểm tra xem id của sinh viên thứ 3 trong danh sách là số chẵn hay lẻ, nếu là lẻ thì in ra mã của sinh viên đó là số lẻ ngược lại in ra số chẵn.

cchoose - cwhen - cotherwise trong jstl

Lưu ý: Nếu có thêm một trường hợp bất kỳ nào nữa chỉ cần thêm thẻ cwhen.

Kết quả:

kết quả cchoose - cwhen - cotherwise trong jstl

 

  • Thẻ <c:out> hiển thị các kết quả của một biểu thức, tương tự như cách làm việc của sciptlet <% =%>, khác biệt là <c:out> có thể sử dụng “.” để truy cập vào các thuộc tính của đối tượng. <c:out> có thể tự động escape nội dung XML.

escape có ý nghĩa là nếu có các ký tự đặc biệt < > hoặc & nằm ở trong <c:out> khi in ra nó sẽ được chuyển thành &lt;&gt;&amp;

  • Chẳng hạn:
    • <c:out value = “${‘<atag> &’}” />
  • In ra (Xem trong source của trang trên trình duyệt).
    • &lt;atag&lt; &amp;

Kết quả trên trình duyệt:

set trong jstl

Nhưng khi các bạn view source (F12) thì thấy rằng những ký tự đặc biệt như < > được mã hóa:

jstl trong java

  • c:set: dùng để khai báo một biến trong jsp dùng thư viện thẻ chuẩn JSTL (SP Standard Tag Library (JSTL) trong Java)

Lấy một ví dụ đơn giản: ở đây bài toán đặt ra là khai báo một biến là fullname, sau đó in ra.

Như vậy tôi sẽ khai báo như sau:

file index.jsp:

Bạn đọc có thể xem sơ đồ sau để dễ dàng hiểu:

Kết quả hiển thị trên trình duyệt:

hướng dẫn sử dụng jstl

Trên là những thẻ JSTL thường xuyên sử dụng khi các bạn lập trình web với jsp/servlet hay các framework như spring, struts….vv. Những thẻ còn lại đơn giản, cũng như ít sử dụng cho nên tôi không nhắc đến ở đây.

6.Tổng kết

Java-Servlet-Tag-Library-JSTL-logoBài viết này, là bài viết mà tôi viết khá chi tiết hướng dẫn về cách sử dụng JSP Standard Tag Library (JSTL) trong Java. Qua đó hy vọng rằng bạn đọc sẽ nắm kỹ hơn, áp dụng và sử dụng tốt hơn các thẻ tiêu chuẩn của JSTL thay vì sử dụng các loại thẻ scriptlet để viết code Java và trang JSP.

Chúc các bạn học thật tốt!  Nếu cảm thấy có ích, hãy giúp tôi chia sẻ để mọi người cùng học nhé, vì mục đích của blog này là học tập và chia sẻ!