在jsp规范里,标签具有比javabean更丰富的运行时协议。它可以非常机密的和jsp的表示逻辑联系在一起,同时,又具有javabean相同业务处理能力。所以,标签的学习成为迫切的需要,但为了满足实际项目的开发,自定义标签的学习是不容错过的。
通过实现接口或者继承现有的类,我们就可以开发自定义的标签。
常用的接口有: JspTag
Tag SimpleTag<----SimpleTagSupport
IterationTag <----TagSupport
BodyTag<----BodyTagSupport
自定义标签的开发包括两个部分的开发:
(1)、开发标签的处理程序(java类)
(2)、标签描述文件(.tld文件)
自定义标签的种类有许多,可以根据实际项目的需要进行编写。但为了不重复的开发轮子,jsp标准推出JSTL(标准标签库)。
开始我们的旅行吧,只要是快乐的,谁都想干,做的好与不好就另当别论了。
(1)从Hello World开始吧,自定义一个类它实现Tag接口,Tag接口主要定义的是标签声明周期的方法,比如:doStartTag(),doEndTag()等,通过PageContext对象来访问Jsp页面的上下文:
package com.xmddl.tag.demo;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
public class HelloTag implements Tag {
private PageContext context;
private Tag parent;
public void setPageContext(PageContext ctx) {
this.context=ctx;
}
public void setParent(Tag tag) {
this.parent=tag;
}
public Tag getParent() {
return this.parent;
}
public int doStartTag() throws JspException {
System.out.println("doStartTag");
return Tag.SKIP_BODY;
}
public int doEndTag() throws JspException {
System.out.println("doStartTag");
try {
this.context.getOut().write("Hello World");
} catch (Exception e) {
e.printStackTrace();
}
return Tag.EVAL_PAGE;
}
public void release() {
// TODO Auto-generated method stub
}
}
Tag接口中静态常量:
Tag.SKIP_BODY
Tag.EVAL_PAGE
Tag.EVAL_BODY_INCLUDE
Tag.SKIP_PAGE
(2)编写标签描述文件(.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>xmddl 1.1 hello library</description>
<display-name>xmddl hello</display-name>
<tlib-version>1.1</tlib-version>
<short-name>hello</short-name>
<uri>http://www.xmddl.com/tag</uri>
<tag>
<description>我的Hello World</description>
<name>hello</name>
<tag-class>com.xmddl.tag.demo.HelloTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
(3)、在web.xml中对标签的引用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "
http://java.sun.com/dtd/web-app_2_3.dtd
">
<web-app>
<taglib>
<taglib-uri>http://www.xmddl.com/tag</taglib-uri>
<taglib-location>/WEB-INF/mytag.tld</taglib-location>
</taglib>
</web-app>
(4)、编写测试页面:
<%@ page language="java" pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://www.xmddl.com/tag" prefix="lu"%>
<html>
<head>
<title>MyJsp.jsp</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>
<body>
<h1>This is a test tag page for person.</h1> <br>
<lu:hello/>
</body>
</html>
下面看看标签中的属性是如何使用的,我们直接继承TagSupport类来编写:
package com.xmddl.tag.demo;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class HelloSupport extends TagSupport {
private String value;
private static final long serialVersionUID = 1L;
public HelloSupport(){
super();
}
public int doStartTag() throws JspException {
System.out.println("doStartTag");
return TagSupport.EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspException {
System.out.println("doEndTag");
try {
this.pageContext.getOut().write("标签的属性值:"+this.value);
} catch (Exception e) {
e.printStackTrace();
}
return Tag.EVAL_PAGE;
}
public int doAfterBody() throws JspException{
System.out.println("doAfterBody");
try {
this.pageContext.getOut().write("<br>以上为标签的内容<br>");
} catch (Exception e) {
e.printStackTrace();
}
return TagSupport.EVAL_BODY_INCLUDE;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
======================
...
<tag>
<name>hellosupport</name>
<tag-class>com.xmddl.tag.demo.HelloSupport</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
...
=======================
<%@ page language="java" pageEncoding="gb2312" import="java.util.*"%>
<%@ taglib prefix="lu" uri="
http://www.xmddl.com/tag
" %>
<html>
<head>
</head>
<body>
<h1>This is a test tag page for person.</h1> <br>
<lu:hellosupport value="red">xmddl</lu:hellosupport>
</body>
</html>
利用TagSupport带来很大的方便,只要重写其中的部分方法即可实现一个标签处理程序,以上开发的标签程序和JSTL1.1标签库一起使用时出现一些疑问,原来标签的uri=" http://java.sun.com/jsp/jstl/core ",但是,在如下的测试中会发现c:out中的值输不出来,所以,只能改为uri=" http://java.sun.com/jstl/core ",
<%@ page language="java" pageEncoding="gb2312" import="java.util.*"%>
<%@ taglib prefix="lu" uri="
http://www.xmddl.com/tag
" %>
<%@ taglib prefix="c" uri="
http://java.sun.com/jstl/core
" %>
<html>
<head>
</head>
<body>
<h1>This is a test tag page for person.</h1> <br>
<%request.setAttribute("name","xmddl"); %>
<%session.setAttribute("names","xmddls"); %>
<lu:hellosupport value="red">xmddl</lu:hellosupport><hr>
<c:forEach begin="1" end="5" step="1">
name=<c:out value="${name}"></c:out>
names=<c:out value="${names}"></c:out><br>
</c:forEach>
</body>
</html>
输出如下:
This is a test tag page for person.
xmddl
以上为标签的内容
标签的属性值:red
name=xmddl names=xmddls
name=xmddl names=xmddls
name=xmddl names=xmddls
name=xmddl names=xmddls
name=xmddl names=xmddls
接着看看迭代标签的开发,首先,我们关注的是接口IterationTag,还有它的实现类TagSupport,接口BodyTag对IterationTag的扩展,还有BodyTag的实现类BodyTagSupport。
package com.xmddl.tag.demo;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class MyIteratorSupport extends BodyTagSupport {
private static final long serialVersionUID = 1L;
public String count;
public String strColor;
private int cou;
public void setCount(String count) {
this.count = count;
cou=Integer.parseInt(count);
}
public int doAfterBody() throws JspException {
try {
this.pageContext.getOut().write("<br>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(cou>1){
cou--;
return MyIteratorTag.EVAL_BODY_AGAIN;
}else{
return MyIteratorTag.SKIP_BODY;
}
}
public int doStartTag() throws JspException {
try {
this.pageContext.getOut().write("<font color='"+this.strColor+"'>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return MyIteratorTag.EVAL_BODY_INCLUDE;
}
public int doEndTag() throws JspException {
try {
this.pageContext.getOut().write("</font>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return MyIteratorTag.EVAL_PAGE;
}
public int getCou() {
return cou;
}
public void setCou(int cou) {
this.cou = cou;
}
public String getCount() {
return count;
}
public String getStrColor() {
return strColor;
}
public void setStrColor(String strColor) {
this.strColor = strColor;
}
}
==============
。。。
<tag>
<description>对颜色的设置</description>
<name>myColor</name>
<tag-class>com.xmddl.tag.demo.MyIteratorSupport</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>count</name>
<required>true</required>
</attribute>
<attribute>
<name>strColor</name>
<required>false</required>
</attribute>
</tag>
。。。
==============
<%@ page language="java" pageEncoding="gb2312" import="java.util.*"%>
<%@ taglib prefix="lu" uri="http://www.xmddl.com/tag" %>
<html>
<head>
</head>
<body>
<h1>This is a test tag page for person.</h1> <br>
<lu:myColor count="3" strColor="blue">xmddl</lu:myColor>
</body>
</html>
输出如下
This is a test tag page for person.
xmddl
xmddl
xmddl
发表评论
-
The sample of calendar
2006-01-25 14:09 644public List getWorkDailyLogList ... -
Common command in java
2006-02-06 13:17 645J2EE应用/|__EJB组件/(haiejb.jar)| ... -
细说Java之util类
2006-02-13 10:36 371线性表,链表,哈希表是常用的数据结构,在进行Java开发时,J ... -
《最后期限》-项目管理101条重要原则
2006-05-24 21:31 768《最后期限》-项目 ... -
the difference of Hashtable and HashMap
2006-05-27 13:16 6581.Hashtable是Dictionary的子类,HashM ... -
the address of Resource
2006-08-30 14:32 731相关JAR包:spring-framework-1.1.5 : ... -
事务服务浅析
2006-10-23 09:42 730事务是一个非常重要 ... -
Java中如何正确使用字体编码
2006-12-21 21:44 545在Java编程中,中文字体编码难倒了不少程序员,如果抓住了影响 ... -
Java线程总结
2006-12-26 22:45 702首先要理解线程首先需 ... -
21种代码的“坏味道”
2007-01-16 17:48 8111.Duplicated Code代码重复几乎是最常见的异 ...
相关推荐
用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用...
帝国CMS 7.2 7.5 TAG插件 TAG高级管理工具tags插件SEO利器 一、TAG展示新增功能 TAG伪静态可设置以TAG拼音或TAGID形式,更利于SEO 自带TAG首页功能,方便展示全部TAg 自定义列表排序 二、TAG管理新增功能 批量增加...
apriltag 标签 tag36h11
阿里的开源canal通过订阅binlog可以生产mq消息,实现了数据链路的对接和输出,为我们在做业务兼容,业务迁移的过程中提供了很多便利,但是个人在工作中发现有一个问题,就是目前个版本生产的消息都没有key和tag,...
自动提取tag自动提取tag自动提取tag自动提取tag自动提取tag自动提取tag自动提取tag自动提取tag自动提取tag
织梦TAG静态化,生成静态网页,1、TAG这个目录可以改,修改arc.taghtml.class.php的146行和extend.func.php的15行,里面的tag/字样 2、文件名里的id号不能去掉,举例说因为“作业”和“昨夜”的拼音都一样,如果没有...
WordPress自带的有Tag标签功能,但是这个自带的标签功能过于简单了,为了方便使用,WordPress的爱好者开发了这款插件BetterTag Cloud,通过Better Tag Cloud插件,你可以选择自定义喜欢的字体、HTML标记,而且,它...
Mp3tag中文绿色版是一款功能强大而完全免费的MP3文件ID3-Tag信息修改器和更名工具。所谓ID3-Tag 信息,就是在MP3文件中加入曲名、演唱者、专集、年月、流派、注释等信息,便于您收集歌曲。其实winamp中带有编辑器,...
Apriltag官网下载的tag分辨率极低,因此这里上传一个openmv生成的高分辨率tag资源,共587张
tag,标记库,java技术tag,标记库,java技术
本文分享了js中利用tagname和id获取元素的3种方法,供大家参考,具体内容如下 方法一:整体法,先获取所有的元素,再通过ai+-b的方法来算出需要的元素 方法二:数组法,在全局环境下建立空数组,遇到需要循环的结构...
<tagclass>org.whatisjava.mvc.taglib.HelloTag</tagclass> <!--用于规定标记体的内容--> <bodycontent>empty <!-- 以下用于声明该标记的属性(可以有多個) --> <name>times <required>true ...
这个是自己根据一个已经有 3D 特效的标签云源代码修改而成,感谢原作者! 用法: <div id="tag"> <a href=...>... <a href=...>... <a href=...>... ...然后 $("#tag").tagcloud({color:...,radius:...}); 即可
AprilTag标记追踪 AprilTag的种类叫家族(family),有下面的几种: TAG16H5 → 0 to 29 TAG25H7 → 0 to 241 TAG25H9 → 0 to 34 TAG36H10 → 0 to 2319 TAG36H11 → 0 to 586 ARTOOLKIT → 0 to 511 注意:一般...
NFC 联盟的 tag2 技术文档,学习 nfc 的同学必看哦
自己花钱在豆丁上买的文档,确实很难找的文档。介绍tag标签的
Android NFC Tag ID 读取
TagsEditText:tagsCloseImageRight="@drawable/tag_close" TagsEditText:tagsBackground="@drawable/square" TagsEditText:tagsCloseImageLeft="@drawable/dot" TagsEditText:tagsTextColor="@color/blackOlive...
含全部AprilTag高清二维码矢量图,PDF格式