浅论taglib设计

OLED 驱动模块程序代码 作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。 本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。 阅读详情

[概述]

Taglib是JSP比较高级的技术。做为JSP开发人员来讲,不了解taglib是可以接受的。因为JSP的风格或者JAVA的风格就是一种简洁的美。如果技术太过复杂或者繁琐,就会在技术的汪洋中失去自我。

但是,当我们的项目变得越来越大,或者团队有了一些技术积累之后,很自然就会有将我们的开发工作提高一个层次的需要。当我们面对一些非常类似的界面或者程序单元的时候,我们会想到把这样的工作成果直接用于下一个项目。这样的问题可以由taglib来解决。

到此还没有真正说明一下taglib是什么。只要你从事过JSP的开发工作,你就已经使用过taglib了。只不过是在不知不觉中使用的。你一定不会忘记 <jsp:include />标记。实际上这就是一个taglib。Taglib直译做标记库,是JSP定义给开发人员可以使用自行定义的标记体系。也就是说,开发人员可以在JSP中使用自己定义的特殊标记。而该标记可以用作特定的用途。比如显示一个每个页都需要的公司版权信息。就可以不用复制粘贴相同的代码到每个页去了。

但是taglib可以完成的工作远远不止这些。由于每个自定义标记一定是一个完全的JAVA类,我们可以定义非常丰富的一组行为,并且可以通过自定义的attribute来控制它。

[实例]

我习惯用实例来说明问题。大家也许都对用户会话状态的检查不陌生。当用户登录到系统后,我们希望自动保持用户的登录状态。而这个过程在每个需要认证用户才能访问的程序单元都需要实现。通常我们需要访问预定义的session服务器变量,当这个变量不满足某值时即判定改用户为非法访问或者会话状态丢失。

我们来看一下使用taglib如何实现。我们需要编写一个仅处理该逻辑的标记。实现的最简单的逻辑:检查用户状态session值,不满足某值时即将用户转向一个预先设置的报错页。

以下是源码(CheckSessionTag.java):
(省略了细节)

public class CheckSessionTag extends TagSupport
{
    public 
int
 doEndTag()
    {
        
try

        {
            String member_id 
= (String) pageContext.getSession().getAttribute("member_id" );
            
if(member_id == null || member_id.equals(""
))
            {
                pageContext.forward(
"/home/check_session_fail.jsp"
);
            }
        }
        
catch
(Exception e)
        {
            
// 报告异常过程省略.

        }
        
return
 EVAL_PAGE;
    }
}



[分析]

在以上源码中,我们在使tag自动检查用户session变量中的"member_id"值,如果该值为空,则立即判定用户没有访问权限,则立即将流程导向一个预先设定的报错页:/home/check_session_fail.jsp.

类CheckSessionTag派生自:TagSupport(javax.servlet.jsp.tagext.TagSupport). 是一个从JAVA 1.3就开始支持的类库,位于servlet.jar包。java文档给出的描述是:

A base class for defining new tag handlers implementing Tag. The TagSupport class is a utility class intended to be used as the base class for new tag handlers. The TagSupport class implements the Tag and IterationTag interfaces and adds additional convenience methods including getter methods for the properties in Tag. TagSupport has one static method that is included to facilitate coordination among cooperating tags. Many tag handlers will extend TagSupport and only redefine a few methods.
(该类为所有taglib的基类。该类定义了实现标记的一系列接口。)

在实例CheckSessionTag类中,我们仅仅重写了doEndTag方法。没有向其容器:jsp页输出任何东西。但是该类在实际应用中是切实可行的。

以下是在一个成品项目中的某jsp中截取的片断:
<logic:checkSession />

当我们直接使用输入url的方式访问本页时,我们被立即带到了报告:用户会话状态丢失或者未经登录的页。
这就省却了我们习以为常的一项工作:以前我们必须复制相同的scriplet到每个jsp页。(实际上,也可以使用类似intercept filter的模式来处理此需求)。这使我们的开发工作变得reusable, flexiable, 和extendable。可以想象,如果我们想改变检查session的逻辑,则可以仅仅通过改变CheckSessionTag内部的逻辑就可以通盘改变。并且我们可以通过给logic:checkSession标记加上类似target=admin的attribute来限定只有管理员才可以访问的区域。这就是形成组件化开发的基本过程。

如何实施呢?


[实施过程]

我们需要做一系列工作来将taglib引入我们的工程。

web.xml
为了使jsp解析器可以识别我们的taglib必须将其配置在web.xml内。web.xml位于/WEB-INF目录内。
使用特定语法来配置我们的taglib:
web.xml(片断)

< web-app >

    
< taglib >
        
< taglib-uri > /WEB-INF/logic.tld </ taglib-uri >
        
< taglib-location > /WEB-INF/logic.tld </ taglib-location >
    
</ taglib >

< web-app >

该语法告诉容器到什么地方去寻找所有logic:开头的tag.

tld是taglib defination的缩写。即taglib定义。该文件定义了我们使用的标记,Java类如何加载,并且该标记如何工作。让我们来看一段实际的tld:
logic.tld(片断)

<?xml version="1.0" encoding="ISO-8859-1"?>
<! 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>
    
<short-name>logic</short-name>
    
<uri>/taglibs/logic</uri>

    
<tag>
       
<name>checkSession</name>
       
<tag-class>mbajob.common.tags.logic.CheckSessionTag</tag-class>
       
<body-content>empty</body-content>
    
</tag>


我们注意到taglib标记内.
1. short-name: 标记的prefix名。
2. uri: 识别该taglib的名称。

tag标记:
1. name: 标记名(prefix:之后)
2. tag-class:类名(包含包名)
3. body-content: 标记内容模式,如果该标记没有内容则为empty.

将logic.tld放置在/WEB-INF下,此时确保编译好的CheckSessionTag类可以被容器访问到。即可完成配置。必须注意的是,不同的jsp容器的配置可能有差别。本文的配置是基于Resin 2.1.11

[应用]

建立一个jsp页。在源码的开头加入如下的预编译指令:(page)
<%@ taglib prefix="logic" uri="/WEB-INF/logic.tld" %>

此指令告诉编译器到哪里去寻找所有以logic:开头的标记的定义。

接下来在任意位置加入标记:<logic:checkSession />即可以工作了。当标记被实例化后,即自动执行doEndTag过程,检查session服务器变量值,之后将页过程跳转。


[深入一些:attribute]

有时候我们希望可以对标记进行一些定制。依旧拿checkSession做例:现在我们要限制两类用户访问系统:某
些部分仅允许具有管理员权限的用户访问。这样我们设想可以在<logic:checkSession target=admin />进行进一步定义。这需要在CheckSessionTag类中增加一些额外的逻辑。检查的过程很简单,取决于你的安全系统的分析,但是,我们写了target attribute如何是类可以得到该数据,这是一个关键的问题。

为了实现对tag增加可用的attribute, 需要做如下工作:
1. 为类增加相应的成员及相应读写器:
CheckSessionTag.java(片断): 

public class CheckSessionTag extends TagSupport
{
     private String target;

     public 
void
 setTarget(String t)
     {
        
this.target =
 t;
     }

     public String getTarget()
     {
        
return this
.target;
     }

    public 
int
 doEndTag()
    {
        
    }


2. 更改logic.tld:

.

    
<tag>

       
<name>checkSession</name>
       
<tag-class>mbajob.common.tags.logic.CheckSessionTag</tag-class>
       
<body-content>empty</body-content>
       
<attribute>
          
<name>title</name>
          
<required>true</required>
       
</attribute>
    
</tag>

为tag标记增加arrtibute节点,语法如下:

name: attribute名
required: 是否为必须的attribute

幸运的是,jsp内置地将attribute解释为java类的成员,我们无需显式地获取该值,即可直接使用。也就是说,我们只要在tag内指定了target=admin, 那么,CheckSessionTag在活着的时候就自动获取该值,可以在逻辑中直接使用。

这样,我们就可以给tag增加任意的attribute.


[入门以后]

到此为止,我么就可以写一些类似的简单的tag了。根据不同的需求,完成不同的逻辑。当我们开发一个新的tag的时候,我们在logic.tld里增加一个tag子标记。设置好相应的类型。如果需要,我们可以把我们已经写好的tag们完全的移植到第二个项目中使用,仅仅做很少的更改。而更改也仅仅限于对java源代码。

在我和我的团队的实际经验中,taglib最多的应用还是在设计一系列特殊的UI. 例如类似于选择省市多级行政区域的选择器。为了放置在HTML中嵌入过多scriplet和脚本,我们的做法通常是将其写在组装好的tag里;为了形成整个应用一致的外观,我们设计了一套用于组装页构图的框架;为了向jsp输出集合数据,我们设计了可以绑定数据的呈现器。经过很长一个时期的工作,我们发现我们的项目中jsp页内仅有很少的html, 而完全是有taglib组成的。最终,我们的taglib按照layout, logic, element, form分类,已经形成了比较大的规模。我们甚至完成了apache的struts框架完成的一部分工作。甚至做得更灵活。所有这些工作中积累的思想甚至影响到我在.NET平台下的技术思路。

为了不使篇幅太长,我不准备在本文再做深入的探索。仅仅介绍taglib入门级的一些东西。有时间的话,可能会再次写一些高级一些的taglib的设计方法。


[与ASP.NET Web Custom Control]

不能说taglib与ASP.NET Web Custom Control有什么可比性。但是我习惯将二者放到一起看。因为因为在某些实际项目中,我确实从二者之间找到一些共性。甚至有时候创作一些组件的时候实现是完全相同的。
1. 二者都定义了当标记输出开始标记和结束标记时的过程。
2. 二者都可以跨应用使用。
3. 可以使用相同的HTML和脚本。

但比较起来,ASP.NET Web Custom Control更高级一些。可以在容器中直接以对象的形式访问。并且可以定义方法,事件。意即可以完全控制一个控件。

而taglib同样有优点,例如可以嵌套使用,开发成本低等。最关键的是,taglib具有做为java产品的精细,小巧和活泼。他们分别是有着不同风格的优秀技术。

参考文档
taglib最佳实践(IBM developerWorks中文站)
http://www-900.ibm.com/developerWorks/cn/java/j-jsp07233/
 

3D点云-CVPR 2020-PF-Net: Point Fractal Network for 3D Point Cloud Completion 是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像素点与原来像素点比较完成模型的训练。而PF-Net就是采用GAN的思想在3D点云上的应用。 阅读详情

相关推荐

从零开始创建Davinci Configurator配置工程

本文介绍了从零开始搭建达芬奇工程的详细步骤。首先安装Vector的CBD包后,通过DavicCFG.exe新建空白ECU工程。文章提到Postbuild相关概念可参考往期文章《AUTOSAR配置中的PostBuild、Precompile、Linktime》,并预告下期将讲解如何通过导入DBC文件来启用AUTOSAR模块。全文以实操截图为主,步骤清晰简明,适合开发者参考备份。

Xiaowestwind的博客 149

为什么要用TaglibTaglib到底有什么好处?----jsp

问题的提出,为什么要用Taglib(标签库)?马 克-to-win:在学jsp第三章jsp基础时,我们接触过脚本元素(Scripting Element)。问题一,这些脚本元素会把java代码和html混合在一起,从而使得代码的调试和维护非常困难。马克-to-win:问题二,脚本元 素不能重用,对于稍微变一变...

别抢我蓝buff 565

高空抛物监控系统:基于YOLOv8的轨迹追踪与可视化系统

本文详细介绍了一种基于YOLOv8深度学习模型的高空抛物监控系统,该系统能够实时检测并追踪高层建筑抛掷物的运动轨迹。文章包含完整的系统设计思路、算法实现细节、数据集构建方法以及基于PyQt5的可视化界面开发过程。我们提供了完整的Python实现代码,并讨论了系统的性能优化策略和实际部署考量。此外,我们还推荐了几个公开可用的高空抛物数据集,并详细分析了系统的应用前景和技术挑战。

YOLO 426

页面流(Page flow)表单验证

 创建Web应用的过程中,验证用户在HTML表单中的输入是最常见的一个问题。用户输入数据必须被验证从而保证进行业务处理之前数据是正确的。输入的表单数据可能用于创建或更新数据库条目、调用Web服务、或作为业务过程的输入。基于目前由Struts提供的表单验证框架,页面流提供了一种简单易用的服务端验证方式。 页面流验证提供以下功能:· 用户表单输入的服务端验证· 用待验证的表单bean封装验证逻辑·

prayforever的专栏 2268

为什么要用TaglibTaglib到底有什么好处?

问题的提出,为什么要用Taglib(标签库)?马 克-to-win:在学jsp第三章jsp基础时,我们接触过脚本元素(Scripting Element)。问题一,这些脚本元素会把java代码和html混合在一起,从而使得代码的调试和维护非常困难。马克-to-win:问题二,脚本元 素不能重用,对于稍微变一变参数的情况,include指令和动作也解决不了问题,比如脚本1输出1,脚本2输出2。inc...

mark_to_win的专栏 1万+

(转)浅论taglib设计

浅论taglib设计 [概述] TaglibJSP比较高级的技术。做为JSP开发人员来讲,不了解taglib是可以接受的。因为JSP的风格或者JAVA的风格就是一种简洁的美。如果技术太过复杂或者繁琐,就会在技术的汪洋中失去自我。 但是,当我们的项目变得越来越大,或者团队有了一些技术积累之后,很自然就会有将我们的开发工作提高一个层次的需要。当我们面对一些非常类似的界面或者程序单元的...

weixin_34195142的博客 79

taglib入门好文(引http://www.cnblogs.com/xchunyu/archive/2004/09/28/47472.html)

<!-- function __doPostBack(eventTarget, eventArgument) { var theform; if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) { theform = document.Form1; } else {

Tony's 胡思乱想 1461

php taglib,thinkphp中 taglib标签应用

1、配置文件中加上:'APP_AUTOLOAD_PATH' => '@.TagLib',2、在项目的/Lib/下新建TagLib文件夹 复制TagLibHtml.class.php到该目录下面也可以自己定义格式Tag大驼峰命名.class.php实例:TagLibCms.class.php代码下面;3、模版或hhhTagLibCms.class.php的代码:[code]...

weixin_39684052的博客 336

taglib设计资料

group工程用到了taglib设计,与struts-config.xml配置有所不同,使用也有所不同。在网上查找了一些资料,收集到这里。 Taglib 原理和实现之什么是Taglib:http://www.yesky.com/338/1877838.shtml 浅谈Taglib设计:http://www.cnblogs.com/xchunyu/archive/2004/09/28

JkunZhang的专栏 877

jsp中的taglib

. JSP中使用Taglib          标准的JSP标记可以调用JavaBeans组件或者执行客户的请求,这大大降低了JSP开发的复杂度和维护量。JSP技术也允许你自定义的taglib,其实换句话说,taglib可以看成是对JSP标记的一种扩展,正如xml是对html的一种扩展一样。taglib通常定义在tag标签库中,这种标签库存放着你自己定义的tag标签。简而言之,如果使用tagl

大大 1万+

Taglib笔记

  读完《jsp设计》后深深为大师的功力折服。这篇笔记就当是个总结。  所有代码在win2000 + tomcat 4.1.17 下通过。  我刚开始使用java,有不当之处,请高手多指教。       第一章:怎样使用Taglib一、第一种方法:仅声明TLD位置在jsp文件头部,声明:这样就ok了二、第二种方法:定义库名称在jsp

itdiego的专栏 847

【亲测免费】 TagLib - 功能强大的元数据处理库

- **元数据操作**:TagLib 支持读取和修改音频文件的标题、艺术家、专辑、年份等元数据信息。 - **文件格式支持**:TagLib 支持多种音频文件格式,包括 MP3、FLAC、Ogg Vorbis、WAV 和 AIFF 等。 - **ID3 标签支持**:TagLib 提供了对 ID3v1 和 ID3v2 标签的支持,可以方便地读取和修改这些标签的内容。 - **封面图片支持**:Ta...

gitblog_00033的博客 891

taglib java,Taglib 原理和实现之什么是Taglib

Taglib 原理和实现之什么是Taglib1、问题:Tag究竟是什么?如何实现一个Tag?一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。 这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。而这两个类是由jsp容器提供的,无须开发人员自己实现。换句话说,你 只需把实现了业务逻辑的类继承TagSupp...

weixin_34216614的博客 401

Pager-taglib分页

Web开发中分页是必须应用的技术。在JavaWeb技术中初学者一般会采用SQL语句分页技术,并在这个基础的之上编写分页组件,页面传参数控制层(Servlet或Action)调用分页组件的办法,往往会感觉非常麻烦。          然而在实际开发中我们一般采用一些第三方的分页框架,可使分页变的相当简单(站在巨人的肩膀上)——而Pager-taglib就是其中的一个选择.

潛龍,勿用 5503

Hello JSP!——指令元素之taglib

taglib指令用来声明此JSP文件使用了自定义标签,同时引用所指定的标签库并设置标签库的前缀。其语法格式如下。                   taglib指令包含两个属性,分别是uri和prefix。          其中uri属性用来指定标签库的存放位置,prefix属性用来指定该标签库使用的前缀。 示例:          Testtaglib.jsp

想去海邊 1824

探索node-taglib:音频元数据处理的利器

探索node-taglib:音频元数据处理的利器 项目介绍 node-taglib 是一个简洁的 JavaScript 绑定库,用于与 TagLib 进行交互。TagLib 是一个强大的音频元数据处理库,而 node-taglib 则将其功能引入到了 Node.js 环境中。通过 node-taglib,开发者可以轻松地读取和写入音频文件的元数据,如艺术家、标题、专辑等信息。 项目技术分析 nod...

gitblog_00032的博客 696

Taglib学习笔记

第一章:怎样使用Taglib一、第一种方法:仅声明TLD位置在jsp文件头部,声明:这样就ok了二、第二种方法:定义库名称在jsp文件头部,声明: 在WEB.XML添加如下声明:/orataglib/WEB-INF/tlds/orataglib_1_0.tld 在tld里加上:ora/orataglib 三、区别  如果类不多,用tld引用就行了。否则就用库形式,便于升级,改动。第二章:编写最简单

WalkingWithJava 1482

探索TagLib-Sharp:强大的元数据处理库

是一个开源的.NET库,专门为处理音频和视频文件的元数据而设计。该项目由Mono项目维护,能够读取、修改和创建各种多媒体文件的标签信息,包括ID3v1、ID3v2、Vorbis注释、APEv2等。无论你是开发音乐播放器、媒体管理工具还是需要对多媒体文件进行自动化处理的应用,TagLib-Sharp都是一个值得信赖的工具。 ## 技术分析 TagLib-Sharp 使用C#编写,并且与.NET ...

gitblog_00049的博客 620

深入浅出taglib

深入浅出taglib 作者:smltiger     文章来源:Java 研究组织访问次数: 次    加入时间:2004-03-16  

Frenzy的专栏 1195

Taglib 原理和实现之什么是Taglib

关键字: tag标签 1、问题:Tag究竟是什么?如何实现一个Tag?   一个tag就是一个普通的java类,它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。而这两个类是由jsp容器提供的,无须开发人员自己实现。换句话说,你只需把实现了业务逻辑的类继承TagSupport或者BodyTagSupport,再做一些特别的工作,你的类就是一个Tag。并且它自己负责和jsp页面的交互,不用

JACK的专栏 573

BS EN 45545-2-2020 中文 材料和组件的防火性能要求.pdf

BS EN 45545-2-2020 中文 材料和组件的防火性能要求.pdf

STM32F103C8T6最小系统pcb原理图库3D封装库

STM32F103C8T6最小系统pcb原理图库3D封装库

上一篇: Java-JSTL(JSP标准标签库)
下一篇: FCKeditor在java下的文件上传运用
esteem
博客等级 码龄22年 3粉丝 56原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值