1. 保存和重建状态
当实现转换器和验证器时,对于状态保存,你有两个选择。最简单的选择是使转换器或验证器类串行化。实现Serializable接口并且遵守Java串行化的常用规范。
在信用卡转换器的例子中,我们有一个字符串类型的实例,它是一个可串行类型。因此,我们仅需要实现Serializable接口:
public class CreditCardConverter implements |
第二个选择是提供默认的构造器并且实现State-Holder接口。这对程序员来说需要更多工作,但是它可以产生更有效的对象状态编码。坦白地说,对于小型对象例如信用卡转换器,第二个选择可能过于麻烦。
为了完整性,我们以标准DateTimeConverter为例描述此技术。
在StateHolder接口的saveState方法中,构造描述实例字段的可串行化对象。显然应该选择保存实例字段的对象数组。在restoreState方法中,从这个对象重建实例字段。
public class DateTimeConverter implements Converter, StateHolder { |
而且,StateHolder接口也需要添加一个transient特性。如果设置特性,将不保存这个特定对象。这个特性与Java串行化中使用的transient关键字类似。
public class DateTimeConverter implements Converter, StateHolder { |
说明
当保存视图时,会跳过既不实现Serializable也不实现StateHolder接口的转换器、验证器和事件监听器。
说明
下面是验证转换器必须保存它们状态的简单试验。通过将此参数添加到web.xml配置custom-converter程序,在客户端保存状态:
<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 自定义转换器程序的目录结构 |