美文网首页
自定义标签的扩展

自定义标签的扩展

作者: 基本密码宋 | 来源:发表于2017-07-06 22:17 被阅读13次
    • 控制jsp页面某一部分内容是否执行。

    编写一个类实习Tag接口,控制 doStartTag()方法的返回值。如果返回 Tag.EVAL_BODY_INCLUDE 是执行标签体。反之返回Tag.SKIP_BODY是不执行标签体内的代码。

    /**
     * 控制 jsp 页面中某一部分代码是否执行
     */
    public class Demo1 implements Tag {
    
        @Override
        public int doEndTag() throws JspException {
             
            return 0;
        }
    
        @Override
        public int doStartTag() throws JspException {
             
              return Tag.SKIP_BODY;//不执行标签体
    //      return Tag.EVAL_BODY_INCLUDE;//执行标签体
        }
    
        @Override
        public Tag getParent() {
             
            return null;
        }
    
        @Override
        public void release() {
             
    
        }
    
        @Override
        public void setPageContext(PageContext arg0) {
         
    
        }
    
        @Override
        public void setParent(Tag arg0) {
        }
    
    }
    
    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@taglib uri="/jeno" prefix="jeno"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>控制标签体是否执行</title>
    </head>
    <body>
            <jeno:Demo1>
                 看看执行了吗?
            </jeno:Demo1> 
    </body>
    </html>
    
    • 控制整个jsp页面是否执行。

    编写一个类实现Tag接口。控制 doEndTag();如果返回Tag.EVAL_PAGE则执行余下的 jsp代码 。反之返回Tag.SKIP_PAGE则不执行余下的jsp代码。

    /**
     * 控制整个 Jsp 界面是否执行
     *
     */
    public class Demo2 implements Tag {
    
        @Override
        public int doEndTag() throws JspException {
             
    //      return Tag.SKIP_PAGE;//不执行余下的jsp代码
                return Tag.EVAL_PAGE;//执行余下的 jsp代码 
        }
    
        @Override
        public int doStartTag() throws JspException {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public Tag getParent() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public void release() {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void setPageContext(PageContext arg0) {
            // TODO Auto-generated method stub
    
        }
    
        @Override
        public void setParent(Tag arg0) {
            // TODO Auto-generated method stub
    
        }
    
    }
    
    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@taglib uri="/jeno" prefix="jeno"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>控制整个jsp页面是否执行</title>
    </head>
    <jeno:Demo2/>
    <body>
             整个界面是否执行了呢?
             
    </body>
    </html>
    
    • 控制jsp页面内容重复执行。

    编写一个类实现IterationTag()接口。控制doAfterBody()的返回值。返回EVAL_BODY_AGAIN为执行一次。返回SKIP_BODY为终止重复执行。

    也可以 继承 extends TagSupport 进行操作返回值

    public class Demo3 implements IterationTag{
            
        private int index=0;
        @Override
        public int doEndTag() throws JspException {
            // TODO Auto-generated method stub
            return 0;
        }
    
        @Override
        public int doStartTag() throws JspException {
            // TODO Auto-generated method stub
            return Tag.EVAL_BODY_INCLUDE;//执行标签体
        }
    
        @Override
        public Tag getParent() {
            // TODO Auto-generated method stub
            return null;
        }
    
        @Override
        public void release() {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void setPageContext(PageContext arg0) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public void setParent(Tag arg0) {
            // TODO Auto-generated method stub
            
        }
    
        @Override
        public int doAfterBody() throws JspException {
            index++;
            if (index==8) {
                return IterationTag.SKIP_BODY; //返回这个将终止
            }else
             return IterationTag.EVAL_BODY_AGAIN;//返回一次,执行一次标签体
            
        }
    
    }
    
    
    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@taglib uri="/jeno" prefix="jeno"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>控制jsp页面内容重复执行。</title>
    </head>
     
    <body>
             
             <jeno:Demo3>
                  看看执行了多少次 <br>
             </jeno:Demo3>
    </body>
    </html>
    
    • 修改jsp页面内容输出。

    编写一个类继承 BodyTagSupport 类。控制 doStartTag()的返回值。返回** BodyTag.EVAL_BODY_BUFFERED** 则web服务器会创建 bodycontent对象并捕获标签体。我们可以在doEndTag()方法中拿到标签体的内容。

    public class Demo4 extends BodyTagSupport {
     
        //bodycontent
            @Override
            public int doStartTag() throws JspException {
                return BodyTag.EVAL_BODY_BUFFERED;
            }
            
            @Override
            public int doEndTag() throws JspException {
                //拿到标签体
                String content = this.getBodyContent().getString();
                String result = content.toUpperCase();
                try {
                    this.pageContext.getOut().write(result);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                return Tag.EVAL_PAGE;
            }
    
            
    }
    
    
    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <%@taglib uri="/jeno" prefix="jeno"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>得到标签体内的数据</title>
    </head>
     
    <body>
             <jeno:Demo4>
                 jeno_jibenmima
             </jeno:Demo4>
    </body>
    </html>
    

    最后是 .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>SimpleTagLibrary</short-name>
        <uri>/jeno</uri>
        
        
         <tag>
            <name>viewIP</name> <!-- 为标签处理器类配一个标签名 -->
            <tag-class>jeno.com.tld.ViewIPTag</tag-class>
            <body-content>empty</body-content>
        </tag>
        
        
         <tag>
            <name>Demo1</name> <!-- 为标签处理器类配一个标签名 -->
            <tag-class>jeno.com.tld.Demo1</tag-class>
            <body-content>JSP</body-content>
        </tag>
        
        
        <tag>
            <name>Demo2</name> <!-- 为标签处理器类配一个标签名 -->
            <tag-class>jeno.com.tld.Demo2</tag-class>
            <body-content>JSP</body-content>
        </tag>
        
         <tag>
            <name>Demo3</name> <!-- 为标签处理器类配一个标签名 -->
            <tag-class>jeno.com.tld.Demo3</tag-class>
            <body-content>JSP</body-content>
        </tag>
        
          <tag>
            <name>Demo4</name> <!-- 为标签处理器类配一个标签名 -->
            <tag-class>jeno.com.tld.Demo4</tag-class>
            <body-content>JSP</body-content>
        </tag>
    </taglib>
    

    相关文章

      网友评论

          本文标题:自定义标签的扩展

          本文链接:https://www.haomeiwen.com/subject/odjzcxtx.html