关于继承TagSupport与BodyTagSupport的区别说明

* <code>TagSupport</code>与<code>BodyTagSupport</code>的区别主要是标签处理类是否需要与标签体交互。

* 如果不需要交互的就用<code>TagSupport</code>,如果需要交互就用<code>BodyTagSupport</code>。

* 交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。

* 用<code>TagSupport</code>实现的标签,都可以用<code>BodyTagSupport</code>来实现,因为<code>BodyTagSupport</code>继承了<code>TagSupport</code>。

实例应用:创建页内广告标签

步骤一:创建标签对应的tld文件,实例中文件名称为plugin.tld,将文件放置在src目录下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib> <tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<!-- follow config used in page include short-name value for prefix and uri value for uri -->
<short-name>pudp</short-name>
<uri>http://org.pudp.com/webutil/advtag</uri> <tag>
<name>adv</name>
<tag-class>org.dennisit.util.tag.AdvTag</tag-class>
<body-content>empty</body-content>
<description>AdvTag for Page Content</description>
<attribute>
<name>type</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>resource type, value accept [media|image]</description>
</attribute>
<attribute>
<name>src</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>resource src, used for resource founding</description>
</attribute>
<attribute>
<name>width</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>width size for resource</description>
</attribute>
<attribute>
<name>height</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>height size for resource</description>
</attribute>
<attribute>
<name>title</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>title info show from mouse over on tag resource</description>
</attribute>
<attribute>
<name>link</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>target link for mouse click</description>
</attribute>
<attribute>
<name>target</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
<description>resource open way, accept value [_blank,_self,_parent,_top], default value is _selft</description>
</attribute>
</tag> </taglib>

步骤二:编写标签实现类

package org.dennisit.util.tag;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport; /**
* 类说明:
*
* <code>TagSupport</code>与<code>BodyTagSupport</code>的区别主要是标签处理类是否需要与标签体交互。
*
* 如果不需要交互的就用<code>TagSupport</code>,如果需要交互就用<code>BodyTagSupport</code>。
*
* 交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。
*
* 用<code>TagSupport</code>实现的标签,都可以用<code>BodyTagSupport</code>来实现,因为<code>BodyTagSupport</code>继承了<code>TagSupport</code>。
*
* @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy Right since 2013-9-22
*
* org.dennisit.util.tag.AdvTag.java
*
*/ public class AdvTag extends TagSupport{ /**
*
*/
private static final long serialVersionUID = 7474617660272039786L; private String type; //资源类型
private String src; //资源路径
private String width; //资源宽度
private String height; //资源高度
private String title; //资源显示标签
private String link; //资源跳转路径 /**资源打开的方式*/
private String target = AdvTag.TARGET_SELF; //设定资源的类型
private static final String TYPE_MEDIA = "media";
private static final String TYPE_IMAGE = "image"; //设定跳转路径
/** _blank 浏览器总在一个新打开 */
private static final String TARGET_BLANK = "_blank"; /** _self 这个目标的值对所有没有指定目标的 标签是默认目标 */
private static final String TARGET_SELF = "_self"; /** _parent 这个目标使得文档载入父窗口或者包含来超链接引用的框架的框架集。如果这个引用是在窗口或者在顶级框架中,那么它与目标 _self 等效。*/
private static final String TARGET_PARENT = "_parent"; /** _top 这个目标使得文档载入包含这个超链接的窗口,用 _top 目标将会清除所有被包含的框架并将文档载入整个浏览器窗口。*/
private static final String TARGET_TOP = "_top"; public AdvTag(){
this.setTitle(null);
this.setTarget(AdvTag.TARGET_SELF);
this.setLink(link);
} @Override
public int doStartTag() throws JspException {
//SKIP_BODY 表示不用处理标签体,直接调用doEndTag()方法。
return SKIP_BODY;
/* 其它相关参数
SKIP_PAGE 忽略标签后面的JSP内容。
EVAL_PAGE 处理标签后,继续处理JSP后面的内容。
EVAL_BODY_BUFFERED 表示需要处理标签体。
EVAL_BODY_INCLUDE 表示需要处理标签体,但绕过setBodyContent()和doInitBody()方法
EVAL_BODY_AGAIN 对标签体循环处理。
*/
} @Override
public int doEndTag() throws JspException {
StringBuilder ret=new StringBuilder();
//如果是图片资源广告
if (this.type.equals(AdvTag.TYPE_IMAGE)) {
ret.append("<a href='").append(this.link).append("' target='"+this.target+"'>");
ret.append("<img src='").append(this.src);
if(this.getTitle().trim().length()>0){
ret.append("' alt='").append(this.title);
}
ret.append("' border='0' width='").append(this.width).append("' height='").append(this.height).append("'/></a>");
}
//如果是flash资源广告
if (this.type.equals(AdvTag.TYPE_MEDIA)) {
ret.append("<a href='").append(this.link);
if(this.getTitle().trim().length()>0){
ret.append("' title='").append(this.title);
}
ret.append("' target='"+this.target+"' style='cursor:pointer;'>");
ret.append("<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' ");
ret.append("codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0' ");
ret.append(" width='").append(this.width).append("' height='").append(this.height).append("'>");
ret.append("<param name='movie' value='").append(this.src).append("' />");
ret.append("<param name='quality' value='high' />");
ret.append("<embed src='").append(this.src).append("' quality='high' ");
ret.append("pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' ");
ret.append("width='").append(this.width).append("' height='").append(this.height).append("'></embed></object></a>");
}
try {
this.pageContext.getOut().print(ret.toString());
} catch (IOException e) {
e.printStackTrace();
}
//表示JSP页面继续运行
return EVAL_PAGE;
} public String getType() {
return type;
} public void setType(String type) {
this.type = type;
} public String getSrc() {
return src;
} public void setSrc(String src) {
this.src = src;
} public String getWidth() {
return width;
} public void setWidth(String width) {
this.width = width;
} public String getHeight() {
return height;
} public void setHeight(String height) {
this.height = height;
} public String getTitle() {
return title;
} public void setTitle(String title) {
if(null!=title && !title.trim().equals("")){
this.title = title;
}
this.title = "";
} public String getLink() {
return link;
} public void setLink(String link) {
if(null!=link && link.trim().length()>0){
if(link.indexOf("http://")==-1){
link = "http://" + link;
}
}
this.link = link;
} public String getTarget() {
return target;
} public void setTarget(String target) {
if(target.equals(AdvTag.TARGET_BLANK)){
this.target = AdvTag.TARGET_BLANK;
}
if(target.equals(AdvTag.TARGET_PARENT)){
this.target = AdvTag.TARGET_PARENT;
}
if(target.equals(AdvTag.TARGET_SELF)){
this.target = AdvTag.TARGET_SELF;
}
if(target.equals(AdvTag.TARGET_TOP)){
this.target = AdvTag.TARGET_TOP;
}
//其它的非法标签,都按照AdvTag.TARGET_SELF处理
this.target = AdvTag.TARGET_SELF;
} }

步骤三:在页面内使用标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="pudp" uri="http://org.pudp.com/webutil/advtag"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title>自定义标签</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> <!-- 使用自定义标签 放置图片广告 -->
<pudp:adv type="image" src="adves/w470h40.png"
height="40px" width="470px"
link="www.baidu.com" title="百度广告" /> <!-- 使用自定义标签放置flash广告 -->
<pudp:adv type="media" src="adves/dalib.swf"
height="80px" width="400px;"
link="www.baidu.com"/> <!-- 使用html标准加载flash广告的 -->
<a href="http://www.baidu.com" title="百度广告">
<OBJECT codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 height=30 width=30 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
<PARAM NAME="movie" VALUE="adves/dalib.swf">
<PARAM NAME="quality" VALUE="High"><PARAM NAME="wmode" VALUE="transparent">
<param name="menu" value="false">
<param name=wmode value=opaque>
<embed src="adves/dalib.swf" quality="High" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="400" height="80" wmode="transparent" menu="false"></embed>
</OBJECT>
</a> </body>
</html>

引用方式说明:

方式一:tld文件防止在src目录下.jsp页面中引用

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="pudp" uri="http://org.pudp.com/webutil/advtag"%>

方式二:将tld文件防止在/WEB-INF/tld/目录下,在jsp页面中可以使用下面方式引用

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="pudp" uri="/WEB-INF/tld/plugin.tld" %>

方式二中位置的的引用貌似也可以用方式一种那样引用,貌似web应用启动后,只要tld在web容器可访范围内都可以访到,不知道对不对,我测试时放置在/WEB-INF/tld/目录下,使用方式一种的引用也是可以的.我放置在WEB-INF目录下,使用方式一的引入也是可以实现的.具体怎么找到的 应该看一下源码就明白了.

代码规整后结构图如下:

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3334276.html]

实例应用 自定义页面taglib标签的更多相关文章

  1. SSM框架练习之Jsp页面使用taglib标签报错500的问题

    最近在练手一个SSM的基于AdminLET框架模板的后台管理系统,使用的环境是tomcat9,使用Maven构建并通过添加Web模板框架的项目,在添加完所有的配置文件后启动tomcat运行,出现了一个 ...

  2. 整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例

    http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/ar ...

  3. jsp如何自定义tag的标签库?

    虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...

  4. JSP自定义tld方法标签

    卧槽 我们可以通过tld文件,自定义一个方法标签,以便在页面中使用,目录通常放在WEB-INF下面的tlds文件夹: 引入方式示例,直接在jsp上引入tld标签文件: <%@ taglib pr ...

  5. Django学习——Django settings 源码、模板语法之传值、模板语法之获取值、模板语法之过滤器、模板语法之标签、自定义过滤器、标签、inclusion_tag、模板的导入、模板的继承

    Django settings 源码 """ 1.django其实有两个配置文件 一个是暴露给用户可以自定义的配置文件 项目根目录下的settings.py 一个是项目默 ...

  6. Html页面head标签元素的意义和应用场景

    相信在html5之前,很少人会关注html页面上head里标签元素的定义和应用场景,可能记得住的只有"title"."keyword"和"descri ...

  7. datatables跳转自定义页面(后端分页)

    在后端分页的情况下,怎么做到跳转自定义页面? 0x01 难点: 一. 怎么添加自定义代码? 前提:datatables在整个html加载完毕后,进行datatables数据的渲染,并且把右下角的 “上 ...

  8. 一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)

    一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量ke ...

  9. 【Spring Security】四、自定义页面

    在前面例子中,登陆页面都是用的Spring Security自己提供的,这明显不符合实际开发场景,同时也没有退出和注销按钮,因此在每次测试的时候都要通过关闭浏览器来注销达到清除session的效果. ...

随机推荐

  1. [Functional Programming] Arrow contramap vs map and promap

    In previous post, Arrow Functor with contramap, we have seen how to opreating on params before we in ...

  2. 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

    怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...

  3. python抓取数据,python使用socks代理抓取数据

    在python中,正常的抓取数据直接使用urllib2 这个模块: import urllib2 url = 'http://fanyi.baidu.com/' stream = urllib2.ur ...

  4. android中使用Nine-Patch图片

    android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...

  5. 世纪互联提供的关于Powershell中将虚拟机加入备份保管库的方法

    请您参考以下步骤进行操作,如有问题请与我们联系: 对一台ARM虚拟机(虚拟机名称:paularm08r21)进行备份(参考:https://www.azure.cn/documentation/art ...

  6. h5画图表

    折线: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&q ...

  7. unity3d与web网页通信

    总结一下: Unity3D 中的 C# 和 JavaScript 脚本之间是可以互相访问并交互的,但是要求这些被访问和操作的 C# 和 JavaScript 组件必须放在名为 Standard Ass ...

  8. mac pro 显示隐藏文件

    经常希望在IOS操作系统现实隐藏文件,下面两条语句可以使用: 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:de ...

  9. Cocos2d-X中的声音和音效

    在玩游戏时都会有各种游戏音,如启动游戏时会有背景音,胜利或者失败会有一些音效.在Cocos2d-X中能够使用CocosDenshion实现各种声音 在使用CocosDenshion之前须要在程序中加入 ...

  10. 【Zookeeper】源码分析之持久化(一)之FileTxnLog

    一.前言 前一篇已经分析了序列化,这篇接着分析Zookeeper的持久化过程源码,持久化对于数据的存储至关重要,下面进行详细分析. 二.持久化总体框架 持久化的类主要在包org.apache.zook ...