chap7 使用自定义的tag lib. 和JSTL |
(1)在作者看来,正是自定义的tag lib使jsp变得强大。 |
7.1 什么是自定义的tag lib? |
(1)java程序员根据jsp spec.定义的类,开发的新action。组中的java程序员可以开发新的action,实现应用程序的特定功能,从而方便页面作者开发jsp页面。 |
(2)custom action的实现:作为java class |
(3)TLD(Tag Lib. Descriptor):指定custom action对应的java class名称,以及container要invoke这个class所需要的其它信息。 |
(4)Custom Tag Lib:包括TLD,以及实现了一系列相关custom action的所有class文件。[注]TLD及所有class文件一般打包在一个jar文件中。 |
(5)开发custom action的细节,将在chap20-22中介绍。 |
(6)开发custom action简介: |
[1]通过tag handler类(一类class的统称,非class名称),实现custom action定义的行为。 |
[2]tag handler类必须直接实现javax.servlet.jsp.tagext.Tag接口(或subinterface),或通过extends JSP spec.中定义的一个support class |
[实例] |
package … |
Import … |
public class MixedMessageTag extends TagSupport { |
…… |
private String category; |
public void setCategory(String category) { |
…… |
} |
public int doEndTag( ) { |
…… |
} |
} |
[3]对于custom action支持的每一个属性,tag handler必须提供一个bean风格的setter方法(例如setCategory)。Container调用Tag接口定义的方法(doEndTag),从而使tag handler发挥作用。 |
(7)既然是custom action的集合,为什么叫custom tag lib? |
在正式的xml术语中,多个tag代表一个element(由多个tag,可能还有一个body组成)。但tag一般既指代tag,又指代element。因此在jsp页面中custom action的表示通常被称作custom action element。Element被tag代称,又进一步简略,则“custom tag”既指称功能实体(custom action),又指称其在页面中的表示(custom action element)。 |
7.2 安装custom tag lib |
(1)把jar文件放到WEB-INF/lib目录下。[例如]本书中的orataglib_2_0_1.jar |
7.3 声明一个custom tag lib |
(1)container要做的两件事:[1]识别出一个element代表了来自某个lib的custom action;[2]找到实现该custom action的class |
[例子]<%@ taglib prefix="ora" uri="orataglib" %> …… <ora:motd category="thoughts" /> |
(2)taglib directive的prefix属性:代表使用了哪个库。页面中所有使用了该prefix的element都属于该custom tag lib。[例如]本书中,所有custom action的prefix都是ora |
(3)uri属性:为每个custom action寻找class。属性值是一个string,container通过该string定位该lib对应的TLD,再从该TLD中找到lib中每个action对应的class。 当web app被启动后,container寻找WEB-INF目录中后缀名是.tld的文件,以及在META-INF目录下包括.tld文件的jar文件。 对于每一个TLD,container从中获取lib的缺省uri,从而建立uri到tld的映射。 [例如] 在WEB-INF/lib目录下的orataglib_2_0_1.jar文件中,其META-INF目录中包括taglib.tld,该xml文件包括: <taglib> <tlib-version>2.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>ora</short-name> <uri>orataglib</uri> ...... <tag> <name>motd</name> <tag-class>com.ora.jsp.tags.xmp.MixedMessageTag</tag-class> <body-content>empty</body-content> <description> Adds a message to the page </description> <attribute> <name>category</name> <required>true</required> </attribute> </tag> |
7.3.1 在jsp 1.1 container中识别lib |
(1)jsp1.2之前,container不能自动定位custom tag lib,必须告诉它去哪里找TLD |
(2)途径1:先指定uri值,再在WEB-INF/web.xml中定义该属性值到lib位置的映射(可能是jar或tld文件)。 [例如] <taglib> <taglib-uri> orataglib </taglib-uri> <taglib-location> /WEB-INF/lib/orataglib_2_0.jar </taglib-location> </taglib> |
(3)途径2:uri值不是一个symbolic name,而是一个文件路径(tld或jar)。 [例如] <%@ taglib uri="/WEB-INF/lib/orataglib_2_0.jar" prefix="ora" %> |
7.4 使用tag lib中的action |
[例子]<ora:motd category="thoughts" /> |
(1)custom action element的语法:< ,attributes,body,>;或以/>结尾(如果没有body) |
7.4.1 设置action的属性值 |
(1)上例中,将category属性(类型为String)值设为"thoughts" |
(2)custom action的属性值也可能是jstl EL表达式。[注]上例中,“Dynamic Value Accepted”一栏的值为no,表示category属性的值不能是jstl EL。因为这需要在custom action class中有额外的代码。 |
7.4.2 jstl |
(1)特殊性:jstl中的action的功能和语法在spec中有定义,而各个厂商提供这些action的实现,以对各自的container做出优化。 |
(2)如果web container对jstl不支持,就需要安装jstl参考实现(by Apache),所包含的jar文件参见table 7-2。把这些文件拷到WEB-INF/lib目录下即可。 [参见]http://jakarta.apache.org/taglibs/doc/standard-doc/intro.html |
(3)使用实例:<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> |
7.4.2.1 JSTL Expression Language |
(1)作用:将action属性设置为runtime时计算的动态值 |
(2)本书第2版时,EL还只是jstl spec的一部分,而不是jsp spec的一部分,因此不是所有的action都支持EL值。Jstl支持,而standard jsp action就不支持。目前的情况??? |
(3)支持的运算符[参见]table 7-3 |
(4)EL表达式中可以包含变量:是对data(objects)的named reference。[注]可以通过<jsp:useBean>等,创建应用相关的变量。[参考]chap10 |
(5)EL implicit变量,[参见]table 7-4 |
[例如] <c:out value="${param.userName}" /> <c:out value="${param['user-name']}" /> |
7.4.3 使用Beans或Custom Actions |
(1)本书作者的建议:bean是info的很好载体;custom action非常适用于处理信息;custom action可以把bean用作input/output |
(2)bean还可用于功能封装,供custom action在内部使用,通过为该bean提供一个针对jsp的adapter。 |
chap7 使用自定义的tag lib. 和JSTL
最新推荐文章于 2019-10-10 15:23:01 发布