1. 程式人生 > >【自己定義標簽開發】04-簡單標簽庫功能具體解釋

【自己定義標簽開發】04-簡單標簽庫功能具體解釋

xtend 循環 輸出標簽 都是 sim 目錄 article abc ng-

我們回想一下jsp的Tag自己定義標簽技術
技術分享

我們的SimpleTag接口能夠實現左邊3種接口的功能。


這個接口的默認實現類是SimpleSupport。

接口中的方法有:
doTag()//標簽開始和結束都是在這種方法中定義。標簽體是setJspBody方法中的JspFragment對象。
能夠拋出SkipPageException。就相當於返回了“SKIP_PAGE”。余下的jsp內容就不再運行了。



getParent()//得到父標簽對象

setJspBody(JspFragment jspBody)//server在調用你的標簽前。會將標簽作為一個JspFragment對象傳送過來。

setJspContext(JspContext pc)//獲得JspContext(JspContext繼承了PageContext)

setParent()//設置父標簽對象



我們以下舉一些樣例來測試。
1.隱藏頁面信息
我們仍然要借助標簽來隱藏我們的頁面信息:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<[email protected] uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用簡單標簽控制是否運行標簽體</title>
  </head>
  
  <body>
  
     <zyg2:heddin>
         Helloworld。
     </zyg2:heddin>
  </body>
  
</html>

著手使用SimpleTag來實現這個<zyg2:heddin>標簽。首先創建該標簽類。繼承了SimpleTagSupport:
技術分享

接下來實現doTag()方法:
package org.zyg.web.simpletag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//控制標簽體是否運行
public class HeddinSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到標簽體對象
		jf.invoke(this.getJspContext().getOut());//控制標簽體運行:輸出標簽體


	}
}
我們這裏選擇了先輸出標簽體。

然後在WEB-INF下的lib目錄中創建zygSimple.tld文件,並註冊標簽:
<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>2.0</tlib-version>
    <short-name>zyg2</short-name>
    <uri>h/simpleTag</uri><!-- 標簽綁定的uri。用於引入 -->
    
    
    <tag>
        <name>heddin</name><!-- 標簽名 -->
		<tag-class>org.zyg.web.simpletag.HeddinSimpleTag</tag-class>
		<body-content>scriptless</body-content><!-- 有無標簽體(單標簽還是成對標簽) -->
    </tag>
  
</taglib>

我們重新啟動Webproject,測試頁面:
技術分享
這是能夠看到標簽體內容的。


假設不想顯示的話。更簡單,獲得標簽體的時候什麽也不做即可了:

package org.zyg.web.simpletag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//控制標簽體是否運行
public class HeddinSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到標簽體對象
	}
}

重新啟動Web項目測試,訪問後發現信息不見了:
技術分享
簡單Tag就是那麽簡單o(^▽^)o

2.用簡單標簽叠代標簽體
我們讓“嘻嘻嘻。好犀利(*^__^*)”運行5遍
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<[email protected] uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用簡單標簽循環標簽體</title>
  </head>
  
  <body>
  
     <zyg2:repeat>
        嘻嘻嘻,好犀利(*^__^*) <br/>
     </zyg2:repeat>
  </body>
  
</html>

然後創建並標簽類:
技術分享
package org.zyg.web.simpletag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class RepeatSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到標簽體對象
		for (int i = 0; i < 5; i++) {
			jf.invoke(this.getJspContext().getOut());
		}
	}
}

然後在zygSimple.tld中註冊這個標簽:
<tag>
    <name>repeat</name><!-- 標簽名 -->
	<tag-class>org.zyg.web.simpletag.RepeatSimpleTag</tag-class>
	<body-content>scriptless</body-content><!-- 有無標簽體(單標簽還是成對標簽) -->
</tag>

重新啟動Webproject測試:
技術分享
測試成功。

3.用簡單標簽改動標簽體
讓標簽體文字變大寫:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<[email protected] uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用簡單標簽循環標簽體</title>
  </head>
  
  <body>
  
     <zyg2:upper>
       	   abcdefg <br/>
     </zyg2:upper>
  </body>
  
</html>

以下來實現<zyg2:upper>標簽。


創建並編輯標簽處理類:
技術分享

package org.zyg.web.simpletag;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//改動標簽體
public class UpperSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		JspFragment jf=this.getJspBody();//拿到標簽體對象
		StringWriter sw=new StringWriter();
		jf.invoke(sw);//運行一個帶緩沖的Writer
		
		String content=sw.toString();//獲得標簽體的內容
		content = content.toUpperCase();//將內容變為大寫
		
		this.getJspContext().getOut().write(content);
	}
	
}

然後在zygSimple.tld中註冊這個標簽:
<tag>
    <name>upper</name><!-- 標簽名 -->
    <tag-class>org.zyg.web.simpletag.UpperSimpleTag</tag-class>
    <body-content>scriptless</body-content><!-- 有無標簽體(單標簽還是成對標簽) -->
</tag>

重新啟動Webproject測試:
技術分享
測試成功!

4.用簡單標簽控制jsp頁面的顯示
前端標簽效果:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<[email protected] uri="/simpleTag" prefix="zyg2" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用簡單標簽控制jsp頁面的顯示</title>
  </head>
  
  <zyg2:heddinPage/>
  
  <body> 
   
  	  Hello ! 
      
  </body>
  
</html>

以下來實現<zyg2:heddinPage/>標簽。


創建並編輯標簽處理類:
技術分享

package org.zyg.web.simpletag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

//控制標簽余下的jsp不運行
public class HeddinPageSimpleTag extends SimpleTagSupport {

	@Override
	public void doTag() throws JspException, IOException {
		//僅僅要這個異常拋給jsp。該標簽以下的jsp代碼就不會運行
		throw new SkipPageException();
	}
	
}

然後在zygSimple.tld中註冊這個標簽:
<tag>
    <name>heddinPage</name><!-- 標簽名 -->
    <tag-class>org.zyg.web.simpletag.HeddinPageSimpleTag</tag-class>
    <body-content>empty</body-content><!-- 有無標簽體(單標簽還是成對標簽) -->
</tag>

重新啟動Webproject測試:
技術分享
能夠看到</head>之後的代碼沒有顯示,測試成功!

最後總結一下簡單標簽的運行流程:

技術分享

轉載請註明出處:http://blog.csdn.net/acmman/article/details/51093287

【自己定義標簽開發】04-簡單標簽庫功能具體解釋