有关标签,争论一直存在着。早在2004年的时候,robbin同学以一文
《炮打Taglib,我的一张大字报!》引起了许多人对Taglib的讨论。当时,robbin同学的观点大概是这样的:
robbin 写道
我认为JSP里面使用Tag,就是一个错误!我反对在JSP里面使用Tag,我推荐大家在JSP里面写Java代码,没错,就是在JSP里面写Java代码,我就是一直这么干!
从Sun在JSP里面引入Taglib,我就认为他是一个谎言!我认为大家都被Sun欺骗了,我做JSP编程,但凡我写过的JSP,我从来不用Tag,我觉得写java代码让我很舒服,我不需要再去学习那别扭而无意义的Tag语法,来增加我的工作量,来增加我的JSP页面调试难度。
不知道时隔快5年,robbin的观点是否有所变化。在这5年中,JSP的表示层方案实际上并没有发生很大的变化。Taglib也并没有消亡,AJAX技术更加蓬勃的发展,模板技术已经被视为成熟并可供使用的重要表示层技术。
标签,到底是解药还是毒药?它到底能不能为View层开发带来便捷?这个问题,我们需要更加辩证的来看待。我们首先将所有有关标签的观点总结成正反两派:
正方 1. 标签产生的初衷没有错,它的存在,能够简化JSP开发的难度,并对HTML的许多标签进行功能扩展 2. 标签从效果上的确在一定程度上解决了在JSP页面中,避免使用Java代码的情况 3. 由于Java的语法与表现能力上的优势,使用Taglib能够极大程度的封装成块的HTML代码,从而形成一套完整的页面组件,能够极大的简化页面开发 反方 1. 标签只是为了尝试避免在JSP页面中使用Java代码,实际上,这种情况很难避免。有时候,为了达到这个目的,反而带来了更多的代码和沉重的维护成本。一个很简单的理由,编写一个Tag,至少需要一个tld文件定义、一个Java的实现类、JSP中去声明tld并编写Tag。显然,对于许多情况而言,这样所带来的代码量,反而超过了在页面上直接使用Java代码 2. 不仅如此,标签的存在为广大程序员带来了无穷无尽的学习成本。因为根据使用的框架的不同,会带来不同的标签库。再加上许多公司在标签库为基础的页面组件方面的积累,公司内部就有一套标签库,于是学习这些标签的语法已经成为了程序员的沉重负担 3. 对于以标签库为基础的页面组件,在面对经常变化的页面逻辑时,显得无能为力。因为它的维护成本极高,当逻辑变化频繁时,这些页面组件的表现能力,还不如直接通过JavaScript操作HTML DOM来的方便 为此,正反双方也是各执一词,各有道理。在这点上,JSF是强烈站在正方观点上的一个Web层框架,它试图通过IDE的帮助,来解决反方所说的维护成本和学习成本的问题。而许多其他的Web框架,则相对保持中立,对于标签库,采取“不抛弃,不放弃”的原则。
如果我们比较理性的来看待这个问题,也只能说,这是一个编程方面的哲学问题。每个人应该根据自己对待代码的哲学理解进行答案选择。千万不要因此而引起框架之争。
在深入探讨每个框架的标签之前,我们先来为标签分一下类,我们分类的标准,主要是根据标签的作用。
逻辑控制类 以JSTL为例,JSTL大概提供了以下一些标签,用于逻辑控制的标签:
- c:if ———— 分支判断
- c:forEach ———— 循环
- c:choose / c:when / c:otherwise ———— 分支判断
- c:catch ———— 异常处理
逻辑控制类的标签实际上每个框架基本上都有,因为逻辑控制是组成程序的基本要素,
可以说,逻辑控制类的标签在JSP中,也是必不可少的。只是不同的Web框架对逻辑控制类的标签的定义稍有不同,其本质还是一样的。
数据输出类 同样以JSTL为例,JSTL大概提供了以下几个用于数据输出的标签:
- c:out ———— 输出表达式的值
- c:url ———— 输出格式化url
- c:set ———— 设置表达式的值
- c:param ———— 设置参数
- fmt:message ———— 输出资源文件中的值
- fmt:formatDate ———— 格式化输出日期
- fmt:formatNumber ———— 格式化输出日期
数据输出类的标签每个框架也都有。比如Struts1中,著名的<bean:property>标签、webwork中,著名的<ww:property>标签等等。
这些标签对于JSP页面来说,也是必不可少的。因为JSP的基本作用就是展现数据,这些标签正是为了展现数据而提供的。
页面组件类 页面组件类的Taglib就更多了,以Struts2为例,Struts2提供了无数UI Tag,具体可以参考:
http://struts.apache.org/2.0.14/docs/tag-reference.html 这些UI Tag实际上是对HTML标签的扩展和扩充,添加框架本身特有的特性。所以,这类标签,如果使用得当,将为开发带来极大的便捷。如果这类标签使用不当,则会带来很大的学习成本和维护成本。
事实上,这些标签对于JSP来说,并不是必须的,只是对UI的开发起到辅助的作用。 小结 除了上述这3类Taglib以外,我们还会有很多综合类的Taglib,这些Taglib往往都是为了解决特定的页面逻辑或者页面展示而做出的自定义的标签。
在我们仔细分析了标签的分类之后,我们能够发现,
前两类的标签实际上对于一个框架和JSP开发而言,是具备价值的,也是必不可缺的元素,而对于后一类的标签,我们应该谨慎对待。事实上,这些标签往往可以通过其他的方式代替。我想许多针对标签的反对的声音,绝大多数也来自于最自定义的页面组件标签的抨击。如果你在UI的标签上,表现出了学习上的不适应性,那么你完全可以思考着采取其他的方案来代替,而不是在一条死胡同里面。
首先,我并不想在这里举出非常具体的例子来说明每一个标签中每个属性的用法,因为这些东西其实大家都可以通过API手册获得,我希望列出一些在设计思想上有所差异的标签种类,并细细品味一下这些Web层标签的设计初衷和设计思想。
Struts / Webwork Struts和Webwork的标签是最传统的标签。按照我上面所说的分类,Struts和Webwork基本上在每个分类上都有相应的标签实现。不仅如此,Struts2还在页面组件化上下了点功夫,将许多页面组件定义成了标签的实现。我个人对Struts2的这种做法持保留态度,因为Taglib毕竟在扩展性和实用性上不如直接使用JavaScript等成熟的框架来的方便。
不过Struts和Webwork的标签相对来说还是比较好用的,因为它的许多内部实现与HTML自身的标签属性非常一致,降低了程序员学习的成本。
JSTL JSTL也是时下非常流行的一个标签库。由于JSTL是Sun力推的标准化标签库,所以其刚刚诞生,就奠定了其试图统一标签世界的想法。不过实际上,从标签的分类中,我们也可以看到,JSTL主要实现的内容,是第一类和第二类的标签,而没有第三类标签。按照它的想法,第三类的标签应该由用户自己去实现,或者采用其他的替代方案。
JSTL的好处是毋庸置疑的。它会依次从page、request、session、application作用域中查找表达式的值,使得它能够兼容一切Web框架。因为所有的Web框架基本上还是围绕着这些Servlet对象来打交道。另外一方面,JSTL的标签数量比较少,学习成本很低,所以很多程序员都喜欢学习它。
Tapestry Tapestry的思路与其他Web框架实现标签的思路全都不同。Tapestry提倡所有的页面都HTML化,不应引入额外的HTML标签,如果你需要实现页面逻辑,应该以组件的形式完成,而这些组件的页面调用方式,是在HTML标签中加入一些自定义的属性。
- <table>
- <tr>
- <td>User Name</td>
- <td>Action</td>
- </tr>
- <tr jwcid="@Foreach" source="ognl:users" element="tr" value="ognl:user">
- <td><span jwcid="@Insert" value="ognl:user.name">Quake Wang</span></td>
- <td><a href="#" jwcid="@ActionLink" listener="ognl:listeners.deleteUser">Delete</a> <a href="#" jwcid="@ActionLink" listener="ognl:listeners.updateUser">Update</a></td>
- </tr>
- </table>
这里我引用了Quake Wang同学曾经使用过的例子。虽然这个代码还是Tapestry3时代的代码,但是我们可以从其中看到许多Tapestry在标签设计上的独到之处。
它没有额外的标签定义,但是有额外的标签内属性定义,并通过框架,将这些定义与后台组件联系在一起。 这或许也就是许多Tapestry程序员对这个Web框架钟爱的原因,由于没有额外的JSP标签定义,那么页面展示使用HTML也就够了。所以,所有的程序员都号称Tapestry是对美工最友好的Web框架。
我个人对待上述观点是无法认同的,理由非常简单,额外定义标签,与标签中额外定义属性,从本质上来说,区别不是很大。从学习成本而言,也陡然增加了程序员学习组件的成本。对于美工呢?他们能忽略这些额外的标签嘛?理论上,可以,不过如果大家试试看一个比较复杂的带有多处分支判断的页面,美工MM同样会非常痛苦。
总体来说,Tapestry的标签具有它的特色,从设计上也有巧思之处。如果我们将这种思想移植到普通的JSP里面来,其实我们完全也可以使用类似的方式,在HTML标签中定义额外的属性,并使用JavaScript来控制这些属性的行为,同样可以形成页面组件。
相关推荐
这篇文档主要探讨了墨子在游说各国政要时所使用的八大辩论绝技,这些技巧不仅适用于辩论,也是深入理解墨子逻辑哲学的重要途径。 首先,文档提到了或、假、效三种逻辑哲学概念。"或"表示部分事物具有某一特性,但...
大学辩论赛活动策划4篇
妙语连珠的辩论技巧,展示了他们在语言表达上的才华,这也是辩论赛的一大魅力所在。 通过这样的比赛,学生们不仅可以提升个人能力,还可以增进与其他高校之间的交流,拓宽视野,了解不同学校的思考方式和策略。同时...
【大学辩论赛策划书】 大学辩论赛是一种集学术性、竞技性和娱乐性于一体的活动,旨在提升校园学术氛围,促进学生全面发展。本次辩论赛由华中科技大学武昌分校学生团体联合会主办,演讲队承办,各系学生会协办,旨在...
3. 辩题设计:该资源中的辩题“做人该不该省钱”是一个非常有争议的话题,适合大学生的辩论赛。辩题的设计需要考虑到多方面的因素,包括社会热点、学生关心的议题等。 4. 阵容介绍设计:该资源中的阵容介绍包括正方...
【大学辩论赛主持词及其流程】 大学辩论赛是一种智力与口才的较量,旨在锻炼学生的逻辑思维、语言表达和团队协作能力。在这个过程中,主持人的角色至关重要,他们不仅需要引导比赛流程,还要确保活动的公正性和观赏...
1. 提供锻炼平台:辩论赛为大学生提供了一个展现自我、提升口才的舞台,鼓励他们积极参与,培养其语言表达魅力。 2. 增强思辨能力:活动旨在促进学生形成积极思考、勇于探索真理的习惯,营造良好的学术氛围。 3. ...
- **整体影响**:考虑到贫困人口在社会中占据较大比例,一旦这部分人群表现出不仁的行为,其对整个社会的影响可能远超过少数富人的不仁行为所带来的影响。 #### 三、作战计划 - **对方可能的立论**: - **夸大...
转基因大辩论告诉了我们什么.pptx
【大学辩论赛策划书】 大学辩论赛是一种富有挑战性与教育意义的活动,旨在提升学生的口才、思维能力和团队协作技巧。以下是对该策划书内容的详细解析: 1. **活动目的**: - 锻炼学生的口头表达能力,使他们在...
转基因大辩论告诉了我们什么PPT模板.pptx
科技发展利大还是弊大辩论赛正反方意见和主持稿.doc
【某大型辩论会活动策划方案】是一份旨在推广汉语、提升汉语辩论水平并加强国际间大学生友谊的大型活动策划。该活动的目的是扩大汉语在全球的影响,增强中国和中央电视台的国际地位,同时创造高质量、高收视率的辩论...
转基因大辩论告诉了我们什么PPT作品.ppt
世纪六七十年代的高等教育财政大辩论.docx
【大学辩论赛活动策划书】是一份详细的活动组织文档,旨在为大学新生提供一个展示口才、思维能力和团队协作的平台。这份策划书涵盖了活动的目的、宗旨、组织者、时间表、参赛要求、赛事安排以及赛制等多个方面,旨在...
【大学辩论赛策划】 策划一场大学辩论赛是一个系统的过程,涉及到多个方面的工作,旨在提升学生的能力,增强团队协作,同时营造积极的校园文化氛围。以下是对这个策划书内容的详细解读: 1. **活动目的**: - ...
精选大学辩论赛策划书2022年[扫描版].pdf
【大学辩论赛策划书2022年】的策划书主要涵盖了举办辩论赛的目的、时间、地点、组织结构、参赛对象、辩论主题、赛前准备、比赛流程、评判标准等多个方面,以下是详细的知识点解析: 1. **活动目的**: - 辩论赛...