自定义标签&简单标签

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.20\webapps\examples\WEB-INF\jsp2\jsp2-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规范定义的通信规则依次调用它的方法。

 

  1. public void setPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信。
  2. public void setParent(Tag t),setPageContext方法执行完后,WEB容器接着调用的setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null。
  3. public int doStartTag(),调用了setPageContext方法和setParent方法之后,WEB容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法。
  4. public int doEndTag(),WEB容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,WEB容器会去调用标签处理器的doEndTag方法。
  5. public void release(),通常WEB容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务器,直至停止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>
 

 

  • 使用标签控制页面逻辑案例
开发防盗链标签|开发<c:if>标签|开发<c:if><c:else>标签|开发迭代标签|开发html转义标签|打包标签库

 

你可能感兴趣的:(自定义标签)