独自のカスタムタグライブラリを作成する(一)


JSPのタグライブラリを使用することで、表示レイヤのJavaコードを減らすことができ、修正、メンテナンス、読み取りが容易になることはよく知られています.
<%
 String format ="yyyy-MM-dd HH:mm:ss";
 SimpleDateFormat sdf = new SimpleDateFormat(format);
 String date = sdf.format(new Date());
 out.println(date);
%>

JSPタグライブラリを使用していない場合は、Javaコードを大量に書くため、ページの乱れの維持、修正、読み取りが困難になります.JSPタグライブラリを使用する場合は、以下のように簡略化できます.
<util:date/>
 
JSPタグライブラリはJavaコードの書き込み量を大幅に減少させ,機能も強力であることが明らかになった.
 
このタグについて簡単に説明します.「util」はタグの接頭辞です.1つのJSPページで複数の異なるタグが使用される可能性があり、異なるタグライブラリでは
同じ名前のタグがあり、タグの重複の問題を解決するために、ここでは「接頭辞識別法」が使用され、カスタムタグライブラリごとに異なる接頭辞が使用されます.「date」はこのタグの名前で、JSPのこの行のカスタムタグを実行すると、対応するタグ処理クラスで対応するメソッドが呼び出され、日付情報が出力されます.したがって,カスタムタグライブラリのJSPページを用いて対応するservletファイルに変換すると,生成したサーブレットファイルにタグ処理クラス対応のメソッドを呼び出すJavaコードが含まれる.
 
次に、独自に定義したタグライブラリを作成します.
学習目標:独自のタグライブラリを作成し、カスタムタグライブラリを作成するための基本的な手順と方法を理解します.
1.タグ処理クラスの作成
 
/**
*          Tag Handler ,                
*/
public class TimerTag extends TagSupport {
	private static final long serialVersionUID = 1L;
	private long start;
	private long end;
	/**
         *            ,       
         */
	public int doStartTag(){
		start = System.currentTimeMillis();
		return EVAL_BODY_INCLUDE;
	}
       /**
         *            ,       
         */
	public int doEndTag()throws JspTagException{
		end = System.currentTimeMillis();
		long elapsed = end - start;
		try{
			JspWriter out = pageContext.getOut();
			out.println("running time : " + elapsed + "ms");
		}catch(IOException e){
			throw new JspTagException(e);
		}
		return EVAL_PAGE;
	}
}

TimerTagクラスはjavaxを継承する.servlet.jsp.tagext.TagSupportクラスは,doStartTag()とdoEndTag()メソッドを書き換えた.
JSPページがtimerタグの開始タグに実行されるとdoStartTag()メソッドが呼び出され、start変数に現在の時間の数値が与えられます.
 EVAL_BODY_INCLUDE、この定数は、カスタムタグに含まれるJSPページの内容を実行することを示す.
JSPページがtimerタグの終了タグに実行されるとdoEndTag()メソッドが呼び出され,end変数に現在の時間を表す数値が与えられる.マークされた処理クラスではJSPページのようにJSPのoutビルドオブジェクトを直接使用してコンテンツ出力を行うことはできませんが、pageContextオブジェクトのgetOut()メソッドでoutビルドオブジェクトを取得してからoutオブジェクトを呼び出して出力する必要があります.同様に,タグ処理クラスの内部では,任意のJSP内蔵オブジェクトを用いてpageContext()オブジェクトの対応するgetメソッドを呼び出す.たとえば、セッションオブジェクトを取得する場合は、getSession()メソッドで取得できます.EVAL_PAGEはこのタグの後のJSPページの内容が引き続き実行可能であることを示している.
2.utilを作成する.tldファイル
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaeeweb-jsptablibrary_2_1.xsd"
     version ="2.1" >
     <tlib-version>1.0</tlib-version>
     <short-name>util</short-name>
     <uri>http://crazy.com/taglib/util</uri>
     <display-name>utilitytags</display-name>
     <description>custom web utility tags</description>
     <tag>
     	<name>Timer</name>
     	<tag-class>practice.TimerTag</tag-class>
     	<body-content>JSP</body-content>
     </tag>
</taglib>

Webプロジェクトでカスタムタグライブラリを使用するには、XMLファイルであるカスタムタグの構成記述ファイルを作成する必要があるので、xmlファイルのルールを遵守します.作成してWebRoot/WEB_に保存INFディレクトリの下.
util.tldファイルは現在タグライブラリのプロファイルをカスタマイズしており、タグライブラリ内のすべてのタグはこのファイルで構成されてからJSPページで使用されます.
<short-name>util</short-name>

このタグライブラリで推奨されるプレフィックス名を設定します.
<body-content>JSP</body-content>

タグに含まれる内容をどのように処理するかを設定し、JSP、empty、tagdependent、scriptlesssを使用します.JSP表示に含まれるコンテンツがJSPコンテンツであれば、まずJSPコードを実行し、実行後の構成をタグ処理クラスに渡すように設定します.一方、Scriptless表示マークに含まれるコンテンツ部は、Scriptletコンテンツであってもよいが、ELやJSP動作などの他のJSP要素であってもよい.tagdependentは、含まれるコンテンツ部に対して任意の処理を行い、直接タグ処理クラスにコンテンツを渡し、タグ処理クラスが自ら処理することを示す.emptyは、タグに内容が含まれていないことを示します.
3.JSPファイルを作成し、自分で作成したタグライブラリをテストします.
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="util" uri="http://crazy.com/taglib/util"%>
<html>
  <head></head>
  <body>
	<util:Timer>
		<%
		for(int i =0;i<1000000;i++);
		 %>
	</util:Timer>	
  </body>
</html>
 
配置し、実行して結果を確認します.