[PR]看護師の好条件な求人情報満載:年間30,000人の転職看護師が利用中

カスタムタグ(1)


1.カスタムタグとは
 カスタムタグは、JSP1.1から用いることができるようになりました。アクションタグのようにあらか
じめ用意されているものを利用するのではなく、ユーザー独自のタグを定義することができます。
 カスタムタグはファイルの関連が少しややこしくなるので、説明しにくいのですがプログラムを
よく追いかけて考えてみてください。
 カスタムタグはタグハンドクラスを呼び出すのですが、ただ単にクラスを呼び出すのではなくタグ
ライブラリに定義します。タグライブラリ(.tld)というのはタグハンドクラスをまとめてライブラリにした
ものです。タグライブラリを利用するにはデプロイメント・ディスタプリタ(web.xml)に定義し、それ
をJSPのファイルから呼び出します。
 それでは住所録ファイルを読み込んで表示するプログラムを作ってみます。普通にJSPファイル
だけなら簡単なプログラムでもカスタムタグを使うとややこしくなるかもしれません。

AddressBookTag.java(タグハンドクラス)
 package taglib;

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

 public class AddressBookTag extends TagSupport {
     String file = null;
     public int doStartTag() throws JspException {
         StringTokenizer stk;
         String str;
         ServletContext application = pageContext.getServletContext();
         JspWriter out = pageContext.getOut();

         try {
            FileReader fr =
                 new FileReader(application.getRealPath(file));
            BufferedReader br = new BufferedReader(fr);
            out.print("<table border='1'>");

            while(br.ready()) {
              out.println("<tr>");
              str = br.readLine();
              stk = new StringTokenizer(str,"\t");
              while(stk.hasMoreTokens()) {
                out.print("<td>" + stk.nextToken() + "</td>");
              }
              out.print("</tr>");
            }
            br.close();
          } catch(Exception e) {
            throw new JspException(e.getMessage());
          }
         return SKIP_BODY;
     }
     public void setFile(String file) { this.file = file; }

 }
 %CATALINA_HOME%\webapps\WEB-INF\classesの下にtaglibというフォルダを作ってください。そ
して、これをコンパイルしてください。
 本体の処理を必要としない場合はTagSupportクラスあるいはSimpleTagSupportクラスを継承して
ください。その違いはSimplTagSupportクラスはdoTagメソッドだけをもつクラスに対して、TagSupport
クラスは開始タグを処理するdoStartメソッド、終了タグを処理するdoEndTagメソッド、本体を処理した
後に処理されるdoAfterBodyと3つメソッドがあります。SimpleTagSupport簡単なタグの場合は便利
かもしれませんが、インスタンス生成するたびに生成されるので、パフォーマンスの低下しやすくなり
ます。TagSupportクラスは3つのメソッドを持っているの用途ごとに使い分けができますし、1度使用
されたインスタンスは保持しつづけますので、何回も繰り返し使う場合はオーバーヘッドが少ないと
いう特徴があります。本体を処理する場合はBodyTagSupportクラスを使います。メソッドは開始タグ
の直後に呼び出されるdoStartメソッド、タグボディの処理の前に呼び出されるdoinitBodyメソッドと
タグボディの処理後に呼び出されるdoAfterメソッド、終了タグの直後に呼び出されるdoEndTagが
あります。

doStartTagとdoEndTagの戻り値
メソッド 戻り値 概要
doStartTag SKIP_BODY タグ本体を処理しない
EVAL_BODY_INCLUDE タグ本体をそのまま出力する
EVAL_BODY_BUFFERED タグ本体をタグハンドラで処理する
doEndTag EVAL_PAGE 残りのページを処理する
SKIP_PAGE 残りのページを処理しない

属性値をセットしたいので
   public void setFile(String file) { this.file = file; }
このようにしておきます。

mytag.tld(タグライブラリディスタプリタ)
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
   <description>JSP/Servlet Sample</description>
   <display-name>JSP/Servlet Sample</display-name>
   <tlib-version>2.0</tlib-version>
   <short-name>custag</short-name>
   <uri>http://programnet.hp.infoseek.co.jp/ProTaglibs-1.0</uri>
   <tag>
      <name>address</name>
      <tag-class>taglib.AddressBookTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
          <name>file</name>
          <required>true</required>
          <rtexpvalue>true</rtexpvalue>
       </attribute>
   </tag>
</taglib>
Tomcat5.X系を対象とした場合このように記述します。<short-name>のcustagとjspのtaglibディレクティブ
のprefixと一致するようにします。<tag.>にはタグライブラリに収容するタグハンドラクラスの情報を記述し
ます。<tag>エレメントの中の<name>はjspで使用する名称を記述します。<tag-class>には
パッケージ名.クラス名としてします。
 属性値を取得したいので<attribute>エレメントを定義します。そしてカスタムタグで使用する名前を
<name>に書いて、属性値が必須の場合は<required>をtrueで、そうでない場合はfalseとしておきます。
今回はファイル名は必須なのでtrueとします。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app2_4.xsd"
version="2.4">

・・・・省略・・・
<taglib>
   <taglib-uri>http://jakarta.apache.org/taglibs/string-1.0</taglib-uri>
   <taglib-location>/WEB-INF/tld/taglibs-string.tld</taglib-location>
</taglib>
<taglib>
    <taglib-uri>http://programnet.hp.infoseek.co.jp/ProTaglibs-1.0</taglib-uri>
    <taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>
</taglib>


・・・・省略・・・
</web-app>
 赤の部分を追加してください。<taglib-uri>とjspのtaglibディレクティブのuriと一致しないとダメです。
<taglib-location>にはTLDの場所を記述します。

address.jsp
<%@ taglib uri="http://programnet.hp.infoseek.co.jp/ProTaglibs-1.0" prefix="custag" %>

<html>
  <head>
    <title>住所録</title>
  </head>
  <body>
  <h1>住所録一覧</h1>
     <custag:address file="/chap1/data/address.txt" />
  </body>
</html>
 taglibディレクティブに使用するタグライブラリを記述します。どのタグライブラリのどのハンドクラスを使用
するのか記述しないとダメなので、<プレフィクス:タグ名 />で記述します。タグ名はTLDの<tag>エレメント
の<name>と一致しなければいけません。

address.txt
ID   名前   性別   電話番号   住所
1   中村俊之介    男    00x-xxxx-xxxx   東京都八王子市***
2   川口良子     女    00x-xxxx-xxxx   大阪府大阪市中央区***
3   中田英二     男    00x-xxxx-xxxx   京都府京都市中京区***
4   稲本潤子     女    00x-xxxx-xxxx   神奈川県横浜市***
5   小野伸子     女    00x-xxxx-xxxx   奈良県奈良市****
タブで間を空けないとうまく読み込めませんので注意してください。
%CATALINA_HOME%\webapps\samples/chap1/dataにaddress.txtを保存してください。

以下にアクセスしてみてください。
 http://localhost:8080/samples/chap1/address.jsp




| HOME | BACK |


[PR]中古車探しは、ガリバー:在庫多数、全車保証つき!