Trong chương này, chúng ta sẽ thảo luận về Thẻ tùy chỉnh trong JSP. Thẻ tùy chỉnh là một phần tử ngôn ngữ JSP do người dùng định nghĩa. Khi một trang JSP chứa thẻ tùy chỉnh được dịch thành servlet, thẻ được chuyển đổi thành các hoạt động trên một đối tượng được gọi là trình xử lý thẻ. Sau đó, trình chứa Web sẽ gọi các hoạt động đó khi servlet của trang JSP được thực thi.
Tiện ích mở rộng thẻ JSP cho phép bạn tạo các thẻ mới mà bạn có thể chèn trực tiếp vào Trang JavaServer. Đặc tả JSP 2.0 đã giới thiệu Trình xử lý thẻ đơn giản để viết các thẻ tùy chỉnh này.
Để viết thẻ tùy chỉnh, bạn chỉ cần mở rộng lớp SimpleTagSupport và ghi đè phương thức doTag(), tại đó bạn có thể đặt mã của mình để tạo nội dung cho thẻ.
Tạo thẻ “Hello”
Giả sử bạn muốn định nghĩa một thẻ tùy chỉnh có tên và bạn muốn sử dụng nó theo cách sau mà không cần phần thân −
<ex:Hello />
Để tạo thẻ JSP tùy chỉnh, trước tiên bạn phải tạo một lớp Java hoạt động như trình xử lý thẻ. Bây giờ chúng ta hãy tạo lớp HelloTag như sau −
import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport { public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("Hello Custom Tag!"); } }
Mã trên có mã hóa đơn giản, trong đó phương thức doTag() lấy đối tượng JspContext hiện tại bằng phương thức getJspContext() và sử dụng nó để gửi “Hello Custom Tag!” đến đối tượng JspWriter hiện tại
Chúng ta hãy biên dịch lớp trên và sao chép nó vào một thư mục có sẵn trong biến môi trường CLASSPATH. Cuối cùng, tạo tệp thư viện thẻ sau: webapps\ROOT\WEB-INF\custom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
Bây giờ chúng ta hãy sử dụng thẻ tùy chỉnh Hello được định nghĩa ở trên trong chương trình JSP của chúng ta như sau −
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello/> </body> </html>
Gọi JSP ở trên và điều này sẽ tạo ra kết quả sau −
Hello Custom Tag!
Truy cập Thân thẻ
Bạn có thể đưa một thông điệp vào thân thẻ như bạn đã thấy với các thẻ chuẩn. Giả sử bạn muốn định nghĩa một thẻ tùy chỉnh có tên và bạn muốn sử dụng nó theo cách sau với một thân thẻ −
<ex:Hello> This is message body </ex:Hello>
Chúng ta hãy thực hiện những thay đổi sau trong mã thẻ ở trên để xử lý phần thân của thẻ −
import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class HelloTag extends SimpleTagSupport { StringWriter sw = new StringWriter(); public void doTag() throws JspException, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } }
Ở đây, đầu ra kết quả từ lệnh gọi đầu tiên được ghi vào StringWriter trước khi được ghi vào JspWriter được liên kết với thẻ. Chúng ta cần thay đổi tệp TLD như sau −
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Example TLD with Body</short-name> <tag> <name>Hello</name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
Bây giờ chúng ta hãy gọi thẻ trên với phần thân thích hợp như sau −
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%> <html> <head> <title>A sample custom tag</title> </head> <body> <ex:Hello> This is message body </ex:Hello> </body> </html>
Kết quả
This is custom tag
Hãy cân nhắc việc bao gồm các thuộc tính sau cho một thuộc tính −
1 | name Phần tử name định nghĩa tên của một thuộc tính. Mỗi tên thuộc tính phải là duy nhất cho một thẻ cụ thể. |
2 | required Điều này chỉ định xem thuộc tính này là bắt buộc hay là tùy chọn. Nó sẽ là false cho tùy chọn. |
3 | rtexprvalue Khai báo xem giá trị biểu thức thời gian chạy cho thuộc tính thẻ có hợp lệ không |
4 | type Xác định loại lớp Java của thuộc tính này. Theo mặc định, nó được coi là String |
5 | description Có thể cung cấp mô tả thông tin. |
6 | fragment Khai báo xem giá trị thuộc tính này có nên được coi là JspFragment không. |
Sau đây là ví dụ để chỉ định các thuộc tính liên quan đến một thuộc tính −
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
Nếu bạn đang sử dụng hai thuộc tính, thì bạn có thể sửa đổi TLD của mình như sau −
..... <attribute> <name>attribute_name1</name> <required>false</required> <type>java.util.Boolean</type> <fragment>false</fragment> </attribute> <attribute> <name>attribute_name2</name> <required>true</required> <type>java.util.Date</type> </attribute> .....