JSP - Thẻ tùy chỉnh

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 xác định. Khi một trang JSP chứa thẻ tùy chỉnh được dịch sang một servlet, thẻ sẽ đượ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ẻ. Vùng chứa Web sau đó sẽ gọi các hoạt động đó khi servlet của trang JSP được thực thi.

Phần 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 SimpleTagSupport lớp và ghi đè lên doTag() , nơi bạn có thể đặt mã của mình để tạo nội dung cho thẻ.

Tạo thẻ "Xin chào"

Hãy xem xét bạn muốn xác định một thẻ tùy chỉnh có tên <ex: Hello> và bạn muốn sử dụng nó theo cách sau mà không có phần thân -

<ex:Hello />

Để tạo một 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ư một trình xử lý thẻ. Bây giờ hãy để chúng tôi tạoHelloTag lớp như sau -

package com.tutorialspoint;

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!");
   }
}

Đoạn mã trên có mã hóa đơn giản trong đó doTag() phương thức lấy đối tượng JspContext hiện tại bằng cách sử dụng getJspContext() và sử dụng nó để gửi "Hello Custom Tag!" đến hiện tại JspWriter vật

Hãy để chúng tôi biên dịch lớp trên và sao chép nó trong 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:<Tomcat-Installation-Directory>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 đã xác định ở trên Hello trong chương trình JSP của chúng tôi 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 Nội dung thẻ

Bạn có thể đưa thông báo vào nội dung thẻ như bạn đã thấy với các thẻ tiêu chuẩn. Hãy xem xét bạn muốn xác định một thẻ tùy chỉnh có tên<ex:Hello> và bạn muốn sử dụng nó theo cách sau đây với cơ thể -

<ex:Hello>
   This is message body
</ex:Hello>

Hãy để chúng tôi thực hiện các thay đổi sau trong mã thẻ ở trên để xử lý nội dung của thẻ -

package com.tutorialspoint;

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());
   }
}

Tại đây, kết quả đầu ra từ lệnh gọi đầu tiên được ghi lại thành StringWritertrước khi được ghi vào JspWriter được liên kết với thẻ. Chúng tôi 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 nội dung 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>

Bạn sẽ nhận được kết quả sau:

This is message body

Thuộc tính thẻ tùy chỉnh

Bạn có thể sử dụng các thuộc tính khác nhau cùng với các thẻ tùy chỉnh của mình. Để chấp nhận một giá trị thuộc tính, một lớp thẻ tùy chỉnh cần triển khaisetter các phương thức, giống với các phương thức của JavaBean setter như hình dưới đây -

package com.tutorialspoint;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   private String message;

   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()
   
   throws JspException, IOException {
      if (message != null) {
         /* Use message from attribute */
         JspWriter out = getJspContext().getOut();
         out.println( message );
      } else {
         /* use message from the body */
         getJspBody().invoke(sw);
         getJspContext().getOut().println(sw.toString());
      }
   }
}

Tên của thuộc tính là "message", vì vậy phương pháp setter là setMessage(). Bây giờ chúng ta hãy thêm thuộc tính này vào tệp TLD bằng cách sử dụng<attribute> phần tử 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>
      
      <attribute>
         <name>message</name>
      </attribute>
   
   </tag>
</taglib>

Chúng ta hãy theo dõi JSP với thuộc tính message như sau:

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>
   
   <body>
      <ex:Hello message = "This is custom tag" />
   </body>
</html>

Điều này sẽ tạo ra kết quả sau:

This is custom tag

Xem xét việc bao gồm các thuộc tính sau cho một thuộc tính:

Không. Tài sản & Mục đích
1

name

Phần tử tên xác định 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 nếu thuộc tính này là bắt buộc hay là một tùy chọn. Nó sẽ là sai đối với tùy chọn.

3

rtexprvalue

Khai báo nếu giá trị biểu thức thời gian chạy cho thuộc tính thẻ là hợp lệ

4

type

Xác định kiểu lớp Java của thuộc tính này. Theo mặc định, nó được giả định làString

5

description

Mô tả thông tin có thể được cung cấp.

6

fragment

Khai báo nếu giá trị thuộc tính này được coi là JspFragment.

Dưới đâ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>
.....