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

求子串在主串中的位置(返回位置下标) 求子串在主串中的位置分析方法实现执行结果 分析 设主串S为:ababcabcac 子串T为:abcac i:表示S的下标 j:表示T的下标 k:表示 ↓i=k a b a b c a b c a c ↑k=0 a b c a c - - - - - ↑j=0 第一次对比,i=2和j=2的值不相等,则 k 的位置后移,从主串的第二个子串开始与目标子串重新进行比较            阅读详情

春鱼·编程观点

技术在进步, 世界在变得美好...

浅论taglib设计

[概述]

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/

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置) 1、制作系统盘 2、分区 3、重启电脑按F2 阅读详情

相关推荐

PSCAD学习笔记(1)Project Settings(重点snapshot设置)

若不勾选,则横坐标为实际时间2-7s,故障显示在第3s发生。图片中时间坐标轴显示为0-5s,故障时刻显示为第1s,即0-1s展示系统稳态,1-5s展示系统发生故障后的暂态响应,如何通过快照件实现?勾选该项后,使用快照件启动仿真会将仿真起始时间强制设置为0s,反之不勾选则依据快照件保存的时间轴继续(即坐标为实际时间)。如果已有的快照件保存的是0s至5s的仿真内容,则仿真运行时间从5s开始,到10s结束。如果已有的快照件保存的是0s至2s的仿真内容,则仿真运行时间从2s开始,到7s结束;

gwenh的博客 7234

浅论taglib设计

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

weixin_30315905的博客 114

基于stm32f103zet6的0.96寸的OLED显示屏源程序(IIC)

本人修改实验的OLED显示,该oled是四针四脚的,原理清晰,注解明了,是本人在学习0.96寸OLED时的编码,程序源码比较简单明了。该程序源码时基于stm32f103zet6的0.96寸的4针四脚的OLED显示屏(IIC)

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

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

别抢我蓝buff 565

页面流(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万+

for循环双层嵌套

for循环的双层嵌套只要分为两种类型:内外嵌套独立、内外嵌套相关。1、内外嵌套独立:for(int i=0;i&lt;4;i++) { for(int j=0;j&lt;4;j++) { System.out.print("*");  //注意不是println。print将循环结果打印出来,println在每次循环后将结果打印出来并换行 } System.out.print("\n");  ...

weixin_39334487的博客 1万+

java双层循环continue

Java双层循环continue详解 在Java编程中,双层循环是一种常见的结构,用于处理复杂的逻辑问题。在双层循环中,我们经常会碰到需要在内层循环中跳过当前循环,直接进入下一次循环的情况。这时就可以使用continue语句。本将详细介绍Java中双层循环中的continue的用法,并提供代码示例进行演示。 contin...

weixin_37042134的博客 376

java循环语句,break语句的作用,continue语句的作用

循环语句循环语句1.while循环1.1 语法1.2 流程图:2.do-while循环2.1语法2.3流程图3.for循环3.1语法:3.2语法说明:4.break语句与continue语句4.1break语法4.2continue语句4.3对比break和continue小知识 循环语句 1.while循环 while循环的特点:选判断,后执行。 1.1 语法 while(循环条件){ 循环操作...

qq_41969892的博客 4003

java 一一对应的替换_java实现串的匹配和替换

/***测试类,测试两个功能类,MatchBrote_force类和subString_act类的功能实现*创建的类为TestMatchBrote_force*@author LZ*@vesion 6.2*///import com.edu.software.LZ.*;public class TestMatchBrote_force{public static void main(String[...

weixin_35364187的博客 394

37. Java 控制流语句 Continue 语句

语句是 Java 中用于跳过当前循环的剩余部分,直接进入下一次迭代的神器!当你只想跳过当前迭代的部分操作,continue。语句是一个非常强大的工具,能帮助我们在复杂的循环中跳过不需要的部分,提升代码的效率和可读性!语句可以帮助你跳过外层循环的当前迭代。这个技巧特别适用于复杂的多层循环,可以让你控制外层循环的执行。假设我们在一个字符串中搜索某个子字符串,找到它就停止,没找到就跳到下一次外层循环。语句只会跳过当前循环的剩余部分,然后继续执行下一次循环。它适用于简单的单层循环。来跳过外层循环的当前迭代。

yaoxin521123的博客 787

break语句和continue语句的区别

Java中的跳转语句有break语句和continue语句。 跳转语句用于实现循环执行过程中程序流程的跳转。 一、break语句 (1)只能在循环体内和switch语句体内使用break。 (2)不管是哪种循环,一旦在循环体中遇到break,系统将完全结束循环,开始执行循环之后的代码。 (3)当break出现在循环体中的switch语句体内时,起作用只是跳出该switch语句体,并不能终止循环体的执行。若想强行终止循环体的执行,可以在循环体中,但并不在switch语句中设置break语句,满足某种条件则

m0_68180897的博客 1万+

Java——continue语句

Java——continue语句continue 这一篇,写一下我在有关continue语句中犯得错误,由于理解不正确导致问题的出现。 continue 提到continue,就顺嘴提一句与其功能较为类似的 break语句。在此作一下区分: break; 表示跳出整个循环体,也就是说不在执行后面的循环,转而执行循环体后的语句。 continue; 表示跳出当前循环,在执行到此语句的时候,循环体内后面的语句就不再执行,而进行下一次的循环,并未跳出循环体。 错误案例 package xunhuan;

weixin_43804085的博客 687

Java continue语句详解

continue 语句是跳过循环体中剩余的语句而强制执行下一次循环,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 continue 语句类似于 break 语句,但它只能出现在循环体中。它与 break 语句的区别在于:continue 并不是中断循环语句,而是中止当前迭代的循环,进入下一次的迭代。简单来讲,continue 是忽略循环语句的当次循环。注意:continue 语句只能用在 while 语句、for 语句或者 foreach 语句的循环体之中,在这

段远山 1343

Java中3种循环结构的区别,死循环,循环嵌套,break语句,continue语句

介绍了Java中3种循环结构的区别,死循环,循环嵌套,break语句,continue语句

YoungBoyD的博客 1467

Java学习第五天-------循环嵌套、break语句、continue语句、return语句、break语句和continue语句的区别、java中的方法、方法的重载

Java学习第五天-------循环嵌套、break语句、continue语句、return语句、break语句和continue语句的区别、java中的方法、方法的重载 1.循环嵌套: 案例:需求:请输出一个4行5列的星星(*)图案。 如图: ***** ***** ***** ***** package org.westos.demo2; public class MyDe...

weixin_39289579的博客 307

JavaSE专栏16】Java 的循环退出语句 break、continue

简单对 Java 中的 循环退出语句 break、continue 进行了介绍,讲解了语法,演示了样例代码。

Designer 小郑的技术博客 5268

双层 for 匹配并相加(带 continue

摘要:本演示了使用Java双层for循环进行数据匹配与字段相加的优化实现。通过continue语句控制流程,外层循环跳过未匹配的A元素,内层循环跳过不匹配的B元素。代码示例展示了如何匹配两个学生列表(id和name相同),将数学和英语成绩相加,并输出结果。关键点包括:使用continue跳过不匹配项,break避免重复累加,并可扩展为支持多匹配累加模式。该方案适用于需要聚合数据的场景,输出结果为匹配学生的成绩总和。

smileLs的博客 331

Java try语句的嵌套

Try语句可以被嵌套。也就是说,一个try语句可以在另一个try块内部。每次进入try语句,异常的前后关系都会被推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。如果没有catch语句匹配,Java的运行时系统将处理这个异常。...

慧心的眼眸的博客 3388

跳转语句(break、continue)

跳转语句用于实现循环执行过程中程序流程的跳转,在Java中的跳转语句有break语句和continue语句。 1. break语句 在switch条件语句和循环语句中都可以使用break语句。当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。当它出现在循环语句中,作用是跳出循环语句,执行后面的代码。接下来通过下面一段代码,实现将当变量x的值为3时,使用break...

weixin_41874888的博客 2186
上一篇: 发现一片好文:java里使用regex的。
dongyp511
博客等级 码龄23年 0粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值