• 传统标签的使用


    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方法。

    开发人员在编写Jsp页面时,经常还需要在页面中引入一些逻辑,例如:
    1:控制jsp页面某一部分内容是否执行。
    2:控制整个jsp页面是否执行。
    3:控制jsp页面内容重复执行。
    4:修改jsp页面内容输出。
    自定义标签除了可以移除jsp页面java代码外,它也可以实现以上功能。

    tld文件中的四种标签体类型
    EMPTY JSP scriptless tagdepentend

    1:控制jsp页面某一部分内容是否执行。

    public class TagDemo1 extends TagSupport {
    
    	@Override
    	public int doStartTag() throws JspException {
    		return Tag.EVAL_BODY_INCLUDE; //控制标签内容显示
    //		return Tag.SKIP_BODY;   ////控制标签内容不显示
    	}
    }
    

     

     <tag>
            <name>demo1</name>
            <tag-class>cn.gbx.web.tag.TagDemo1</tag-class>
            <body-content>JSP</body-content>
        </tag>
    

      

    2:控制整个jsp页面是否执行。

    public class TagDemo2 extends TagSupport {
    	@Override
    	public int doEndTag() throws JspException {
    		return Tag.SKIP_PAGE; // 控制余下的jsp是否执行    Tag.EVAL_PAGE 执行
    	}
    
    }
    
    <tag>
            <name>demo2</name>
            <tag-class>cn.gbx.web.tag.TagDemo2</tag-class>
            <body-content>empty</body-content>
        </tag>
    

      

    3:控制jsp页面内容重复执行。

    public class TagDemo3 extends TagSupport{
    
    	private int x = 5;
    	@Override
    	public int doStartTag() throws JspException {
    		return Tag.EVAL_BODY_INCLUDE;
    	}
    	@Override
    	public int doAfterBody() throws JspException {
    		x--;
    		if (x > 0) {
    			return IterationTag.EVAL_BODY_AGAIN;
    		} else {
    			return IterationTag.SKIP_BODY;
    		}
    	}
    }
    
     <tag>
            <name>demo3</name>
            <tag-class>cn.gbx.web.tag.TagDemo3</tag-class>
            <body-content>JSP</body-content>
        </tag>
    

      

    4:修改jsp页面内容输出。

    public class TagDemo4 extends BodyTagSupport {
    
    	@Override
    	public int doStartTag() throws JspException {
    		return BodyTag.EVAL_BODY_BUFFERED;  //标志的setBodyContent的执行, 然后我们就能够获得标签体的内容
    	}
    
    	@Override
    	public int doEndTag() throws JspException {
    		//获得标签体的内容
    		BodyContent bodyContent = this.getBodyContent(); 
    		String content = bodyContent.getString(); 
    		//修改
    		content = content.toUpperCase();
    		try {
    			this.pageContext.getOut().write(content);
    		} catch (IOException e) {
    			throw new RuntimeException(e);
    		}
    		return super.doEndTag();
    	}
    }
      <tag>
            <name>demo4</name>
            <tag-class>cn.gbx.web.tag.TagDemo4</tag-class>
            <body-content>JSP</body-content>
        </tag>
    

      

  • 相关阅读:
    使用 Dockerfile 定制镜像
    UVA 10298 Power Strings 字符串的幂(KMP,最小循环节)
    UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)
    LeetCode Best Time to Buy and Sell Stock 买卖股票的最佳时机 (DP)
    LeetCode Number of Islands 岛的数量(DFS,BFS)
    LeetCode Triangle 三角形(最短路)
    LeetCode Swap Nodes in Pairs 交换结点对(单链表)
    LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)
    HDU 5312 Sequence (规律题)
    LeetCode Letter Combinations of a Phone Number 电话号码组合
  • 原文地址:https://www.cnblogs.com/E-star/p/3554386.html
Copyright © 2020-2023  润新知