Tag tersuai JSP


Teg tersuai ialah elemen bahasa JSP yang ditentukan pengguna. Apabila halaman JSP mengandungi teg tersuai, ia akan ditukar menjadi servlet dan teg akan ditukar menjadi Operasi objek yang dipanggil pengendali tag ialah operasi yang dipanggil bekas Web apabila servlet dilaksanakan.

Pelanjutan teg JSP membolehkan anda membuat teg baharu dan memasukkannya terus ke halaman JSP. Pengendali Teg Mudah telah diperkenalkan dalam spesifikasi JSP 2.0 untuk menulis teg tersuai ini.

Anda boleh mewarisi kelas SimpleTagSupport dan mengatasi kaedah doTag() untuk membangunkan teg tersuai yang paling mudah.


Buat teg "Hello"

Seterusnya, kami ingin mencipta teg tersuai dipanggil <ex:Hello>, dengan format teg:

<ex:Hello />

Kepada buat teg JSP tersuai, anda mesti mencipta kelas Java yang mengendalikan teg terlebih dahulu. Jadi, mari kita cipta kelas HelloTag seperti berikut:

package com.php;

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

Kod berikut mengatasi kaedah doTag(), yang menggunakan kaedah getJspContext() untuk mendapatkan objek JspContext semasa dan menggantikan "Hello Custom Tag is!" dihantar ke objek JspWriter.

Kompilasi kelas di atas dan salin ke direktori CLASSPATH pembolehubah persekitaran. Akhir sekali, cipta pustaka teg berikut: <Direktori pemasangan Tomcat>webappsROOTWEB-INFcustom.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.php.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>
</taglib>

Seterusnya, kita boleh menggunakan teg Hello dalam fail JSP:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  <body>
    <ex:Hello/>
  </body>
</html>

Hasil output program di atas ialah:

Hello Custom Tag!

Akses teg isi

Anda boleh memasukkan kandungan mesej dalam teg sama seperti perpustakaan teg standard. Jika kami ingin memasukkan kandungan dalam Hello tersuai kami, formatnya adalah seperti berikut:

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

Kami boleh mengubah suai fail kelas pemprosesan tag, kodnya adalah seperti berikut:

package com.php;

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

}

Seterusnya kita perlu ubah suai fail TLD, seperti berikut Seperti yang ditunjukkan:

<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.php.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

Kini kita boleh menggunakan teg yang diubah suai dalam JSP, seperti yang ditunjukkan di bawah:

<%@ 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>

Hasil output program di atas adalah seperti berikut:

This is message body

Atribut teg tersuai

Anda boleh menetapkan pelbagai atribut dalam piawaian tersuai Untuk menerima atribut dan nilai, kelas teg tersuai mesti melaksanakan kaedah setter dalam JavaBean berikut:

package com.php;

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) {
          /* 从属性中使用消息 */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* 从内容体中使用消息 */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }

}

Nama hartanah ialah "message", jadi kaedah setter ialah setMessage(). Sekarang mari kita tambah atribut ini pada elemen <attribute> yang digunakan dalam fail TLD:

<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.php.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

Sekarang kita boleh menggunakan atribut mesej dalam fail JSP seperti berikut:

<%@ 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>

Di atas contoh hasil output data ialah:

This is custom tag

Anda juga boleh memasukkan atribut berikut:

属性描述
name定义属性的名称。每个标签的是属性名称必须是唯一的。
required指定属性是否是必须的或者可选的,如果设置为false为可选。
rtexprvalue声明在运行表达式时,标签属性是否有效。
type定义该属性的Java类类型 。默认指定为 String
description描述信息
fragment如果声明了该属性,属性值将被视为一个 JspFragment

Berikut ialah contoh menentukan atribut berkaitan:

.....
    <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
    </attribute>
.....

Jika anda menggunakan dua atribut, ubah suai fail TLD seperti berikut:

.....
    <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>
.....