chap7 使用自定义的tag lib. 和JSTL

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)TLDTag Lib. Descriptor):指定custom action对应的java class名称,以及containerinvoke这个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 elementElementtag代称,又进一步简略,则“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代表了来自某个libcustom action[2]找到实现该custom actionclass

[例子]<%@ taglib prefix="ora" uri="orataglib" %>
……
<ora:motd category="thoughts" />
(2)taglib directiveprefix属性:代表使用了哪个库。页面中所有使用了该prefixelement都属于该custom tag lib[例如]本书中,所有custom actionprefix都是ora

(3)uri属性:为每个custom action寻找class。属性值是一个stringcontainer通过该string定位该lib对应的TLD,再从该TLD中找到lib中每个action对应的class
web app被启动后,container寻找WEB-INF目录中后缀名是.tld的文件,以及在META-INF目录下包括.tld文件的jar文件。
对于每一个
TLDcontainer从中获取lib的缺省uri,从而建立uritld的映射。
[例如] 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位置的映射(可能是jartld文件)。
[例如]
<taglib>
<taglib-uri>
orataglib
</taglib-uri>
<taglib-location>
/WEB-INF/lib/orataglib_2_0.jar
</taglib-location>
</taglib>

(3)途径2uri值不是一个symbolic name,而是一个文件路径(tldjar)。
[例如]
<%@ taglib uri="
/WEB-INF/lib/orataglib_2_0.jar" prefix="ora" %>

7.4 使用tag lib中的action
[例子]<ora:motd category="thoughts" />
(1)custom action element的语法:< attributesbody>;或以/>结尾(如果没有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 containerjstl不支持,就需要安装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表达式中可以包含变量:是对dataobjects)的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 使用BeansCustom Actions
(1)本书作者的建议:beaninfo的很好载体;custom action非常适用于处理信息;custom action可以把bean用作input/output

(2)bean还可用于功能封装,供custom action在内部使用,通过为该bean提供一个针对jspadapter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值