实例应用 自定义页面taglib标签

关于继承TagSupportBodyTagSupport的区别说明

 * <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 taglibPUBLIC "-//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);}@Overridepublic 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 对标签体循环处理。*/}@Overridepublic 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应用启动后,只要tldweb容器可访范围内都可以访到,不知道对不对,我测试时放置在/WEB-INF/tld/目录下,使用方式一种的引用也是可以的.我放置在WEB-INF目录下,使用方式一的引入也是可以实现的.具体怎么找到的 应该看一下源码就明白了.


代码规整后结构图如下:


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

在线交谈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

魔兽世界怀旧服聊天服务器中断,魔兽世界怀旧服世界服务器无法连接

本文导航第1页&#xff1a; 服务器无法连接解决方法服务器无法连接解决方法今天是魔兽世界怀旧服的公测时间&#xff0c;服务器已经爆了&#xff0c;很多玩家都在反应游戏服务器进不去&#xff0c;或者服务器断开连接等等问题&#xff0c;针对这些情况&#xff0c;小编特意给大…

Express框架使用以及数据库公共操作类整理(Win7下的NodeJs)

具体步骤&#xff1a; 1、安装开发工具WebStorm&#xff1b; 2、安装node/npm&#xff08;下载地址&#xff1a;https://nodejs.org/download/&#xff09;选择适合你的xxx.mis安装&#xff1b; 3、安装express框架(cmd窗口模式&#xff0c;用npm命令执行&#xff1a;npm in…

SimpleITK使用深度学习识别肺癌CT DICOM数据集

肺癌数据集DICOM &#xff1a;https://wiki.cancerimagingarchive.net/display/Public/LIDC-IDRI 首先用SimpleITK把mhd图片读入&#xff0c;对每个切片使用Gaussian filter然后使用阈值-600把肺部图片二值化&#xff0c;然后再分析该切片的面积&#xff0c;去掉面积小于30mm2的…

两个文件夹数据同步

echooffechoechoAuthorlongwenby2013echo每天下午16&#xff1a;00和晚上22&#xff1a;00做自动更新echo时间由您的计划任务时间确定echoRelationlongwen260qq.comechoQQ476376997echoTel13480986813echoxcopyD:\svn\te\*.*E:\svn\te\*.*/s/e/m/y转载于:https://blog.51cto.co…

如何让nodejs同步操作

众所周知&#xff0c;异步是nodejs中得天独厚的特点和优势&#xff0c;但同时在程序中同步的需求&#xff08;比如控制程序的执行顺序为&#xff1a;func1 -> func2 ->func3 &#xff09;也是很常见的。本文就是对这个问题记录自己的一些想法。 需要执行的函数&#xff…

Mediapipe框架学习之一——Win10安装Mediapipe环境

Mediapipe官方文档 Mediapipe框架学习之一——Win10安装Mediapipe环境 Mediapipe框架学习之二——Android SDK and NDK 配置 Mediapipe框架学习之三——构建 MediaPipe 的 Android aar 包 Mediapipe框架学习之四——利用 Mediapipe aar 包&#xff0c;在AS中构建基于 Media…

MemCache在win7上的可视化配置以及Nodejs/Net应用

惯例科普&#xff1a;MemCache是一套分布式的高速缓存系统&#xff0c;由LiveJournal的Brad Fitzpatrick开发&#xff0c;但目前被许多网站使用以提升网站的访问速度&#xff0c;尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。这是一套开放源代码软件…

Android AM命令行启动程序的方法

http://blog.csdn.net/sunrock/article/details/5675067 在前面添加一句 启动服务的话 使用 am startservice com.lxb.window/.RecordService即可在Android中&#xff0c;除了从界面上启动程序之外&#xff0c;还可以从命令行启动程序&#xff0c;使用的是命令行工具am.usage: …

Apache httpd 配置HTTPS SSL访问 443

2, 首先安装https模块yum install mod_ssl 3. 配置Apache Web服务器 首先&#xff0c;修改下面的配置文件。仅需配置红色部分 SSLCertificateFile 和 SSLCertificateKeyFile # vim /etc/httpd/conf.d/ssl.conf # # When we also provide SSL we have to listen to the # t…

Redis在win7上的可视化应用

Redis是一个key-value存储系统。和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remove及取交集并…

全网最详细的docker配置nginx http2 优化高速访问

Nginx 从 1.13.9 版本开始加入了 HTTP/2 的 Server Push 功能&#xff0c;本文将介绍如何在 Nginx 下实现 HTTP/2 服务器推送 (Server Push) 。这里我们首先用 Docker 搭建一个支持 HTTP/2 的 Server Push 功能的 Nginx 容器并加入 SSL 证书。如果你还不会 Docker&#xff0c;可…

Flex Graphics

<?xml version"1.0" encoding"utf-8"?> <s:Application xmlns:fx"http://ns.adobe.com/mxml/2009" xmlns:s"library://ns.adobe.com/flex/spark" xmlns:mx"library://ns.adobe.com/flex/halo"minWidth"1024…

CentOS安装运行NodeJS框架Express

安装依赖包 yum -y install gcc make gcc-c openssl-devel wget 下载/解压NodeJs wget http://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gztar -zvxf node-v0.12.7.tar.gz 编译及安装&#xff0c;逐行执行 cd node-v0.12.7./configuremake install 验证是否安装配置成功&…

android点滴27:R文件无法加载 R cannot be resolved to a v...

2019独角兽企业重金招聘Python工程师标准>>> 导致这个问题原因可能有二个&#xff1a;1. manifest文件中的包名和真正的报名不统一 2. 在java文件中导入了R文件&#xff0c;在java文件中无需导入任何包的R文件&#xff0c;系统会自动加载gen目录下的R文件。 转载于…

MITK医学Python开发入门详细版

1.关于MITK&#xff1a; MITK的全称是”The Medical Imaging Interaction Toolkit”。它是一款开源的交互式医学图像处理软件开发和应用平台。MITK将ITK和VTK整合为一个应用框架。该软件由德国一个研究室开发。官网地址为&#xff1a;http://mitk.org/wiki/MITK 。 与MITK同名…

ubuntu配置×××后,配置走×××的路线

先执行route命令查看所有的路由route看到的结果大致如下内核 IP 路由表 目标 网关 子网掩码 标志 跃点 引用 使用 接口 default 192.168.8.1 0.0.0.0 UG 0 0 0 wlan0 110.185.76.107 192.168.8.1 25…

Python SimpleITK实现医学图像增强算法

1、对数变换 图像对数变换首先将图像从SimpleITK图像数据转成Numpy矩阵数据&#xff0c;然后采用Numpy的log1p&#xff08;&#xff09;函数来计算数据的log&#xff08;1x&#xff09;变换&#xff0c;由于1x不能小于零&#xff0c;因此这里我们使用图像减去图像的最小值来计…

中国计算机学会通讯杂志,何积丰. Cyber-physical systems [J]. 中国计算机学会通讯, 2010, 6(1): 25-29....

摘要:本文提出了将计算机和互联网技术引入传统的基于模拟电路和微控制器的电池管理系统的想法&#xff0c;以此为电池系统带来更高的安全性和更长的寿命&#xff0c;降低电池端硬件的复杂度和成本。本文讨论了电池管理系统的详细设计和实现过程。系统通过MATLAB仿真工具Simulin…

使用Nginx配置NodeJs程序(Windows平台)

简介 Nginx("engine x") 是一个高性能的 HTTP 和 反向代理 服务器&#xff0c;也是一个 IMAP/POP3/SMTP 服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证…

Hadoop Mapreduce分区、分组、二次排序过程详解[转]

徐海蛟 教学用途1、MapReduce中数据流动&#xff08;1&#xff09;最简单的过程&#xff1a; map - reduce&#xff08;2&#xff09;定制了partitioner以将map的结果送往指定reducer的过程&#xff1a; map - partition - reduce&#xff08;3&#xff09;增加了在本地先进性…