处理Set集合

简介:

笔者不建议在Action中使用Set集合属性,因为Set集合里元素处于无序状态,所以Struts 2不能准确地将请求参数转换成Set元素。不仅如此,由于Set集合里元素的无序性,所以Struts 2也不能准确读取Set集合里的元素。

除非Set集合里的元素有一个标识属性,这个标识属性可以唯一地表示集合元素,这样Struts 2就可以根据该标识属性来存取集合元素了。

程序清单:codes\04\4.1\SetSupport\WEB-INF\src\org\crazyit\app\action\LoginAction.java

public class LoginAction extends ActionSupport

{

     

     

     //user属性的settergetter方法

     

     

          

     

     

     

          

     

     //省略birth属性的settergetter方法

     

     //没有提供execute()方法,

     //将直接使用ActionSupportexecute()方法

}

上面LoginActionusers属性的类型是Set,为了让Struts 2能将请求参数转换成Set集合对象,我们提供如下类型转换器。

程序清单:codes\04\4.1\SetSupport\WEB-INF\src\org\crazyit\app\converter\UserConverter.java

public class UserConverter extends StrutsTypeConverter

{

     

          

     

          

          

          

               //创建一个User实例

               

               //只处理请求参数数组第一个数组元素,

               //并将该字符串以英文逗号分割成两个字符串

               

               //User实例的属性赋值

               

               

               //User实例添加到Set集合中

               

          

          

     

     

     

          //如果待转换对象的类型是Set

          

          

               

               

               

               

                    

                    

                          

               

               

          

          

          

               

          

     

}

上面的粗体字代码实现了将字符串数组转换成Set集合的转换处理。除此之外,为了让Struts 2能准确地存取Set集合元素,我们还必须让Sturts 2明白Set集合元素的标识属性,指定Struts 2根据该标识属性来存取Set集合元素。

本应用中users属性所包含的集合元素为User类,该类的代码如下。

程序清单:codes\04\4.1\SetSupport\WEB-INF\src\org\crazyit\app\domain\User.java

public class User

{

     

     

     //省略namepasssettergetter方法

     

     

     

          //待比较的两个对象是同一个对象,直接返回true

          

          

               

          

          //只有当objUser对象

          

          

               

               //两个对象的name属性相等即认为二者相等

               

               

                    

               

     

          

     

     //根据name属性来计算hashCode

     

     

          

     

}

User类的粗体字代码(重写了equalshashCode两个方法)可以看出,该User类的标识属性是name,当两个Username相等时即可认为它们相等。

Struts 2允许通过局部类型转换文件来指定Set集合元素的标识属性,在局部类型转换文件中增加如下一行即可指定Set集合元素的标识属性。

KeyProperty_<SetPropName>=<keyPropName>

上面的<SetPropName>替换成集合属性名,将<keyPropName>替换成集合元素的标识属性即可。由于本应用的局部类型转换文件还需要指出Set集合元素的类型,所以该局部类型转换文件的代码如下。

程序清单:codes\04\4.1\SetSupport\WEB-INF\src\org\crazyit\app\action\LoginAction-conversion.properties

#指定users属性的类型转换器是lee.UserConverter

users=lee.UserConverter

#指定users集合属性里集合元素的索引属性是name

KeyProperty_users=name

一旦指定了集合元素的索引属性后,Struts 2就可以通过该索引属性来存取Set集合元素了。下面是在JSP页面中通过索引属性直接访问Set元素的代码片段。

<!-- 访问user集合属性里索引属性值为crazyit.org的元素的name属性-->

用户crazyit.org的用户名为:<s:property value="users('crazyit.org').name"/><br/>

<!-- 访问user集合属性里索引属性值为crazyit.org的元素的pass属性-->

用户crazyit.org的密码为:<s:property value="users('crazyit.org').pass"/><br/>

<!-- 访问user集合属性里索引属性值为b的元素的name属性-->

用户b的用户名为:<s:property value="users('b').name"/><br/>

<!-- 访问user集合属性里索引属性值为b的元素的pass属性-->

用户b的密码为:<s:property value="users('b').pass"/><br/>

生日为:<s:property value="birth"/><br/>

通过代码可以看出,直接访问Set元素的方式是:<SetPropName>('<indexPropValue>')——该方式访问的是索引属性为指定值的集合元素。上面代码将会输出Set属性里的两个User实例的namepass,前提是这两个User实例的标识属性(name属性)值分别为scottyeeku

注意:

上面访问Set元素用的是圆括号,而不是方括号。但对于数组、ListMap属性,则通过方括号来访问指定集合元素。

  

本文转自fkJava李刚 51CTO博客,原文链接: http://blog.51cto.com/javaligang/874468,如需转载请自行联系原作者

相关文章
|
18天前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
31 5
|
19天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
34 6
|
19天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
31 2
|
21天前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
27 3
|
4天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
4天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
4天前
|
Java 开发者
|
19天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
23 4
|
21天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
23 5
|
22天前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
30 6