四、编写有标签体的标签

需要返回TagSupport.EVAL_BODY_INCLUDE,则可以进入标签体;

AttributeTag.java

package org.tagext;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;public class AttributeTag extends TagSupport{private String name;public String getName(){return name;}public void setName(String name){this.name = name;}public int doStartTag()throws JspException{Object value = null;value = super.pageContext.getAttribute(name,PageContext.PAGE_SCOPE);if(value==null){return TagSupport.SKIP_BODY;}else{return TagSupport.EVAL_BODY_INCLUDE;}}
}

xiazdong.tld

    <tag><name>attribute</name><tag-class>org.tagext.AttributeTag</tag-class><body-content>JSP</body-content><attribute><name>name</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>

AttributeTag.jsp

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ taglib prefix="xiazdong" uri="xiazdong"%>
<html><head><title></title></head><body><%pageContext.setAttribute("xiazdong","12345");%><h1><xiazdong:attribute name="xiazdong"><h3>${pageScope.xiazdong}</h3></xiazdong:attribute></h1></body>
</html>

五、迭代标签


迭代标签的定义就是重复执行标签体,经常用在输出集合;在MVC中经常使用;

代码实例:


一些变化不大的文件我就不写了;

IterateTag.java

package org.tagext;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.util.*;
public class IterateTag extends TagSupport{private String name;private String id;private Iterator<String> iter;public String getName(){return name;}public void setName(String name){this.name = name;}public String getId(){return id;}public void setId(String id){this.id = id;}public int doStartTag()throws JspException{Object value = null;value = super.pageContext.getAttribute(name,PageContext.PAGE_SCOPE);if(value==null||!(value instanceof List<?>)){return TagSupport.SKIP_BODY;}else{iter = ((List<String>)value).iterator();if(iter.hasNext()){super.pageContext.setAttribute(id,iter.next());return TagSupport.EVAL_BODY_INCLUDE;}else{return TagSupport.SKIP_BODY;}}}public int doAfterBody()throws JspException{if(iter.hasNext()){super.pageContext.setAttribute(id,iter.next());return TagSupport.EVAL_BODY_AGAIN;}else{return TagSupport.SKIP_BODY;}}
}

IterateTag.jsp

<%@ page contentType="text/html" pageEncoding="GBK" import="java.util.*"%>
<%@ taglib prefix="xiazdong" uri="xiazdong"%>
<html><head><title></title></head><body><%List<String> list = new ArrayList<String>();list.add("A");list.add("B");list.add("C");pageContext.setAttribute("xiazdong",list);%><h1><xiazdong:iterate name="xiazdong" id="iter"><h3>${iter}</h3></xiazdong:iterate></h1></body>
</html>

六、BodyTagSupport类

BodyTagSupport的特点就是可以将输出内容存在BodyContent中, 一次全部输出;

根据上面的迭代输出的代码,稍微变化即可,主要变化是在IterateTag.java中,需要extends BodyTagSupport;

BodyTagSupport的常用方法:

(1)BodyTagSupport.EVAL_BODY_BUFFERED;

(2)getPreviousOut();      //获得输出到网页的输出流

(3)bodyContent对象存储数据;

package org.tagext;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.util.*;
public class IterateTag extends BodyTagSupport{private String name;private String id;private Iterator<String> iter;public String getName(){return name;}public void setName(String name){this.name = name;}public String getId(){return id;}public void setId(String id){this.id = id;}public int doStartTag()throws JspException{Object value = null;value = super.pageContext.getAttribute(name,PageContext.PAGE_SCOPE);if(value==null||!(value instanceof List<?>)){return TagSupport.SKIP_BODY;}else{iter = ((List<String>)value).iterator();if(iter.hasNext()){super.pageContext.setAttribute(id,iter.next());return TagSupport.EVAL_BODY_BUFFERED;    //存在BodyContent中}else{return TagSupport.SKIP_BODY;}}}public int doAfterBody()throws JspException{if(iter.hasNext()){super.pageContext.setAttribute(id,iter.next());return TagSupport.EVAL_BODY_AGAIN;}else{return TagSupport.SKIP_BODY;}}public int doEndTag()throws JspException{if(super.bodyContent!=null){try{super.bodyContent.writeOut(super.getPreviousOut());    //输出到页面}catch(Exception e){}}return BodyTagSupport.EVAL_PAGE;}
}

七、TagExtraInfo和VariableInfo的使用

在<jsp:useBean id = "">中的id属性表示对象名称,并且可以通过这个名称调用方法;而如果要实现这种效果,必须继承TagExtraInfo类;

我们需要另外创建一个文件,用以表明属性的对象能够在脚本中使用;

MyExtraInfo.java

package org.tag;
import javax.servlet.jsp.tagext.*;
public class MyTagExtraInfo extends TagExtraInfo{public VariableInfo[] getVariableInfo(TagData data){return new VariableInfo[]{new VariableInfo(data.getId(),"java.lang.String",true,VariableInfo.NESTED)};}
}

写完后在xiazdong.tld中添加:

   <tei-class>           //注意org.tag.MyTagExtraInfo</tei-class>

最后xiazdong.tld中以:

<tag><name>iterate</name><tag-class>org.tagext.IterateTag</tag-class><body-content>JSP</body-content><tei-class>           //注意org.tag.MyTagExtraInfo</tei-class><attribute><name>name</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>id</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>

这样在JSP中就能够在Scriptlet中使用;

<%@ page contentType="text/html" pageEncoding="GBK" import="java.util.*"%>
<%@ taglib prefix="xiazdong" uri="xiazdong"%>
<html><head><title></title></head><body><%List<String> list = new ArrayList<String>();list.add("A");list.add("B");list.add("C");pageContext.setAttribute("xiazdong",list);%><h1><xiazdong:iterate name="xiazdong" id="iter"><h3><%=iter%></h3>     //注意,原本是${iter}输出;</xiazdong:iterate></h1></body>
</html>

转载于:https://www.cnblogs.com/xiazdong/archive/2011/11/17/3058120.html

JSP自定义标签(2)相关推荐

  1. jsp自定义标签学习

    简单的说明: 1,说明---jsp自定义标签: HelloWorld:jsp自定义标签的使用流程: QueryTag:带属性标签的定义以及连接数据库使用: IteratorTag:带标签体的标签定义以 ...

  2. 如何使用jsp自定义标签 JspTag 使用入门

    java开发中,sturts标签和c标签就是我们常用的两种标签,本文主要教大家如何定义自己的标签,已达到代码整合,公共化的目的.通过jsp自定义标签,可以将一个元素,或者一个表格,一个div甚至整个页 ...

  3. 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门

    javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...

  4. JSP自定义标签学习笔记

    http://blog.csdn.net/liangbinny/article/details/6309893 本文是本人学习<JavaWeb学习>书籍所记下的学习笔记 一.概述 JSP ...

  5. JSP自定义标签开发入门

    一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...

  6. html模板(base标签,meta标签,禁用浏览器缓存)+JSP自定义标签荔枝

    [1]html模板 <html> <head><!-- base标签表示uri相对路径的基准路径 --><base href="http://loc ...

  7. jsp自定义标签(taglib)编写的原理和实现

    jsp自定义标签(taglib)编写的原理和实现 转:http://www.javaeye.com/topic/157737 个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupp ...

  8. 浅谈JSP自定义标签实现过程

    (一) 没有正文的JSP自定义标签实现 (1):定义JSP自定义标签处理类 import java.io.IOException; import java.util.Date; import java ...

  9. JSP自定义标签详解(1)

    JSP自定义标签 自定义JSP标签概述 自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似的 ...

  10. jsp自定义标签的问题Unable to load tag handler class

    本人在做jsp自定义标签的时候,报错: Unable to load tag handler class 后面找到原因是:在eclipse开发中,之前替换了一个jar包,原来的jar在下面视图中报红叉 ...

最新文章

  1. 智源大会“人工智能伦理、治理与可持续发展论坛”超5000人线上参会,专家敦促全球多边协作...
  2. 【SmartJob】启动问题查询
  3. java sl4j 日志_Java日志框架Slf4j+Log4j入门
  4. sql datetime比较大小_SQL做题小技巧
  5. 我做的百度飞桨PaddleOCR .NET调用库
  6. ABAP 数值四舍五入函数
  7. python的接口实现zope.interface示例
  8. python网络爬虫 爬取新闻标题、时间、内容
  9. 开课吧课堂-Java面试题:面向对象的特征有哪些方面?
  10. LOJ10092半连通子图
  11. 《libGDX移动游戏开发从入门到精通》一1.5 其他的一些准备工作
  12. 国科大-2019-2020年,黄庆明模式识别与机器学习作业答案(黄庆明,常虹,郭嘉丰,山世光)
  13. 教你快速设计正交试验及试验数据分析
  14. ApacheCN 翻译/校对/笔记整理活动进度公告 2019.9.13
  15. 这家机场扶梯安装“智能管家”,扶梯消毒仪现高招,绝了!
  16. 如果Iphone被偷了,能找回来吗?
  17. S32k Flexcan 手写驱动,不使用SDK
  18. filebeat k8s健康探针
  19. vi与gedit的区别
  20. echarts rich设置动态图片/动态数据;echarts 人均收入柱状图 window系统显示不出国旗;echarts动态rich

热门文章

  1. Qt5.x解决报错main.cpp:1:10: fatal error: QApplication: No such file or directory问题
  2. 如何在R中使用range()?
  3. Python字符串isalnum()
  4. kotlin 对话框_使用Kotlin的Android警报对话框
  5. 应用程式中夜间模式的Android DayNight主题
  6. 如何在Windows即服务上安装Memcached Server
  7. centos(7.0) 上 crontab 计划任务
  8. oracle 体系结构初步认识(一)
  9. Bind服务简单应用之一(介绍)
  10. 博科:物理与虚拟网络的统一管理