代码,这会大大简化控制器和视图。
清单 21 和清单 22 分别为 Group 和 Tag 转换器实现 Converter 接口:
清单 21. 实现 Converter 接口的 Group 转换器
package com.arcmind.contact.converter;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.application.FacesMessage;
import com.arcmind.contact.model.Group;
import com.arcmind.contact.model.GroupRepository;
public class GroupConverter implements Converter {
...
}
清单 22. 实现 Converter 接口的 Tag 转换器
package com.arcmind.contact.converter;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import com.arcmind.contact.model.Tag;
import com.arcmind.contact.model.TagRepository;
public class TagConverter implements Converter {
...
}
实现 getAsObject() 方法
下一步是实现 getAsObject() 方法,这个方法将字段(字符串)转换为对象。清单 23 给出 GroupConverter 的 getAsObject() 方法:
清单 23. GroupConverter 的 getAsObject() 方法
...
public class GroupConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component,
String value) {
GroupRepository repo = (GroupRepository) facesContext
.getExternalContext().getApplicationMap()
.get("groupRepository");
Long id = Long.valueOf(value);
if (id == -1L) {
throw new ConverterException(new FacesMessage(
FacesMessage.SEVERITY_ERROR, "required", "required"));
}
return repo.lookup(id);
}
...
}
注意,GroupConverter 查找 groupRepository 并使用 groupRepository 从存储库中读取 Group。还 要注意,它检查值是否是 -1L;如果是这样,就通过抛出一个新的 ConverterException 输出所需的消息 。
TagConverter 是相似的。它使用 tagRepository 查找标记值。清单 24 给出 TagConverter 的 getAsObject() 方法:
清单 24. TagConverter 的 getAsObject() 方法
...
public class TagConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component,
String value) {
TagRepository repo = (TagRepository) facesContext
.getExternalContext().getApplicationMap()
.get("tagRepository");
return repo.lookup(Long.valueOf(value));
}
...
}
这两个转换器都没有进行全面的错误检查。如果存储库对象实际上与数据库或缓存服务器通信,那么 可能需要把 getAsObject() 包装在 try/catch 块中,并在数据库出现问题时生成一个严重性为 SEVERITY_FATAL 的 FacesMessage — 就像 清单 23 中的 GroupConverter 处理 -1L 的方法一样。
JSF 1.2入门,第2部分 JSF生命周期、转换、检验和阶段监听器(13)
时间:2011-08-09 IBM Richard Hightower
实现 getAsString 方法
JSF 需要显示当前选择的值。这需要调用 Converter 的 getAsString 方法。清单 25 给出 GroupConverter 的 getAsString 方法:
清单 25. GroupConverter 的 getAsString 方法
...
public class GroupConverter implements Converter {
|