一、传统标签

(1)JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法。

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

empty:表示标签没有标签体

scriptless:表示标签体可以包含EL表达式和JSP的动作元素,但不能包含脚本表达式

JSP:表示标签体可以包含JSP代码

tagdependent:表示标签体由标签本身去解析处理。若指定tagdependent,那么在标签体中所写的代码将作为纯文本原封不动地传给标签处理类,而不是将执行结果传给标签处理类

(3)开发人员在编写Jsp页面时,经常还需要在页面中引入一些逻辑:

  SKIP_BODY                  隐含0:跳过了开始和结束标签之间的代码。

  EVAL_BODY_INCLUDE隐含1:将body的内容输出到存在的输出流中

  SKIP_PAGE                  隐含5:忽略剩下的页面。

  EVAL_PAGE                 隐含6:继续执行下面的页

(4)JSP 1.1和1.2规范中常用的接口主要有以下3个。

  Tag:此接口定义对于所有标签处理类都需要实现的方法。
  IterationTag:此接口扩展了Tag接口,增加了控制重复执行标签主体的方法。
  BodyTag:此接口扩展了IterationTag接口,并增加了访问和操作标签主体内容的方法。
(5)<taglib>元素是标签库描述符的根元素,它包含12个子元素,详细介绍如下。

  (1)<description>:标签库的一个文本描述。

  (2)<tlib-version>:指定标签库的版本。

  (3)<short-name>:为标签定义简短的名字,在taglib指令中可作为首选的前缀名使用。

  (4)<uri>:定义一个URI,用于唯一地标识此标签库。

  (5)<tag>:用于指定自定义标签的相关信息。

  (6)<display-name>:为标签库指定一个简短的别名。

  (7)<small-icon>:为标签库指定大小为16×16的小图标(gif或jpeg格式),该图标可在图形界面工具中显示。

  (8)<large-icon>:为标签库指定大小为32×32的大图标(gif或jpeg格式),该图标可在图形界面工具中显示。

  (9)<validator>:为标签库提供一个验证器。

  (10)<listener>:为标签库提供一个监听器。

  (11)<tag-file>:用于描述标签文件。

  (12)<function>:用于指定在表达式语言中使用的函数。

(6)案例说明

  //根据条件是否成立,决定是否执行标签体
public class TagDemo1 extends TagSupport {

@Override
    public int doStartTag() throws JspException {
        return Tag.SKIP_BODY;
    }
}

页面:
<html>
  <head>    
    <title>控制标签体是否执行</title>
  </head>
 
  <body>
 
  <hytc:demo1>
      xxxxxxxxxxxxxxx
  </hytc:demo1>
  </body>
</html>

2.忽略内容

public class TagDemo2 extends TagSupport {

@Override
    public int doEndTag() throws JspException {
        
        return Tag.SKIP_PAGE;
    }

}

页面:
<hytc:demo2></hytc:demo2>
<html>
  <head>    
    <title>用标签控制整个jsp是否执行</title>
  </head>
 
  <body>
    This is my JSP page. <br>
  </body>
</html>

3.//控制标签体重复执行10次
public class TagDemo3 extends TagSupport {

int x = 10;
    @Override
    public int doStartTag() throws JspException {
        
        return Tag.EVAL_BODY_INCLUDE;
    }

@Override
    public int doAfterBody() throws JspException {
        if(x>1){
            x--;
            return IterationTag.EVAL_BODY_AGAIN;
        }else{
            return Tag.SKIP_BODY;
        }
    }    
}
页面:
<html>
  <head>    
    <title>用标签控制页面内容重复执行</title>
  </head>
 
  <body>
   
   <hytc:demo3>
       aaaa
   </hytc:demo3>
  </body>
</html>

4.
public class TagDemo4 extends BodyTagSupport {

@Override
    public int doStartTag() throws JspException {        
        return BodyTag.EVAL_BODY_BUFFERED;
    }

@Override
    public int doEndTag() throws JspException {
        BodyContent bt = this.bodyContent;
        String content = bt.getString();
        content = content.toUpperCase();
        
        JspWriter out = this.pageContext.getOut();
        try {
            out.write(content);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return super.doEndTag();
    }
    
}

页面:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>    
    <title>修改jsp页面内容</title>
  </head>
 
  <body>
   
   <hytc:demo4>
       aaaaa
   </hytc:demo4>
   
  </body>
</html>

5.配置描述文件

  <tag>
        <name>demo1</name>
        <tag-class>web_16.tag.TagDemo1</tag-class>
        <body-content>JSP</body-content>
    </tag>
    
     <tag>
        <name>demo2</name>
        <tag-class>web_16.tag.TagDemo2</tag-class>
        <body-content>empty</body-content>
    </tag>
    
     <tag>
        <name>demo3</name>
        <tag-class>web_16.tag.TagDemo3</tag-class>
        <body-content>JSP</body-content>
    </tag>
    
    <tag>
        <name>demo4</name>
        <tag-class>web_16.tag.TagDemo4</tag-class>
        <body-content>JSP</body-content>
    </tag>

JavaWeb学习记录(十九)——jstl自定义标签库之传统标签的更多相关文章

  1. JavaWeb 自定义标签库开发传统标签

    自定义标签主要用于移除Jsp页面中的java代码. 移除jsp页面中的java代码,只需要完成两个步骤: 编写一个实现Tag接口的Java类,并覆盖doStartTag方法,把jsp页面中的java代 ...

  2. javaweb学习总结(十九)——JSP标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  3. JavaWeb学习记录(九)——Cookie的增加、删除、查看

    一.servlet功能代码: public void doGet(HttpServletRequest request, HttpServletResponse response)           ...

  4. javaweb学习总结十九(http协议概述以及http请求信息分析)

    一:http协议概述 1:http协议定义 2:使用telnet程序连接web服务器,获取资源 3:http协议:超文本传输协议,它是基于tcp/ip协议,就是建立在tcp/ip之上工作的, http ...

  5. javaweb学习总结(二十八)——JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  6. javaWeb学习总结(9)- JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  7. Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...

  8. 学习笔记:CentOS7学习之十九:Linux网络管理技术

    目录 学习笔记:CentOS7学习之十九:Linux网络管理技术 本文用于记录学习体会.心得,兼做笔记使用,方便以后复习总结.内容基本完全参考学神教育教材,图片大多取材自学神教育资料,在此非常感谢MK ...

  9. 风炫安全WEB安全学习第十九节课 XSS的漏洞基础知识和原理讲解

    风炫安全WEB安全学习第十九节课 XSS的漏洞基础知识和原理讲解 跨站脚本攻击(Cross-site scripting,通常简称为XSS) 反射型XSS原理与演示 交互的数据不会存储在数据库里,一次 ...

随机推荐

  1. 编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码

    转自:编译哈工大语言技术平台云LTP(C++)源码及LTP4J(Java)源码 JDK:java version “1.8.0_31”Java(TM) SE Runtime Environment ( ...

  2. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  3. 基于Lumisoft.NET组件的POP3邮件接收和删除操作

    From: http://www.cnblogs.com/wuhuacong/archive/2013/05/06/3063093.html Lumisoft.NET组件是一个非常强大的邮件发送.邮件 ...

  4. Xcode6中segue取消原push与modal(deprecated)

    xcode6 之后push 和modal 就被废弃了.只能用于ios8之前.在拖线的时候我们就可以看见. 这两个方法被废弃了,我们需要找到合适的方法来代替,这时候我们发现 show 和Present ...

  5. web安全测试-AppScan使用分享

    这里主要分享如何使用AppScan对一大项目的部分功能进行安全扫描. ----------------------------------------------------------------- ...

  6. A380上11万一张的机票什么享受?来看看

    上个月底,全球奢华航班排行榜出炉,新加坡航空头等舱荣登第一.不过,比头等舱更豪奢的,将近两万美元一张往返票的“套间”又是怎么样的呢? 新加坡航空的一名常旅客Derek Low就体验了一把全球最豪奢的坐 ...

  7. iphone判断当前网络连接类型

    eachability只能区分出无网络.wifi和wwan(2G&2.5G&3G)类型的网络连接类型,只需重构networkStatusForFlags方法,即可详细区分出2G与3G网 ...

  8. sql server日志不能shrink或truncate

    Backup log [dbxxx] with truncate_only sql server 2008之后不支持此操作,需要改为: BACKUP LOG dbxxx TO DISK='NUL:' ...

  9. 巧用nginx屏蔽对用户不可见的文件

    事情的起因是这样的--前端的项目中有一些.less之类的源文件,而为了方便迭代更新发布,直接就把整个工程放到了www目录下. 这样虽然方便了,但是会带来一些安全隐患——用户可以访问/盗取这些源文件. ...

  10. php源码编译常见错误解决方案

    在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support… yes ch ...