JSP - Tag Kustom
Pada bab ini, kita akan membahas Tag Kustom di JSP. Tag kustom adalah elemen bahasa JSP yang ditentukan pengguna. Ketika halaman JSP yang berisi tag kustom diterjemahkan ke dalam servlet, tag diubah menjadi operasi pada objek yang disebut penangan tag. Wadah Web kemudian memanggil operasi tersebut ketika servlet halaman JSP dijalankan.
Ekstensi tag JSP memungkinkan Anda membuat tag baru yang dapat Anda sisipkan langsung ke Halaman JavaServer. Spesifikasi JSP 2.0 memperkenalkan Simple Tag Handler untuk menulis tag kustom ini.
Untuk menulis tag kustom, Anda cukup memperluas SimpleTagSupport kelas dan timpa doTag() metode, di mana Anda dapat menempatkan kode Anda untuk menghasilkan konten untuk tag.
Buat Tag "Halo"
Pertimbangkan Anda ingin menentukan tag kustom bernama <ex: Hello> dan Anda ingin menggunakannya dengan cara berikut tanpa body -
<ex:Hello />
Untuk membuat tag JSP khusus, Anda harus terlebih dahulu membuat kelas Java yang bertindak sebagai penangan tag. Sekarang mari kita buat fileHelloTag kelas sebagai berikut -
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!");
}
}
Kode di atas memiliki pengkodean sederhana di mana doTag() Metode mengambil objek JspContext saat ini menggunakan getJspContext() metode dan menggunakannya untuk mengirim "Hello Custom Tag!" ke arus JspWriter obyek
Mari kita kompilasi kelas di atas dan salin ke dalam direktori yang tersedia di variabel lingkungan CLASSPATH. Terakhir, buat file pustaka tag berikut:<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>
Sekarang mari kita menggunakan tag kustom yang ditentukan di atas Hello dalam program JSP kami sebagai berikut -
<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>
<html>
<head>
<title>A sample custom tag</title>
</head>
<body>
<ex:Hello/>
</body>
</html>
Panggil JSP di atas dan ini akan menghasilkan hasil sebagai berikut -
Hello Custom Tag!
Mengakses Badan Tag
Anda dapat menyertakan pesan di badan tag seperti yang Anda lihat dengan tag standar. Pertimbangkan Anda ingin menentukan tag kustom bernama<ex:Hello> dan Anda ingin menggunakannya dengan cara berikut dengan tubuh -
<ex:Hello>
This is message body
</ex:Hello>
Mari kita lakukan perubahan berikut pada kode tag di atas untuk memproses badan tag -
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());
}
}
Di sini, keluaran yang dihasilkan dari pemanggilan pertama kali ditangkap ke dalam file StringWritersebelum ditulis ke JspWriter yang terkait dengan tag. Kita perlu mengubah file TLD sebagai berikut -
<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>
Sekarang mari kita panggil tag di atas dengan body yang tepat sebagai berikut -
<%@ 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>
Anda akan menerima hasil sebagai berikut -
This is message body
Atribut Tag Kustom
Anda dapat menggunakan berbagai atribut bersama dengan tag kustom Anda. Untuk menerima nilai atribut, kelas tag khusus perlu menerapkansetter metode, identik dengan metode penyetel JavaBean seperti yang ditunjukkan di bawah ini -
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());
}
}
}
Nama atributnya adalah "message", jadi metode penyetelnya adalah setMessage(). Sekarang mari kita tambahkan atribut ini di file TLD menggunakan<attribute> elemen sebagai berikut -
<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>
Mari kita ikuti JSP dengan atribut pesan sebagai 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>
Ini akan menghasilkan hasil sebagai berikut -
This is custom tag
Pertimbangkan untuk menyertakan properti berikut untuk atribut -
S.No. | Properti & Tujuan |
---|---|
1 | name Elemen nama mendefinisikan nama atribut. Setiap nama atribut harus unik untuk tag tertentu. |
2 | required Ini menentukan apakah atribut ini diperlukan atau bersifat opsional. Ini akan salah untuk opsional. |
3 | rtexprvalue Menyatakan apakah nilai ekspresi waktu proses untuk atribut tag valid |
4 | type Mendefinisikan tipe kelas Java dari atribut ini. Secara default diasumsikan sebagaiString |
5 | description Deskripsi informasional dapat disediakan. |
6 | fragment Menyatakan apakah nilai atribut ini harus diperlakukan sebagai JspFragment. |
Berikut adalah contoh untuk menentukan properti yang terkait dengan atribut -
.....
<attribute>
<name>attribute_name</name>
<required>false</required>
<type>java.util.Date</type>
<fragment>false</fragment>
</attribute>
.....
Jika Anda menggunakan dua atribut, maka Anda dapat memodifikasi TLD Anda sebagai 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>
.....