JSP自定义标签(2)
四、编写有标签体的标签
需要返回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)相关推荐
- jsp自定义标签学习
简单的说明: 1,说明---jsp自定义标签: HelloWorld:jsp自定义标签的使用流程: QueryTag:带属性标签的定义以及连接数据库使用: IteratorTag:带标签体的标签定义以 ...
- 如何使用jsp自定义标签 JspTag 使用入门
java开发中,sturts标签和c标签就是我们常用的两种标签,本文主要教大家如何定义自己的标签,已达到代码整合,公共化的目的.通过jsp自定义标签,可以将一个元素,或者一个表格,一个div甚至整个页 ...
- 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门
javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...
- JSP自定义标签学习笔记
http://blog.csdn.net/liangbinny/article/details/6309893 本文是本人学习<JavaWeb学习>书籍所记下的学习笔记 一.概述 JSP ...
- JSP自定义标签开发入门
一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...
- html模板(base标签,meta标签,禁用浏览器缓存)+JSP自定义标签荔枝
[1]html模板 <html> <head><!-- base标签表示uri相对路径的基准路径 --><base href="http://loc ...
- jsp自定义标签(taglib)编写的原理和实现
jsp自定义标签(taglib)编写的原理和实现 转:http://www.javaeye.com/topic/157737 个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupp ...
- 浅谈JSP自定义标签实现过程
(一) 没有正文的JSP自定义标签实现 (1):定义JSP自定义标签处理类 import java.io.IOException; import java.util.Date; import java ...
- JSP自定义标签详解(1)
JSP自定义标签 自定义JSP标签概述 自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似的 ...
- jsp自定义标签的问题Unable to load tag handler class
本人在做jsp自定义标签的时候,报错: Unable to load tag handler class 后面找到原因是:在eclipse开发中,之前替换了一个jar包,原来的jar在下面视图中报红叉 ...
最新文章
- 智源大会“人工智能伦理、治理与可持续发展论坛”超5000人线上参会,专家敦促全球多边协作...
- 【SmartJob】启动问题查询
- java sl4j 日志_Java日志框架Slf4j+Log4j入门
- sql datetime比较大小_SQL做题小技巧
- 我做的百度飞桨PaddleOCR .NET调用库
- ABAP 数值四舍五入函数
- python的接口实现zope.interface示例
- python网络爬虫 爬取新闻标题、时间、内容
- 开课吧课堂-Java面试题:面向对象的特征有哪些方面?
- LOJ10092半连通子图
- 《libGDX移动游戏开发从入门到精通》一1.5 其他的一些准备工作
- 国科大-2019-2020年,黄庆明模式识别与机器学习作业答案(黄庆明,常虹,郭嘉丰,山世光)
- 教你快速设计正交试验及试验数据分析
- ApacheCN 翻译/校对/笔记整理活动进度公告 2019.9.13
- 这家机场扶梯安装“智能管家”,扶梯消毒仪现高招,绝了!
- 如果Iphone被偷了,能找回来吗?
- S32k Flexcan 手写驱动,不使用SDK
- filebeat k8s健康探针
- vi与gedit的区别
- echarts rich设置动态图片/动态数据;echarts 人均收入柱状图 window系统显示不出国旗;echarts动态rich
热门文章
- Qt5.x解决报错main.cpp:1:10: fatal error: QApplication: No such file or directory问题
- 如何在R中使用range()?
- Python字符串isalnum()
- kotlin 对话框_使用Kotlin的Android警报对话框
- 应用程式中夜间模式的Android DayNight主题
- 如何在Windows即服务上安装Memcached Server
- centos(7.0) 上 crontab 计划任务
- oracle 体系结构初步认识(一)
- Bind服务简单应用之一(介绍)
- 博科:物理与虚拟网络的统一管理