【自定义标签开发】04-简单标签库功能详解

我们回顾一下jsp的Tag自定义标签技术


我们的SimpleTag接口可以实现左边3种接口的功能。
这个接口的默认实现类是SimpleSupport。

接口中的方法有:
doTag()//标签开始和结束都是在这个方法中定义,标签体是setJspBody方法中的JspFragment对象。
可以抛出SkipPageException,就相当于返回了“SKIP_PAGE”,余下的jsp内容就不再执行了。

getParent()//得到父标签对象

setJspBody(JspFragment jspBody)//服务器在调用你的标签前,会将标签作为一个JspFragment对象传送过来。

setJspContext(JspContext pc)//获得JspContext(JspContext继承了PageContext)

setParent()//设置父标签对象


我们下面举一些例子来测试。
1.隐藏页面信息
我们仍然要借助标签来隐藏我们的页面信息:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib 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>

我们重启Web工程,测试页面:

这是可以看到标签体内容的。
如果不想显示的话,更简单,获得标签体的时候什么也不做就行了:
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项目测试,访问后发现信息不见了:
【自定义标签开发】04-简单标签库功能详解_第1张图片
简单Tag就是那么简单o(^▽^)o

2.用简单标签迭代标签体
我们让“嘻嘻嘻,好犀利(*^__^*)”执行5遍
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib 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>

然后创建并标签类:
【自定义标签开发】04-简单标签库功能详解_第2张图片
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>

重启Web工程测试:
【自定义标签开发】04-简单标签库功能详解_第3张图片
测试成功!

3.用简单标签修改标签体
让标签体文字变大写:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib 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>

重启Web工程测试:
【自定义标签开发】04-简单标签库功能详解_第4张图片
测试成功!

4.用简单标签控制jsp页面的显示
前端标签效果:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib 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>

重启Web工程测试:

可以看到</head>之后的代码没有显示,测试成功!

最后总结一下简单标签的执行流程:

【自定义标签开发】04-简单标签库功能详解_第5张图片

转载请注明出处:http://blog.csdn.net/acmman/article/details/51093287

你可能感兴趣的:(标签,tag,库)