JavaWeb_JSP_カスタムラベル


本博文は子墨オリジナルで、転載は出典を明記してください!
http://blog.csdn.net/zimo2013/article/details/9101981
1.カスタムラベル
役割:カスタムラベルJspページのjavaコードを削除する
ラベルを完成するには、(1)を満たす必要がある.ラベル関連クラスを継承するjavaクラス(2).ラベルライブラリ記述子tld(Tag Library Descriptor)ファイルを作成し、tldファイルでラベルプロセッサクラスをラベルとして記述します.        (3).appのwebを構成します.xml情報(4).ページで参照
具体的なコード構成>>
2.JspTagインタフェース
ここでTagインタフェースは従来のラベルインタフェースであり、SimpleTagは単純なインタフェースであり、従来のラベルのすべての機能を完成することができる.
  JavaWeb_JSP_自定义标签_第1张图片
3.SimpleTagインタフェースSimpleTagインタフェースはJSP 2である.0に追加されたラベルインタフェース.従来のラベルは3つのラベルインタフェースを用いて異なる機能を完成するため、煩雑すぎて、ラベル技術の普及に不利である.SimpleTagSupportはSimpleTagインタフェースの実装クラスであり、ラベルロジックを処理するためのdoTagメソッドのみを定義している.    (1).ライフサイクル(LifeCycle)1).ラベルプロセッサクラスのインスタンスオブジェクトを作成します.        2).setJspContext()を呼び出し、この方法で暗黙的なオブジェクトを得ることができます.        3).親ラベルが存在する場合はsetParent()を呼び出します.        4).呼び出しラベルに属性が設定されている場合、各属性に対応するsetterメソッドを呼び出し、属性値をオブジェクトに渡す.        5).ラベルボディが存在する場合、setJspBody()を呼び出してラベルボディを表すJspFragmentオブジェクトを渡す.        6).ラベルを実行するとき、コンテナはラベルプロセッサのdoTag()メソッドを呼び出す.    (2).toTag()pageの後ろのページが出力された場合、直接throw new SkipPageException()ラベルボディ情報を出力場合は、この.getJspBody().invoke(null);ここでinvokeは、ラベル体の情報をinvokeが受信ストリームオブジェクトに書き込む役割を果たし、nullはデフォルトでthisである.getJspContext().getOut()     (3).取得ラベル体情報は直接取得することはできない、1つのストリームオブジェクトをinvoke()してからストリームオブジェクトから読み出す必要があり、従来のラベルは直接thisを通過することができる.bodyContent.getString()取得
public void doTag() throws JspException, IOException {
		StringWriter sw = new StringWriter();		//    StringWriter,         
		this.getJspBody().invoke(sw);			//           ,   null       
		String str = sw.toString().toUpperCase();	//sw.toString()              
		this.getJspContext().getOut().write(str);	//         JspWriter    
	}

4.Tagインタフェース(1).ライフサイクル(LifeCycle)1).ラベルプロセッサクラスのインスタンスオブジェクトを作成します.        2).setPageContextメソッドを呼び出してJSPページのpageContextオブジェクトをラベルプロセッサに渡す.        3).setParentメソッドを呼び出して、現在のラベルの親ラベルを現在のラベルプロセッサに渡し、存在しない場合nullを返します.        4).ラベルプロセッサのdoStartTag()を呼び出す.        5).doEndTag()を呼び出します.        6).通常、WEBコンテナがカスタムラベルを実行すると、ラベルプロセッサはメモリに存在し、Webアプリケーションが停止するまで他のリクエストサービスに対してreleaseメソッドが呼び出されます.    (2).戻り値の説明
JavaWeb_JSP_自定义标签_第2张图片
 
    (3).EVAL_BODY_BUFFEREDの特別説明doStartTag()はEVALを返しますBODY_BUFFERED,暗黙操作(BodyContentオブジェクトの作成,setBodyContent()の呼び出し,BodyContentオブジェクトへの書き込み)は,この.bodyContent.getString()は、ラベルボディの文字列情報を直接取得します.EVALに戻っていませんBODY_BUFFEREDでは、BodyContentオブジェクトは作成されません.
public int doEndTag() throws JspException {
		String str = this.bodyContent.getString().toUpperCase();//        ,doStartTag()    EVAL_BODY_BUFFERED
		try {
			this.pageContext.getOut().write(str);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return super.doEndTag();
	}

 
5.tld
<tag>
	<name>simpleEnd</name> <!--      -->
	<tag-class>com.baidu.web.tag.SimpleEnd</tag-class><!--      java ,     -->
	<body-content>empty</body-content> <!--    ,empty(         ),JSP(    ),scriptles(      ) -->
	<attribute>
	<name>flag</name>  <!--    ,      -->
		<required>true</required> <!--           -->
		<rtexprvalue>true</rtexprvalue> <!--       el    -->
		<!-- <type>java.lang.Integer</type>      -->
	</attribute>
</tag>

 
SimpleTagSupportの関連操作コード
	//       
	public void doTag() throws JspException, IOException {
		StringWriter sw = new StringWriter();		//    StringWriter,         
		this.getJspBody().invoke(sw);				//           ,   null       
		String str = sw.toString().toUpperCase();	//sw.toString()              
		this.getJspContext().getOut().write(str);	//         JspWriter    
	}
	//       page     
	public void doTag() throws JspException, IOException {
		if(flag){
			throw new SkipPageException();	//   ,        
		}
	}
	//          
	public void doTag() throws JspException, IOException {
		for(int i=0; i<count; i++){
			this.getJspBody().invoke(null);
		}
	}
	//           
	public void doTag() throws JspException, IOException {
		if(flag){
			this.getJspBody().invoke(null);
		}
	}

TagSupportの関連操作コード
	//       
	public int doStartTag() throws JspException {
		return EVAL_BODY_BUFFERED;
	}
	public int doEndTag() throws JspException {
		String str = this.bodyContent.getString().toUpperCase();//        ,doStartTag()    EVAL_BODY_BUFFERED
		try {
			this.pageContext.getOut().write(str);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return super.doEndTag();
	}
	
	//          
	public int doStartTag() throws JspException {
		return EVAL_BODY_INCLUDE;
	}
	public int doAfterBody() throws JspException {
		count--;
		if(count > 0){
			return EVAL_BODY_AGAIN;
		}
		return SKIP_BODY;
	}
	
	//       page     
	public int doEndTag() throws JspException {
		if(flag){
			return SKIP_PAGE;
		}
		return EVAL_PAGE;
	}
	
	//           
	if(!flag){
		return SKIP_BODY;
	}
	return EVAL_BODY_INCLUDE;