naobe @ ウィキ

カスタムタグ

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
JSPにもどる
http://www.techscore.com/tech/J2EE/JSP/5-2.html 参照

コーディング

ボディを使わない

  • Tagをimplementしたクラスを作成
  • doStartTagにタグが開始したときの動作を記述する
  • doEndTagにタグが終了したときの動作を記述する。タグ以後のページを有効にするために、EVAL_PAGEを返す。
  • releaseはこのクラスが取得したリソースを開放するために使う

【実装例】
/**
 * <p>[機能]ページキャッシュ無効化</p>
 * <p>[機能詳細]ページのキャッシュを無効にする</p>
 * 
 * @author suna
 */
public class NoPageCasheTag implements Tag {
   /**
    * 親タグ
    */
   private Tag parent;
   /**
    * ページコンテキスト
    */
   private PageContext pageContext;
   private String test;

   /* (non-Javadoc)
    * @see javax.servlet.jsp.tagext.Tag#doEndTag()
    */
   @Override
   public int doEndTag() throws JspException {
       HttpServletResponse resp = (HttpServletResponse) pageContext.getResponse();
       //現在時刻
       Calendar objCal1=Calendar.getInstance();
       Calendar objCal2=Calendar.getInstance();
       objCal2.set(1970,0,1,0,0,0);
       resp.setDateHeader("Last-Modified",objCal1.getTime().getTime());
       resp.setDateHeader("Expires",objCal2.getTime().getTime());
       resp.setHeader("pragma","no-cache");
       resp.setHeader("Cache-Control","no-cache");

       if("true".equals(test)) {
           try {
               pageContext.getOut().println("<p>no page cashe done.</p>");
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
       return EVAL_PAGE;
   }

   /* (non-Javadoc)
    * @see javax.servlet.jsp.tagext.Tag#doStartTag()
    */
   @Override
   public int doStartTag() throws JspException {
       return SKIP_BODY;
   }

   /* (non-Javadoc)
    * @see javax.servlet.jsp.tagext.Tag#getParent()
    */
   @Override
   public Tag getParent() {
       return parent;
   }

   /* (non-Javadoc)
    * @see javax.servlet.jsp.tagext.Tag#release()
    */
   @Override
   public void release() {
   }

   /* (non-Javadoc)
    * @see javax.servlet.jsp.tagext.Tag#setPageContext(javax.servlet.jsp.PageContext)
    */
   @Override
   public void setPageContext(PageContext pageContext) {
       this.pageContext = pageContext;
   }

   /* (non-Javadoc)
    * @see javax.servlet.jsp.tagext.Tag#setParent(javax.servlet.jsp.tagext.Tag)
    */
   @Override
   public void setParent(Tag parent) {
       this.parent = parent;
   }
   
   /**
    * テスト属性設定
    * 
    * @param flag true:テストプリント実行, false:テストプリント実行しない
    */
   public void setTest(String flag) {
       this.test = flag;
   }
}

ボディを使う



タグ設定ファイル

WEB-INF下に以下の形式でファイルを置く
【タグ設定ファイル my-taglib.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>カスタムタグライブラリ</description>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>MyTagLibrary</short-name>
   <tag>
       <name>noPageCashe</name>             --> タグ名
       <tag-class>suna.screen.tag.NoPageCasheTag</tag-class>
       <body-content>empty</body-content>
       <attribute>                          --> 属性設定
           <name>test</name>                --> 属性の名前
           <required>false</required>       --> 必須属性のときtrue
           <rtexprvalue>false</rtexprvalue> --> スクリプトレットが使用可能のときtrue
       </attribute>
   </tag>
 </taglib>

JSP記述

 <%@ taglib uri="/WEB-INF/my-taglib.tld" prefix="suna" %>
 ・・・
 <suna:noPageCashe test="true"/>
人気記事ランキング
ウィキ募集バナー