カスタムタグライブラリ
日本語 | 自作付箋辞書 |
英語 | custom tag library |
ふりがな | かすたむたぐらいぶらり |
フリガナ | カスタムタグライブラリ |
自分で新たに作成したタグライブラリ。
もしくは、既存のタグライブラリを拡張したタグライブラリ。
タグライブラリには、JSTLやStrutsタグライブラリ等が存在するが、これらでは満足できない場合、もしくは特別な処理をJSPで行う必要があるが、スクリプトレットとして記述したくない場合には、新たにタグライブラリを作成することになる。
これを「カスタムタグライブラリ」という。
カスタムタグライブラリは、クラスとtldファイルによって構成される。
クラスは、TagSupportクラスもしくはBodyTagSupportクラスのサブクラスとして作成する。
挟まない形式のタグ(<aaa:bbb />)の場合にはTagSupportクラスを、挟む形式のタグ(<aaa:bbb>CCC</aaa:bbb>)の場合にはBodyTagSupportクラスのサブクラスとする。
それぞれの適切なメソッドをオーバーライドすることで、JSPで処理する際にメソッドが呼ばれるため、その中で処理を行う。
tldファイルは「TLD」というXMLファイルである。
このファイルにタグライブラリに含まれるタグの名称、及びその属性等を記述する。
タグライブラリをJSPで使用する際は「<%@ taglib」JSPディレクティブで使用するタグライブラリを指定する。
uri属性でtldファイルを指定し、prefix属性でタグライブラリの「苗字」を指定することで、<苗字:カスタムタグ名>の形式で使用することができる。
カスタムタグライブラリは通常のJavaのプログラムと同じのため、JSP内での処理をここで記述することで、スクリプトレット等を使用せずにJavaのプログラムを実行することができる。
もしくは、既存のタグライブラリを拡張したタグライブラリ。
タグライブラリには、JSTLやStrutsタグライブラリ等が存在するが、これらでは満足できない場合、もしくは特別な処理をJSPで行う必要があるが、スクリプトレットとして記述したくない場合には、新たにタグライブラリを作成することになる。
これを「カスタムタグライブラリ」という。
カスタムタグライブラリは、クラスとtldファイルによって構成される。
クラスは、TagSupportクラスもしくはBodyTagSupportクラスのサブクラスとして作成する。
挟まない形式のタグ(<aaa:bbb />)の場合にはTagSupportクラスを、挟む形式のタグ(<aaa:bbb>CCC</aaa:bbb>)の場合にはBodyTagSupportクラスのサブクラスとする。
それぞれの適切なメソッドをオーバーライドすることで、JSPで処理する際にメソッドが呼ばれるため、その中で処理を行う。
tldファイルは「TLD」というXMLファイルである。
このファイルにタグライブラリに含まれるタグの名称、及びその属性等を記述する。
タグライブラリをJSPで使用する際は「<%@ taglib」JSPディレクティブで使用するタグライブラリを指定する。
uri属性でtldファイルを指定し、prefix属性でタグライブラリの「苗字」を指定することで、<苗字:カスタムタグ名>の形式で使用することができる。
カスタムタグライブラリは通常のJavaのプログラムと同じのため、JSP内での処理をここで記述することで、スクリプトレット等を使用せずにJavaのプログラムを実行することができる。
参考サイト
<%-- webapps/sample-servlet/sample.jsp --%>
<%-- http://localhost:8080/sample-servlet/sample.jsp でアクセスできます。 --%>
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%--
pageEncodingには、このファイルを保存した時の文字コードを指定してください。
Windowsであれば"Windows-31J"を指定すればいいでしょう。
--%>
<%@ taglib uri="/WEB-INF/lib/taglib.tld" prefix="sample_taglib" %>
<!--
これがタグライブラリを使うためのJSPディレクティブです。
uriで、タグライブラリを定義するXMLファイルtaglib.tldを相対パスで指定します。
prefixで、タグライブラリの「苗字」を付けます。
-->
<html>
<head>
<title>JSPのサンプル</title>
</head>
<body>
<!-- タグライブラリを使用します。 -->
<!-- ↓%@ taglibのprefixで指定した名前。 -->
<!-- ↓ ↓name属性。この値がSampleTagクラスのnameフィールドにセットされます。 -->
<sample_taglib:sample_tag name="AAA">かきくけこ</sample_taglib:sample_tag>
<!-- ↑ ↑タグで囲まれた文字列。SampleTagクラス内で、getBodyContent().getString()で取得できます。-->
<!-- ↑taglib.tldのtaglib/tag/nameで指定したタグライブラリ名 -->
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<!-- webapps/sample-servlet/WEB-INF/lib/taglib.tld -->
<!-- カスタムタグライブラリを定義するXMLファイルです。 -->
<taglib>
<tlib-version>1.0</tlib-version><!-- このファイルのバージョン。 -->
<jsp-version>1.2</jsp-version><!-- JSPのバージョン。 -->
<short-name>sample-servlet</short-name><!-- このタグライブラリの名称。 -->
<description>sample-servletタグライブラリ</description><!-- このタグライブラリの説明。 -->
<!-- sample_tagカスタムタグを定義します。 -->
<tag>
<name>sample_tag</name><!-- タグの名前。 -->
<tag-class>taglib.SampleTag</tag-class><!-- このタグを処理するクラス。 -->
<!-- このタグが持つ属性を定義します。 -->
<attribute>
<name>name</name><!-- 属性の名前。 -->
<!--
この属性に渡さされた値が、tag-classで指定したクラスの、
この名前のフィールドにsetterを通して自動的にセットされます。
-->
</attribute>
</tag>
</taglib>
// webapps/sample-servlet/WEB-INF/src/taglib/SampleTag.java
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
package taglib;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* カスタムタグとなるクラスです。
* <sample_taglib:sample_tag name="名前">あいうえお</sample_taglib:sample_tag>
*/
public class SampleTag extends BodyTagSupport
{
/**
* name属性が格納されるフィールド(プロパティ)。
*/
protected String name = null;
// getter
public String getName()
{
return this.name;
}
// setter
public void setName( String name )
{
this.name = name;
}
/**
* タグを処理する時に呼ばれるメソッドです。
* BodyTagSupportクラスのメソッドです。
*/
public int doAfterBody() throws JspException
{
try
{
// 出力用JspWriterクラスを取得します。
JspWriter out = getPreviousOut();
// タグで囲まれている文字列を取得します。
BodyContent bodyContent = getBodyContent();
String bodyText = bodyContent.getString();
// その文字列を「」で囲んで出力します。
out.print( "「" + bodyText + "」" );
// name属性の文字列を()で囲んで出力します。
out.print( "(" + name + ")" );
// BodyContentが持っている、getString()メソッドで取得できる文字列を
// 削除します。
bodyContent.clearBody();
// 処理を完了します。
return SKIP_BODY;
}
catch( IOException e )
{
// 出力時に例外が発生しました。
e.printStackTrace();
throw new JspException( e.getMessage() );
}
}
}
<%-- http://localhost:8080/sample-servlet/sample.jsp でアクセスできます。 --%>
<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %>
<%--
pageEncodingには、このファイルを保存した時の文字コードを指定してください。
Windowsであれば"Windows-31J"を指定すればいいでしょう。
--%>
<%@ taglib uri="/WEB-INF/lib/taglib.tld" prefix="sample_taglib" %>
<!--
これがタグライブラリを使うためのJSPディレクティブです。
uriで、タグライブラリを定義するXMLファイルtaglib.tldを相対パスで指定します。
prefixで、タグライブラリの「苗字」を付けます。
-->
<html>
<head>
<title>JSPのサンプル</title>
</head>
<body>
<!-- タグライブラリを使用します。 -->
<!-- ↓%@ taglibのprefixで指定した名前。 -->
<!-- ↓ ↓name属性。この値がSampleTagクラスのnameフィールドにセットされます。 -->
<sample_taglib:sample_tag name="AAA">かきくけこ</sample_taglib:sample_tag>
<!-- ↑ ↑タグで囲まれた文字列。SampleTagクラス内で、getBodyContent().getString()で取得できます。-->
<!-- ↑taglib.tldのtaglib/tag/nameで指定したタグライブラリ名 -->
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<!-- webapps/sample-servlet/WEB-INF/lib/taglib.tld -->
<!-- カスタムタグライブラリを定義するXMLファイルです。 -->
<taglib>
<tlib-version>1.0</tlib-version><!-- このファイルのバージョン。 -->
<jsp-version>1.2</jsp-version><!-- JSPのバージョン。 -->
<short-name>sample-servlet</short-name><!-- このタグライブラリの名称。 -->
<description>sample-servletタグライブラリ</description><!-- このタグライブラリの説明。 -->
<!-- sample_tagカスタムタグを定義します。 -->
<tag>
<name>sample_tag</name><!-- タグの名前。 -->
<tag-class>taglib.SampleTag</tag-class><!-- このタグを処理するクラス。 -->
<!-- このタグが持つ属性を定義します。 -->
<attribute>
<name>name</name><!-- 属性の名前。 -->
<!--
この属性に渡さされた値が、tag-classで指定したクラスの、
この名前のフィールドにsetterを通して自動的にセットされます。
-->
</attribute>
</tag>
</taglib>
// webapps/sample-servlet/WEB-INF/src/taglib/SampleTag.java
// このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。
package taglib;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
* カスタムタグとなるクラスです。
* <sample_taglib:sample_tag name="名前">あいうえお</sample_taglib:sample_tag>
*/
public class SampleTag extends BodyTagSupport
{
/**
* name属性が格納されるフィールド(プロパティ)。
*/
protected String name = null;
// getter
public String getName()
{
return this.name;
}
// setter
public void setName( String name )
{
this.name = name;
}
/**
* タグを処理する時に呼ばれるメソッドです。
* BodyTagSupportクラスのメソッドです。
*/
public int doAfterBody() throws JspException
{
try
{
// 出力用JspWriterクラスを取得します。
JspWriter out = getPreviousOut();
// タグで囲まれている文字列を取得します。
BodyContent bodyContent = getBodyContent();
String bodyText = bodyContent.getString();
// その文字列を「」で囲んで出力します。
out.print( "「" + bodyText + "」" );
// name属性の文字列を()で囲んで出力します。
out.print( "(" + name + ")" );
// BodyContentが持っている、getString()メソッドで取得できる文字列を
// 削除します。
bodyContent.clearBody();
// 処理を完了します。
return SKIP_BODY;
}
catch( IOException e )
{
// 出力時に例外が発生しました。
e.printStackTrace();
throw new JspException( e.getMessage() );
}
}
}
<%-- webapps/sample-servlet/sample.jsp --%> <%-- http://localhost:8080/sample-servlet/sample.jsp でアクセスできます。 --%> <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <%-- pageEncodingには、このファイルを保存した時の文字コードを指定してください。 Windowsであれば"Windows-31J"を指定すればいいでしょう。 --%> <%@ taglib uri="/WEB-INF/lib/taglib.tld" prefix="sample_taglib" %> <!-- これがタグライブラリを使うためのJSPディレクティブです。 uriで、タグライブラリを定義するXMLファイルtaglib.tldを相対パスで指定します。 prefixで、タグライブラリの「苗字」を付けます。 --> <html> <head> <title>JSPのサンプル</title> </head> <body> <!-- タグライブラリを使用します。 --> <!-- ↓%@ taglibのprefixで指定した名前。 --> <!-- ↓ ↓name属性。この値がSampleTagクラスのnameフィールドにセットされます。 --> <sample_taglib:sample_tag name="AAA">かきくけこ</sample_taglib:sample_tag> <!-- ↑ ↑タグで囲まれた文字列。SampleTagクラス内で、getBodyContent().getString()で取得できます。--> <!-- ↑taglib.tldのtaglib/tag/nameで指定したタグライブラリ名 --> </body> </html> <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <!-- webapps/sample-servlet/WEB-INF/lib/taglib.tld --> <!-- カスタムタグライブラリを定義するXMLファイルです。 --> <taglib> <tlib-version>1.0</tlib-version><!-- このファイルのバージョン。 --> <jsp-version>1.2</jsp-version><!-- JSPのバージョン。 --> <short-name>sample-servlet</short-name><!-- このタグライブラリの名称。 --> <description>sample-servletタグライブラリ</description><!-- このタグライブラリの説明。 --> <!-- sample_tagカスタムタグを定義します。 --> <tag> <name>sample_tag</name><!-- タグの名前。 --> <tag-class>taglib.SampleTag</tag-class><!-- このタグを処理するクラス。 --> <!-- このタグが持つ属性を定義します。 --> <attribute> <name>name</name><!-- 属性の名前。 --> <!-- この属性に渡さされた値が、tag-classで指定したクラスの、 この名前のフィールドにsetterを通して自動的にセットされます。 --> </attribute> </tag> </taglib> // webapps/sample-servlet/WEB-INF/src/taglib/SampleTag.java // このサンプルプログラムは「サーブレット」の項目に書かれている準備を行ってから使用してください。 package taglib; import java.io.IOException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.BodyContent; import javax.servlet.jsp.tagext.BodyTagSupport; /** * カスタムタグとなるクラスです。 * <sample_taglib:sample_tag name="名前">あいうえお</sample_taglib:sample_tag> */ public class SampleTag extends BodyTagSupport { /** * name属性が格納されるフィールド(プロパティ)。 */ protected String name = null; // getter public String getName() { return this.name; } // setter public void setName( String name ) { this.name = name; } /** * タグを処理する時に呼ばれるメソッドです。 * BodyTagSupportクラスのメソッドです。 */ public int doAfterBody() throws JspException { try { // 出力用JspWriterクラスを取得します。 JspWriter out = getPreviousOut(); // タグで囲まれている文字列を取得します。 BodyContent bodyContent = getBodyContent(); String bodyText = bodyContent.getString(); // その文字列を「」で囲んで出力します。 out.print( "「" + bodyText + "」" ); // name属性の文字列を()で囲んで出力します。 out.print( "(" + name + ")" ); // BodyContentが持っている、getString()メソッドで取得できる文字列を // 削除します。 bodyContent.clearBody(); // 処理を完了します。 return SKIP_BODY; } catch( IOException e ) { // 出力時に例外が発生しました。 e.printStackTrace(); throw new JspException( e.getMessage() ); } } }