JSTL (Thư viện thẻ chuẩn JSP)
Trong hướng dẫn JSTL này, chúng ta sẽ thấy việc sử dụng các thẻ JSTL khác nhau sẽ giúp việc mã hóa JSP dễ dàng hơn như thế nào.
JSTL là gì trong Java?
JSTL là viết tắt của Java thư viện thẻ tiêu chuẩn của trang máy chủ và nó là tập hợp các thư viện thẻ JSP tùy chỉnh cung cấp chức năng phát triển web phổ biến. JSTL là thư viện thẻ tiêu chuẩn của JSP.
Ưu điểm của JSTL
Dưới đây là những ưu điểm của JSTL:
- Thẻ tiêu chuẩn: Nó cung cấp một lớp phong phú về chức năng di động của các trang JSP. Thật dễ dàng để một nhà phát triển hiểu mã.
- Mã gọn gàng và sạch sẽ: Vì các tập lệnh khiến nhà phát triển bối rối nên việc sử dụng JSTL làm cho mã trở nên gọn gàng và sạch sẽ.
- Tự động JavađậuHỗ trợ Interospection: Nó có lợi thế của JSTL so với tập lệnh JSP. Bộ xử lý ngôn ngữ biểu thức JSTL JavaBean mã rất dễ dàng. Chúng ta không cần phải downcast các đối tượng đã được truy xuất dưới dạng thuộc tính có phạm vi. Việc sử dụng mã scriptlets JSP sẽ phức tạp và JSTL đã đơn giản hóa mục đích đó.
- Con người dễ đọc hơn:JSTL dựa trên XML, rất giống với HTML. Do đó, các nhà phát triển có thể dễ dàng hiểu được.
- Máy tính dễ hiểu hơn: Các công cụ như Dreamweaver và trang đầu đang tạo ra ngày càng nhiều mã HTML. Các công cụ HTML thực hiện rất tốt việc định dạng mã HTML. Mã HTML được trộn lẫn với mã script. Vì JSTL được thể hiện dưới dạng các thẻ tuân thủ XML nên việc tạo HTML có thể dễ dàng phân tích cú pháp mã JSTL trong tài liệu.
Thẻ JSTL
Các thẻ lõi là các thẻ được sử dụng thường xuyên nhất trong JSP. Họ cung cấp hỗ trợ cho
- Lặp lại
- Logic có điều kiện
- Bắt ngoại lệ
- chuyển tiếp url
- Chuyển hướng, v.v.
Để sử dụng thẻ lõi trước tiên chúng ta cần xác định thư viện thẻ và dưới đây là cú pháp để thêm thư viện thẻ.
Cú pháp:
<%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core%>
Ở đây,
- tiền tố có thể được sử dụng để xác định tất cả các thẻ cốt lõi và
- uri là thư viện của taglib mà nó được nhập từ đó
Hãy xem chi tiết một số thẻ cốt lõi,
1. Ra ngoài
- Kết quả biểu thức được hiển thị trong thẻ out
- Nó có thể trực tiếp thoát khỏi các thẻ XML. Do đó, chúng không được đánh giá là thẻ thực tế
Cú pháp:
<c:out value="" default="" escapeXML="">
- Giá trị ở đây thể hiện thông tin đầu ra và nó là bắt buộc
- Mặc định là không xuất được thông tin và không bắt buộc
- escapeXML – Đúng nếu nó thoát khỏi các ký tự XML.
Ví dụ:
Coretag_jsp1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP1</title> </head> <body> </body> </html>
Giải thích mã:
Dòng mã 3: Tiền tố taglib này là bắt buộc đối với tất cả các thẻ và tiền tố được thêm vào là 'c'. Do đó, nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi.
Dòng mã 12: Ở đây chúng tôi đang sử dụng coretag out với tiền tố “c” và out này sẽ in giá trị trong thẻ biểu thức. Do đó, đầu ra sẽ là tên
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả sau:
Đầu ra:
- Chúng tôi đang nhận giá trị dưới dạng tên từ thẻ lõi “out” sẽ in trong luồng đầu ra.
2. Bắt
- Nó bắt bất kỳ ngoại lệ nào có thể ném được xảy ra trong nội dung và hiển thị dưới dạng đầu ra.
- Nó được sử dụng để xử lý các lỗi và bắt chúng.
Cú pháp:
<c:catchvar="">
Ở đây var đại diện cho tên của biến, biến này sẽ chứa ngoại lệ có thể ném được.
Ví dụ:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP2</title> </head> <body> <c:catch var="guruException"> <% int num = 10/0; %> </c:catch> The Exception is : ${guruException} </body> </html>
Giải thích mã:
Dòng mã 3: Tiền tố taglib này là bắt buộc cho tất cả các thẻ và tiền tố được thêm là 'c' do đó nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi
Dòng mã 11-13: Coretag Catch được sử dụng để bắt ngoại lệ và in ngoại lệ. Ở đây ngoại lệ được nêu ra khi 10/0 và ngoại lệ đó có tên “guruException”.
Dòng mã 14: Chúng tôi đang in “guruException”.
Khi bạn thực thi mã, bạn sẽ nhận được kết quả sau:
Đầu ra:
- Chúng tôi đang nhận được Ngoại lệ số học là/bằng 0 và nó được in ở đầu ra bằng biến “guruException”
3. Nhập khẩu
- Chúng ta có thể nhập nội dung tệp khác vào trang JSP như chúng ta đã làm trong JSP bao gồm hành động.
- Ở đây chúng ta cũng có thể bao gồm URL và nội dung sẽ được hiển thị trên trang đó.
Cú pháp:
<c:importvar="" uri="">
Ở đây var là biến name đóng vai trò là một định danh, sẽ lưu trữ filename/uri. uri là tên file hoặc uriname tương đối.
coretag_jsp31.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP 31</title> </head> <body> <c:import var="displayfile" url="coretag_jsp32.jsp"> </c:import> <c:out value="${displayfile}"/> </body> </html>
Coretag_jsp32.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a>The file is diplayed after importing</a> </body> </html>
Giải thích mã:
Coretag_jsp31.jsp
Dòng mã 3: Tiền tố taglib này là bắt buộc cho tất cả các thẻ và tiền tố được thêm là 'c' do đó nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi
Dòng mã 11-12: Ở đây chúng tôi đang nhập tệp coretag_jsp32.jsp vào tệp này bằng thẻ nhập
Mã Dòng13: Ở đây chúng tôi đang in tệp coretag_jsp32.jsp bằng thẻ out.
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả đầu ra sau.
Đầu ra:
- Coretag_jsp32 được in ở đầu ra vì tệp này đã được nhập vào coretag_jsp31.jsp.
4. forEach
- Nó được sử dụng để lặp lại số phần tử trong chuỗi câu lệnh.
- Nó giống như một Java forloop.
Cú pháp:
<c:forEach var="" begin="" end="">
- Ở đây var đại diện cho tên biến sẽ giữ tên bộ đếm
- Bắt đầu đại diện cho giá trị bắt đầu của bộ đếm
- End sẽ đại diện cho giá trị cuối cùng của nó
Ví dụ:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP4</title> </head> <body> <c:forEach var="gurucount" begin="5" end="10"> <c:out value="${gurucount}"/> </c:forEach> </body> </html>
Giải thích mã:
Dòng mã 3: Tiền tố taglib này là bắt buộc cho tất cả các thẻ và tiền tố được thêm là 'c' do đó nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi
Dòng mã 11-13: Ở đây chúng ta sử dụng vòng lặp “forEach” với tên biến là “gurucount”, bắt đầu bằng 5 và kết thúc bằng 10. Chúng ta đang in biến gurucount có các số bắt đầu từ 5 đến 10.
Khi bạn thực thi mã, bạn sẽ nhận được kết quả sau
Đầu ra:
- Đầu ra chúng tôi nhận được bắt đầu từ 5 đến 10.
5. Nếu
- Nó dùng để Kiểm tra điều kiện.
- Nếu thẻ được sử dụng để kiểm tra một điều kiện xem nó có đúng hay không dựa trên điều kiện này thì khối mã sẽ được thực thi.
Cú pháp:
<c:if test="${condition}></c:if>
Ở đây nếu điều kiện đúng thì một loạt câu lệnh sẽ được thực thi.
Ví dụ:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP5</title> </head> <body> <c:set var="count" value="100"/> <c:if test="${count == 100}"> <c:out value="The count is 100"/> </c:if> </body> </html>
Giải thích mã:
Dòng mã 3: Tiền tố taglib này là bắt buộc cho tất cả các thẻ và tiền tố được thêm là 'c' do đó nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi
Dòng mã 11: Ở đây chúng tôi đang đặt biến có tên là đếm thành 100
Dòng mã 12-14: Ở đây chúng ta sử dụng "điều kiện if" để kiểm tra xem số đếm có bằng 100 không. Nếu số đếm bằng 100 thì chúng ta sẽ nhận được kết quả là "Số đếm là 100".
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả sau
Đầu ra:
- Vì điều kiện “if” là đúng nên chúng ta nhận được kết quả là “Số đếm là 100”.
6. chuyển hướng
- Nó được sử dụng để chuyển hướng trang hiện tại sang một URL khác bằng cách cung cấp URL tương đối của thẻ này.
- Nó hỗ trợ các URL tương đối theo ngữ cảnh
Cú pháp:
<c:redirect url="" context=""/>
Url ở đây là url tương đối mà nó phải được chuyển hướng đến và tên ngữ cảnh của ứng dụng web cục bộ.
Ví dụ:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Core Tag JSP6</title> </head> <body> <c:redirect url="/"/> </body> </html>
Giải thích mã:
Dòng mã 3: Tiền tố taglib này là bắt buộc cho tất cả các thẻ và tiền tố được thêm là 'c' do đó nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi
Dòng mã 11: Ở đây chúng tôi sử dụng “thẻ chuyển hướng”, nơi chúng tôi chỉ định tên url và khi chúng tôi nhấp vào trang đó, nó sẽ chuyển hướng đến trang web đã được cung cấp để chuyển hướng.
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả đầu ra sau;
Đầu ra:
- Chúng tôi nhận được url đầu ra guru99.com được chuyển hướng bởi coretag_jsp6.jsp
Thẻ tùy chỉnh JSTL
- Nó là một người dùng định nghĩa JSP yếu tố ngôn ngữ.
- Khi JSP được dịch thành một servlet, thẻ tùy chỉnh sẽ được chuyển đổi thành một lớp thực hiện hành động trên một đối tượng và được gọi là trình xử lý thẻ.
- Những hành động đó khi servlet được thực thi sẽ được bộ chứa web gọi ra.
- Để tạo thẻ tùy chỉnh do người dùng xác định, chúng ta cần tạo trình xử lý thẻ sẽ mở rộng SimpleTagSupport và phải ghi đè phương thức doTag().
- Chúng ta cần tạo TLD nơi chúng ta cần ánh xạ tệp lớp trong TLD.
Ưu điểm của thẻ tùy chỉnh trong JSP
Dưới đây là những ưu điểm của thẻ tùy chỉnh trong JSP:
- Linh hoạt: Một hành động được mô tả trong thư viện thẻ phải có thể sử dụng được trong bất kỳ vùng chứa JSP nào.
- Đơn giản: Người dùng không chuyên phải có khả năng hiểu và sử dụng cơ chế này. Các nhà cung cấp chức năng JSP phải thấy dễ dàng để cung cấp cho người dùng dưới dạng hành động.
- Biểu cảm: Cơ chế này phải hỗ trợ nhiều loại hành động, bao gồm các hành động lồng nhau, các thành phần kịch bản bên trong thân hành động, việc tạo, sử dụng và cập nhật các biến kịch bản.
- Có thể sử dụng từ nhiều ngôn ngữ lập trình khác nhau: Mặc dù đặc tả JSP hiện chỉ xác định ngữ nghĩa cho các tập lệnh trong Java ngôn ngữ lập trình, chúng tôi muốn để ngỏ khả năng của các ngôn ngữ kịch bản khác.
- Được xây dựng dựa trên các khái niệm và máy móc hiện có: Chúng tôi không muốn tái tạo những gì tồn tại ở nơi khác. Ngoài ra, chúng tôi muốn tránh xung đột trong tương lai bất cứ khi nào chúng tôi có thể dự đoán được chúng
Cú pháp:
Hãy xem như chúng ta đang tạo thẻ testGuru và chúng ta có thể sử dụng lớp taghandlertestTag, lớp này sẽ ghi đè phương thức doTag().
<ex:testGuru/> Class testTag extends SimpleTagSupport{ public void doTag()}
Ngoài ra, chúng ta sẽ phải ánh xạ lớp testTag này trong TLD (Thư viện thẻ Descripthoặc) vì bộ chứa JSP sẽ tự động tạo ánh xạ giữa tệp lớp và uri đã được đề cập trong tệp TLD.
Giao diện thẻ JSP
- Lớp này sẽ phải mở rộng lớp SimpleTagSupport.
- Lớp này sẽ phải ghi đè phương thức doTag() là một phần của lớp SimpleTagSupport (ghi đè là phương thức được kế thừa từ lớp cha).
- Giao diện này là giao diện phụ của giao diện JSPTag.
- Nó cung cấp các phương thức để thực hiện ở đầu và cuối thẻ.
- Ngoài ra, chúng ta cần ánh xạ lớp này trong TLD tức là bộ mô tả Thư viện thẻ
Chúng tôi đang xem xét trong ví dụ dưới đây
Phương thức giao diện thẻ
- doTag() là một phương thức mà chúng ta cần ghi đè để có nội dung cho thẻ.
- Nó lấy bối cảnh JSP hiện tại bằng cách sử dụng getJSPContext()
Ví dụ:
Thẻ tùy chỉnh_jsp1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Custom Tag</title> </head> <body> <ex:guruTag/> </body> </html>
Tùy chỉnh.tld
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Test TLD</short-name> <tag> <name>guruTag</name> <tag-class>demotest.guruTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
guruTag.java(TagHandler)
package demotest; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class guruTag extends SimpleTagSupport{ public void doTag() throws JspException,IOException { JspWriter out = getJspContext().getOut(); out.println("Guru Tag"); } }
Giải thích mã:
guruTag.java(TagHandler)
Dòng mã 6:Lớp guruTag mở rộng lớp SimpleTagSupport có trong jar javax.servlet.JSP
Dòng mã 7: Ở đây chúng ta ghi đè phương thức doTag() để ném JspException và IOException.
Dòng mã 9-10: Trong phương pháp này, mã sẽ được nhúng vào thẻ tùy chỉnh sẽ được gọi. Chúng ta đang lấy một đối tượng của JspWriter và đối tượng đó sẽ in ra “Thẻ Guru”.
Tùy chỉnh.tld
Dòng mã 6: Ở đây tên của thẻ tùy chỉnh là “guruTag”.
Dòng mã 7:Lớp thẻ là taghandlerclass, tức là guruTag.java. Nó lấy đường dẫn đầy đủ của tệp xử lý, bao gồm đường dẫn thư mục của vị trí tệp.
Thẻ tùy chỉnh_jsp1.jsp
Dòng mã 3:Tiền tố taglib này là bắt buộc cho tất cả các thẻ và tiền tố được thêm là 'ex' do đó nó có thể được sử dụng làm tiền tố cho tất cả các thẻ lõi và uri là custom.tld ánh xạ trình xử lý thẻ.
Dòng mã 11: Ở đây, chúng tôi đang xác định thẻ tùy chỉnh “guruTag”, thẻ này sẽ gọi phương thức doTag() của lớp trình xử lý và mã bên trong nó sẽ được thực thi.
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả sau
Đầu ra:
- Chúng tôi nhận được kết quả đầu ra là “GuruTag” từ guruTag.java, tức là TagHandler, ghi đè phương thức doTag() và in “Guru Tag” làm đầu ra.
Tổng kết
- Trong phần này, chúng ta đã tìm hiểu về thư viện thẻ tiêu chuẩn JSP, trong đó chúng ta đã tạo các thẻ lõi và thẻ tùy chỉnh.
- Các thẻ cốt lõi bao gồm các thẻ for, if, redirect, import, catch, đây là những thẻ được sử dụng cho các mục đích cơ bản trong JSP.
- Ngoài ra, chúng tôi đã tạo các thẻ tùy chỉnh trong đó chúng tôi có thể xác định các thẻ và sử dụng nó trong JSP