自定义转换器标签(2)

1. 保存和重建状态

当实现转换器和验证器时,对于状态保存,你有两个选择。最简单的选择是使转换器或验证器类串行化。实现Serializable接口并且遵守Java串行化的常用规范。

在信用卡转换器的例子中,我们有一个字符串类型的实例,它是一个可串行类型。因此,我们仅需要实现Serializable接口:

public class CreditCardConverter implements
Converter, Serializable { ... }

第二个选择是提供默认的构造器并且实现State-Holder接口。这对程序员来说需要更多工作,但是它可以产生更有效的对象状态编码。坦白地说,对于小型对象例如信用卡转换器,第二个选择可能过于麻烦。

为了完整性,我们以标准DateTimeConverter为例描述此技术。

在StateHolder接口的saveState方法中,构造描述实例字段的可串行化对象。显然应该选择保存实例字段的对象数组。在restoreState方法中,从这个对象重建实例字段。

  public class DateTimeConverter implements Converter, StateHolder {
public Object saveState(FacesContext context) {
Object[] values = new Object[6];
values[0] = dateStyle;
values[1] = locale;
values[2] = pattern;
values[3] = timeStyle;
values[4] = timeZone;
values[5] = type;
return values;
}
public void restoreState(FacesContext context, Object state) {
Object[] values = (Object[]) state;
dateStyle = (String) values[0];
locale = (Locale) values[1];
pattern = (String) values[2];
timeStyle = (String) values[3];
timeZone = (TimeZone) values[4];
type = (String) values[5];
}
...
}

而且,StateHolder接口也需要添加一个transient特性。如果设置特性,将不保存这个特定对象。这个特性与Java串行化中使用的transient关键字类似。

  public class DateTimeConverter implements Converter, StateHolder {
private boolean transientFlag; // transient是保留字
public boolean isTransient() { return transientFlag; }
public void setTransient(boolean newValue) { transientFlag = newValue; }
...
}

说明

当保存视图时,会跳过既不实现Serializable也不实现StateHolder接口的转换器、验证器和事件监听器。

说明

下面是验证转换器必须保存它们状态的简单试验。通过将此参数添加到web.xml配置custom-converter程序,在客户端保存状态:

<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>

说明CreditCardConverter类的Serializable接口。对于result.jsp页面,添加按钮

<h:commandButton value="Test State Saving"/>

在index.jsp中输入信用卡号,点击"Process"按钮,观察使用短划线格式化的数字:4111-1111-1111-1111。单击"Test State Saving"按钮并且看到短划线消失。

2. 示例自定义转换器程序

在此,结束自定义转换器例子的讨论。图9-12显示了目录结构。上面例子的多数文件都没有改变。但是,result.jsp调用了自定义转换器(参考程序清单9-25)。

 
图9-12  自定义转换器程序的目录结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值