カスタムラベル&単純ラベル


1.tagインタフェースを実現するjavaクラスを作成する
 
 
public class ViewIPTag extends TagSupport {

	@Override
	public int doStartTag() throws JspException {
	
		HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
		JspWriter out = this.pageContext.getOut();
		
		
		String ip = request.getRemoteAddr();
    	try {
			out.print(ip);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		
		return super.doStartTag();
	}
}

 
 
 
2.tldファイルでラベルプロセッサクラスを記述する(tldファイルの場所:WEB-INFの下で、apache-tomcat-6.0.2webappsexamplesWEB-INFjsp 2jsp 2-example-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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>com</short-name>
    <uri>http://www.com.cn</uri>
    
    
    <tag>
        <name>viewIP</name>
		<tag-class>com.web.tag.ViewIPTag</tag-class>
		<body-content>empty</body-content>
    </tag>
    
</taglib>

 
 
3.jspページでのカスタムラベルのインポートと使用
 
 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://www.com.cn" prefix="com" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP '1.jsp' starting page</title>
  </head>
  
  <body>
     ip :<com:viewIP/>
  </body>
</html>
 
 
 
---------------------------------------------------
 
Tagインタフェースの実行フロー
 
 
JSPエンジンがカスタムラベルに遭遇すると、まずラベルプロセッサクラスのインスタンスオブジェクトを作成し、JSP仕様で定義された通信ルールに従ってそのメソッドを順次呼び出します.
 
  • public void setPageContext(PageContext pc)、JSPエンジンはラベルプロセッサをインスタンス化した後、setPageContextメソッドを呼び出してJSPページのpageContextオブジェクトをラベルプロセッサに渡し、ラベルプロセッサはその後、このpageContextオブジェクトを介してJSPページと通信することができる.
  • public void setParent(Tag t)、setPageContextメソッドの実行が完了すると、WEBコンテナが呼び出したsetParentメソッドは、現在のラベルの親ラベルを現在のラベルプロセッサに渡し、現在のラベルに親ラベルがない場合、setParentメソッドに渡されるパラメータ値はnullとなる.
  • public int doStartTag()は、setPageContextメソッドとsetParentメソッドを呼び出した後、WEBコンテナがカスタムラベルの開始フラグを実行すると、ラベルプロセッサのdoStartTagメソッドを呼び出す.
  • public int doEndTag()は、WEBコンテナがカスタムラベルのラベルボディを実行した後、カスタムラベルの終了フラグを実行します.このとき、WEBコンテナはラベルプロセッサのdoEndTagメソッドを呼び出します.
  • public void release()は、通常、WEBコンテナがカスタムラベルを実行すると、ラベルプロセッサがメモリに存在し、Webアプリケーションが停止するまで他のリクエストサーバに対してreleaseメソッドが呼び出されます.
  • カスタムラベルを使用してページの内容を制御する
  • .
    	int x = 5;// 
    	@Override
    	public int doStartTag() throws JspException {
    		return Tag.EVAL_BODY_INCLUDE;// ( )
    //		return Tag.SKIP_BODY;// 
    //		return Tag.EVAL_PAGE;// jsp (<com:demo1/> html )
    	}
    	// 
    	public int doAfterBody() throws JspException {
    		x--;
    		if(x>0){
    			return IterationTag.EVAL_BODY_AGAIN;
    		}else{
    			return IterationTag.SKIP_BODY;
    		}
    	}
    	// ( )extends BodyTagSupport
    	public int doEndTag() throws JspException {
    		BodyContent bc = this.getBodyContent();   // 
    		String content =  bc.getString();
    		content = content.toUpperCase();
    		try {
    			this.pageContext.getOut().write(content);
    		} catch (IOException e) {
    			throw new RuntimeException(e);
    		}
    		return Tag.EVAL_PAGE;
    	}
    <tag>
            <name>demo1</name>
    	<tag-class>cn.com.web.tag.TagDemo1</tag-class>
    	<body-content>JSP</body-content>
    </tag>
    <com:demo1>
    	aaaaa
    </com:demo1>
      	

     
  • 単純ラベルを使用してページ内容を制御
  • .
    public class SimpleTagDemo1 extends SimpleTagSupport {
            private int count;
    	private Date date;
    
    	public void setCount(int count) {
    		this.count = count;
    	}
    
    	public void setDate(Date date) {
    		this.date = date;
    	}
    
    	@Override
    	public void doTag() throws JspException, IOException {
    		
    		JspFragment  jf = this.getJspBody();
    		//jf.invoke(this.getJspContext().getOut());// 
                    //for(int i=0;i<5;i++){// 5 
    		//	jf.invoke(null);  
    		//}
                    //throw new SkipPageException(); jsp 
                    //------------ 
                   //StringWriter sw = new StringWriter();
    		//jf.invoke(sw);
    		//String content = sw.toString();
    		//content = content.toUpperCase();
    		//this.getJspContext().getOut().write(content);
                   //---------- 
                   //this.getJspContext().getOut().write(date.toLocaleString() + "<br/>");
    		//for(int i=0;i<count;i++){
    		//	jf.invoke(null);
    		//}
    	}
    	
    }
    <tag>
            <name>demo1</name>
    	<tag-class>cn.com.web.simpletag.SimpleTagDemo1</tag-class>
    	<body-content>scriptless</body-content>
    		
    	<attribute>
    		<name>count</name>
    		<required>true</required>
    		<rtexprvalue>true</rtexprvalue>
    	</attribute>
    		
    	<attribute>
    		<name>date</name>
    		<required>true</required>
    		<rtexprvalue>true</rtexprvalue>
    	</attribute>
    </tag>

     
    <com:demo1 count="3" date="<%=new Date() %>">
     		aaaaaa
    </com:demo1>
     
     
  • ラベル制御ページを使用するロジックケース
  • 盗難防止チェーンラベルの開発|開発ラベル|開発ラベル|開発反復ラベル|開発htmlエスケープラベル|パッケージラベルライブラリ