解决r:listShuttle组件converter异常及实现equals与hashCode方法
"本文将详细介绍如何在页面中使用`<rich:listShuttle>`组件,并强调了该组件必须指定`converter`属性的重要性。同时,我们将探讨在使用`<rich:listShuttle>`时可能出现的问题及其解决方案,包括处理`PropertyNotFoundException`异常、确保`ToolBarItem`类正确实现`hashCode()`和`equals()`方法,以及理解`sourceValue`、`targetValue`、`sourceSelection`和`targetSelection`属性的作用。" 在JavaServer Faces (JSF) 应用程序中,`<rich:listShuttle>`是RichFaces框架提供的一种强大的组件,用于创建可拖放列表,允许用户在两个列表之间转移项目。它提供了用户友好的界面,增强了用户体验。然而,使用这个组件时,有一个关键点需要注意:必须为`<rich:listShuttle>`指定`converter`属性。这是因为组件需要一个转换器来正确地将列表中的对象转化为可显示和可处理的形式,避免出现`javax.faces.el.PropertyNotFoundException`异常。 当`converter`属性未设置或设置错误时,JSF无法找到对应的属性值,从而抛出`PropertyNotFoundException`。解决这个问题的方法是在定义`<rich:listShuttle>`时,确保`converter`属性指向一个实现了`javax.faces.convert.Converter`接口的类。 在实际应用中,`<rich:listShuttle>`通常会与自定义数据类型如`ToolBarItem`一起使用。为了使组件能够正确识别和比较这些自定义对象,`ToolBarItem`类需要实现`hashCode()`和`equals()`方法。`hashCode()`方法用于确定对象在哈希表中的位置,而`equals()`方法则用于比较两个对象是否相等。如果这两个方法没有正确实现,可能会导致组件无法正确识别已选择的项目,从而显示`Component XXXX has invalid value expression XXXX`错误信息。 `<rich:listShuttle>`有以下几个关键属性: 1. `sourceValue`: 定义初始位于左侧列表的项目集合。 2. `targetValue`: 指定右侧列表初始显示的项目集合。 3. `sourceSelection`: 用户在拖放操作后,左侧列表中被选中的项目集合。 4. `targetSelection`: 用户在拖放操作后,右侧列表中被选中的项目集合。 在`<rich:listShuttle>`的使用过程中,要确保所有这些属性的值都是`List`或`Array`类型的items集合,以便组件能够正确处理和更新用户交互的结果。 总结来说,理解和正确使用`<rich:listShuttle>`组件,包括其`converter`属性、自定义对象的`hashCode()`和`equals()`方法,以及关键属性的设置,是构建高效、用户友好的多列表交互界面的关键。遵循这些最佳实践,可以确保你的JSF应用中的`<rich:listShuttle>`组件运行顺畅,提高用户体验。
a) 页面中r:listShuttle组件一定要指定converter属性值,
否则会报javax.faces.el.PropertyNotFoundException异常。
b) 实体组件,例如例子中的ToolBarItem组件一定要实现hashCode()和equals() 方法,否则不能通过验证,提示Component “XXXX” has invalid value expression “XXXX”验证信息。
c) r:listShuttle组件中sourceValue和 targetValue为 List or Array of items,而sourceSelection和targetSelection为collection of item
richFaceDemo源码如下:
列出官方例子源代码:
package a2;
public class ToolBarItem {
private String icon;
private String label;
private String iconURI;
public ToolBarItem() {
// TODO Auto-generated constructor stub
}
setLabel(label);
setIcon(icon);
}
//getter and setter…
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((icon == null) ? 0 : icon.hashCode());
result = prime * result + ((label == null) ? 0 : label.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
剩余11页未读,继续阅读
- 粉丝: 9
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ASP.NET数据库高级操作:SQLHelper与数据源控件
- Windows98/2000驱动程序开发指南
- FreeMarker入门到精通教程
- 1800mm冷轧机板形控制性能仿真分析
- 经验模式分解:非平稳信号处理的新突破
- Spring框架3.0官方参考文档:依赖注入与核心模块解析
- 电阻器与电位器详解:类型、命名与应用
- Office技巧大揭秘:Word、Excel、PPT高效操作
- TCS3200D: 可编程色彩光频转换器解析
- 基于TCS230的精准便携式调色仪系统设计详解
- WiMAX与LTE:谁将引领移动宽带互联网?
- SAS-2.1规范草案:串行连接SCSI技术标准
- C#编程学习:手机电子书TXT版
- SQL全效操作指南:数据、控制与程序化
- 单片机复位电路设计与电源干扰处理
- CS5460A单相功率电能芯片:原理、应用与精度分析