就像自定义标签一样,开发者需要将自定义转换器标签的描述放在TLD文件中。将这个文件放在WEB-INF目录中。程序清单9-23显示了描述convertCreditcard自定义标签的TLD文件。
程序清单9-23 custom-converter/web/WEB-INF/converter.tld
1. <?xml version="1.0" encoding="UTF-8"?> |
这个文件中的实体大部分是自我说明的。文件的目的是指定标签处理程序(com.corejsf.CreditCardConverterTag)的类名和标签的授权属性(在我们的例子中是separator)。
在separator属性定义内部的deferred-value子元素表示属性由产生字符串的值表达式定义。属性值可以是常量字符串或包含#{...}表达式的字符串。
在JSF页面的taglib指示符中引用TLD标识符,例如
<%@ taglib uri="http://corejsf.com/converter" prefix="corejsf" %> |
需要实现完成3个功能的标签处理程序类:
(1) 指定转换器类
(2) 收集标签属性
(3) 配置转换器对象,使用收集(gathered)属性
就转换器而言,标签处理程序类应该是ConverterELTag的子类。正如在后面讨论的,自定义验证器的处理程序必须是ValidatorELTag的子类。
说明
在JSF 1.2之前,需要派生ConverterTag 或 ValidatorTag的子类。这些类现在过时了。
标签处理程序类必须为每个标签属性指定setter方法。例如,
public class ConvertCreditCardTag extends ConverterELTag { |
为了配置标签属性的转换器实例,重载create-Converter方法。构造转换器对象并从标签属性中设置它的属性。例如,
public Converter createConverter() throws JspException { |
这个方法设置CreditCardConverter的separator属性。
最后,还要为每个标签处理程序类定义一个release方法,它重置所有实例字段为默认值:
public void release() { |
程序清单9-24显示了完整的标签类。
程序清单9-24 custom-converter/src/java/com/corejsf/CreditCardConverterTag.java
1. package com.corejsf; |
javax.faces.webapp.ConverterELTag(JSF 1.2)
●protected void createConverter()
重载这个方法来创建转换器并且通过设置标签属性指定的特性定制它。
●void release()
清除这个标签的状态以便重用它。
javax.el.ValueExpression(JSF 1.2)
●Object getValue(ELContext context)
获得这个值表达式的当前值。
javax.faces.context.FacesContext(JSF 1.0)
●ELContext getELContext() JSF 1.2
获得表达式语言中求值表达式的上下文。