自定义转换器标签(1)

就像自定义标签一样,开发者需要将自定义转换器标签的描述放在TLD文件中。将这个文件放在WEB-INF目录中。程序清单9-23显示了描述convertCreditcard自定义标签的TLD文件。

程序清单9-23  custom-converter/web/WEB-INF/converter.tld

  1. <?xml version="1.0" encoding="UTF-8"?>
2. <taglib xmlns="http://java.sun.com/xml/ns/javaee"
3.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4.    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5.       http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
6.    version="2.1">
7.    <tlib-version>1.1</tlib-version>
8.    <tlib-version>1.1</tlib-version>
9.    <short-name>converter</short-name>
10.    <uri>http://corejsf.com/converter</uri>
11.
12.    <tag>
13.       <name>convertCreditcard</name>
14.       <tag-class>com.corejsf.CreditCardConverterTag</tag-class>
15.       <body-content>empty</body-content>
16.       <attribute>
17.          <name>separator</name>
18.          <deferred-value>
19.             <type>java.lang.String</type>
20.          </deferred-value>
21.       </attribute>
22.    </tag>
23. </taglib>

这个文件中的实体大部分是自我说明的。文件的目的是指定标签处理程序(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 {
private ValueExpression separator;
public void setSeparator(ValueExpression
newValue) { separator = newValue; }
...
}

为了配置标签属性的转换器实例,重载create-Converter方法。构造转换器对象并从标签属性中设置它的属性。例如,

  public Converter createConverter() throws JspException {
CreditCardConverter converter = new CreditCardConverter();
ELContext elContext = FacesContext.getCurrentInstance(). getELContext();
converter.setSeparator((String) separator.getValue(elContext));
return converter;
}

这个方法设置CreditCardConverter的separator属性。

最后,还要为每个标签处理程序类定义一个release方法,它重置所有实例字段为默认值:

  public void release() {
separator = null;
}

程序清单9-24显示了完整的标签类。

程序清单9-24  custom-converter/src/java/com/corejsf/CreditCardConverterTag.java

  1. package com.corejsf;
2.
3. import javax.el.ELContext;
4. import javax.el.ValueExpression;
5. import javax.faces.context.FacesContext;
6. import javax.faces.convert.Converter;
7. import javax.faces.webapp.ConverterELTag;
8. import javax.servlet.jsp.JspException;
9.
10. public class CreditCardConverterTag extends ConverterELTag {
11.    private ValueExpression separator;
12.
13.    public void setSeparator(ValueExpression newValue) {
14.       separator = newValue;
15.    }
16.
17.    public Converter createConverter() throws JspException {
18.       CreditCardConverter converter = new CreditCardConverter();
19.       ELContext elContext = FacesContext.getCurrentInstance().getELContext();
20.       converter.setSeparator((String) separator.getValue(elContext));
21.       return converter;
22.    }
23.
24.    public void release() {
25.       separator = null;
26.    }
27. }

  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

获得表达式语言中求值表达式的上下文。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值