最近在开发定制标记库时遇到了一个问题,当tld文件中把<body-content>设置为JSP时,服务器总是报错。
……specifies an invalid body-content (JSP) for a SimpleTag.
网上查找的资料很多不全面,如实查阅了《JSP程序设计》(O'Really公司 第三版)加上自己的思考,把原因搞清楚了。
要将定制动作开发为Java类,需要使用一组类和接口,这在JSP规范中成为标记扩展机制。实现一个定制动作行为的类成为标记处理器。该类实际上是一个bean,其中包括与定制动作元素属性相对应的性质设置方法。而且这样一卦标记处理器类必须实现标记扩展机制所定义的4个Java接口之一。
通常标记处理器分为两种:简单标记处理器和传统标记处理器。
简单标记处理器需要实现SimpleTag接口,或继承SimpleTagSupport类。
传统标记处理器需要实现其他三个接口,即Tag,IterationTag和BodyTag。Tag接口定义了对于所有标记处理器所需实现的方法。IterationTag接口拓展了Tag接口,并增加了迭代处理动作元素体所需的一些方法。BodyTag接口则扩展了IterationTag接口,并增加了对动作元素体计算结果提供访问方法。
其中简单标记处理器是JSP2.0新引入的(不是指功能简单,而是相比传统标记处理器用起来简单,实际上功能非常强大)。我认为它的出现是因为EL和JSTL的引用,使得在JSP编程中几乎不需要使用脚本元素了,当然,这也是JSP所提倡的。了解了这个背景,就不难理解为什么<body-content>设置为JSP时会报错,因为我的标记处理器的实现是通过继承SimpleTagSupport来实现的。通过SimpleTag接口实现的标记处理器与<body-content>JSP</body-content>是不相容的。否则也就有悖于JSP2.0所提倡的减少JSP界面中的脚本元素。如果就是要使用<body-content>JSP</body-content>这种设置,那标记处理器只能通过实现传统标记处理器提供的三个接口来实现,当然这也是不提倡的。
在此,介绍一下<body-content>属性。<body-content>属性对于JSP2.0来说是必要属性,其值有四种:
empty:动作体为空
JSP:体包含JSP元素,如EL表达式,标准或定制动作以及脚本元素
scriptless:可以包含EL表达式和动作,但不能含有脚本元素
tagdependent:体中可以包含看似为JSP元素的内容,但是容器不对其进行计算(当体中的内容与JSP元素产生混淆时采用这个,不常用)
下面简单介绍各种属性的用法,即显示区别:
1.empty
<body-content>empty</body-content>
2013-10-13<my:date date="${now}"/>
2.scriptless<body-content>scriptless</body-content>
Thinking in Java:108.5<body> <jsp:useBean id="catalog" class="liangchao.bean.chap10.CatalogBean"></jsp:useBean> <my:forEachOption items="${catalog.productList}" var="product"> ${product.name }:${product.price }<br/> </my:forEachOption> </body>
JSP Programming:58.5
Core Java:99.5
3.tagdependent
<body-content>tagdependent</body-content>
${product.name }:${product.price }<body> <jsp:useBean id="catalog" class="liangchao.bean.chap10.CatalogBean"></jsp:useBean> <my:forEachOption items="${catalog.productList}" var="product"> ${product.name }:${product.price }<br/> </my:forEachOption> </body>
${product.name }:${product.price }
${product.name }:${product.price }
使用Java开发定制标记库遇到的小问题——<body-content>
最新推荐文章于 2023-05-04 10:26:18 发布