`
liyixing1
  • 浏览: 958746 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

Array、List、Map

阅读更多
数组方式,如我们有两个text,name都是user.name,我们就需要添加一个转换器,转换器刻意查看本人的转换器文章。

使用框架自己的转换器ognl来支持
1.如果action定义了一个pojo类型的属性User user,通过user.name方式会自动封装到user中。

2.集合,通过List<User>这样的泛型来确定类型的。如果没有泛型,需要通过一个局部配置来设置,内容是Element_xxxx=复合类型。Element是固定的,xxx是你的属性名。如Element_user=com.model.User,这样就能识别它的类型了。如果是Map,需要设置key和element,如
Key_user=java.lang.String
Element_user=com.model.User

页面中输出,如下
<s:property value="集合属性[索引].集合元素属性名/>

对于set类型,set类型是无序的(无法通过下标访问,和list不同)
KeyProperty_集合属性名=集合元素的索引属性名。如
KeyProperty_users=name指定key后,那么
<s:property value="users('xingxing').name"/>那么就是set中元素的name属性是xingxing的元素。

另附加一个转载原文http://www.360doc.com/content/10/1207/12/573136_75786273.shtml
Array、List、Map等容器类型的参数传递

除了简单的基于JavaBean方式的参数传递支持,Struts2还支持对Array、List、Map等容器类型的数据结构做数据赋值。不过历史一路走来,XWork针对容器类型的数据赋值一直有变化,让我们慢慢解读这些变化,从而也来看看编程思路是如何改变的。

对于action中有一个属性,不如Role role,role里面有一个集合,如Set<Menu> menus = new HashSet<Menu>();
不晓得怎么对role.menus赋值。。。。。。。。。。。。。。。。。。。

1. 2004年,XWork-1.0.X的年代

当时XWork所支持的针对容器的数据赋值还比较土。这方面moxie在论坛上有一篇文章专门来讲述:http://www.iteye.com/topic/8770。

总的来说,那个年代对于容器的数据赋值,需要依赖于XWork的辅助类。我们可以看到,如果你要对List进行赋值,需要新建一个XWorkList的实现类,并把所需要进行数据赋值的Java类传递到XWorkList的构造函数中。而对Map等对象的赋值,也同理可得。

这种数据赋值的方式的优缺点都非常明显。优点在于简单,你不需要额外定义任何其他的内容,而是直接使用XWork的辅助类来实现类型转化。缺点在于扩展性很弱,很明显,针对某一个具体的容器,就需要一个XWork的实现类,List有XWorkList对应,Map有XWorkMap对应。甚至在那个时候,还没有Set的支持,因为没有XWorkSet的实现。所以使用这种方式,在扩展性方面需要遭受严重的考验。

2. 2006年,XWork-2.0.X的年代

也许是XWork团队看到了扩展性上的问题,所以在XWork和Webwork同时升级以后,采用了新的方式来处理容器赋值。而此时,Javaeye上也涌现出了新的文章,Tin同学对新的方式做了详细的表述:http://www.iteye.com/topic/17939。

不过这个新的整合方式似乎并不被大家所看好。

lllyq 写道
我觉得XWorkList, XWorkMap还是很有用的,挺好的设计,其实没有必要deprecated。
moxie 写道
集合支持不向下兼容。XWorkList已经是@deprecated,用它就错,还不如直接删除掉。在webwork2.2中,它需要为集合另外配置一个conversion.properties文件。真不明白,这样有什么优点?


这种新的整合方式,实际上只是解决了针对容器赋值,不需要依赖XWork的辅助类这样的一个问题,不过其付出的代价,却是多了一个配置文件,这也让人非常郁闷。好好的类型转化,平白无故多出了一个同package下的配置文件,这也无形中增加了编程的复杂度。

3. 现在,拥抱了泛型和Annotation的年代 (需要xwork-tiger架包)

实际上,在XWork发展到XWork-2.0.X之后,也开始注重了对泛型和Annotation的支持。所以,容器类型的转化,我们也可以尝试一下使用JDK的新特性来进行,当然这也是目前最为推荐的做法。

下面分别给出使用泛型和Annotation的代码示例:

<form method="post" action="/struts-example/ognl-collection-conversion.action"> 
    <input type="text" name="users[0].name" value="aaa" /> 
    <input type="text" name="users[1].name" value="bbb" /> 
    <input type="text" name="users2[0].name" value="ccc" /> 
    <input type="text" name="users2[1].name" value="ddd" /> 
    <input type="text" name="userMap['user1'].name" value="eee" /> 
    <input type="text" name="userMap['user2'].name" value="fff" /> 
    <input type="text" name="userMap2['user3'].name" value="ggg" /> 
    <input type="text" name="userMap2['user4'].name" value="hhh" /> 
    <input type="submit" value="submit" /> 
</form> 
public class OgnlConversionAction extends ActionSupport {  
 
    private static final long serialVersionUID = 4396125455881691845L;  
 
    private static final Log logger = LogFactory.getLog(Policy.class);  
      
    private List<User> users;  
      
    @Element(value = User.class)  
    private List users2;  
      
    private Map<String, User> userMap;  
      
    @Element(value = User.class)  
    private Map userMap2;  
      
    /* (non-Javadoc) 
     * @see com.opensymphony.xwork2.ActionSupport#execute() 
     */ 
    @Override 
    public String execute() throws Exception {  
          
        // -> aaa  
        logger.info("users[0].name : " + users.get(0).getName());  
        // -> bbb  
        logger.info("users[1].name : " + users.get(1).getName());  
        // -> ccc  
        logger.info("users2[0].name : " + ((User)users2.get(0)).getName());  
        // -> ddd  
        logger.info("users2[1].name : " + ((User)users2.get(1)).getName());  
          
        // -> [user1, user2]  
        logger.info("userMap.key : " + userMap.keySet());  
        // -> eee  
        logger.info("userMap.key = " + "user1" + " : " + "userMap.value(user1's name) = " + userMap.get("user1").getName());  
        // -> fff  
        logger.info("userMap.key = " + "user2" + " : " + "userMap.value(user2's name) = " + userMap.get("user2").getName());  
        // -> [user3, user4]  
        logger.info("userMap2.key : " + userMap2.keySet());  
        // -> ggg  
        logger.info("userMap2.key = " + "user3" + " : " + "userMap.value(user3's name) = " + ((User)userMap2.get("user3")).getName());  
        // -> hhh  
        logger.info("userMap2.key = " + "user4" + " : " + "userMap.value(user4's name) = " + ((User)userMap2.get("user4")).getName());  
          
        return super.execute();  
    }  
      
    // setters and getters  

上面的代码中,我们可以看到,如果你使用泛型,那么你无需再使用任何额外的配置文件或者Annotation,XWork会把一切都为你准备好。如果你没有使用泛型,那么你可以使用Annotation来指定你需要进行转化的对象类型。其中,对Map对象使用Annotation时,Element中的value所对应的值,是Map中的value所对应的class。

由此可见,泛型和Annotation,在一定程度上,还是可以简化我们很多工作的。
分享到:
评论

相关推荐

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...

    java中List、Array、Map、Set等集合相互转换

    Java 中 List、Array、Map、Set 等集合相互转换 在 Java 中,集合类型的转换是非常常见的操作,例如将 List 转换为 Array、将 Array 转换为 List、将 Map 转换为 List 等等。今天,我们将详细介绍 Java 中 List、...

    StringtoList和StringtoMap和StringtoObject和StringtoArray

    在处理JSON时,我们有时需要将JSON字符串转换为Java中的各种数据类型,如List、Array、Map和自定义对象。本文将详细介绍如何进行这些转换,并提供一个封装好的转换方法和示例。 1. **String to List** JSON字符串...

    Array、Map学习

    根据给定的信息,我们可以从以下几个方面来探讨与Array、Map相关的Scala知识点: ### 1. 元组(Tuple) 在Scala中,元组允许我们组合不同类型的元素到一个单一的复合值中。元组通常用来表示固定大小的有序集合。 ...

    json与bean,array,list,map,简单类型之间的封装、解析

    本主题主要探讨的是如何使用Gson库处理JSON数据与Java中的Bean、Array、List、Map以及简单类型的相互转换。 首先,我们来看JSON与Java Bean之间的转换。Java Bean是一种具有特定属性和方法的对象,它们通常用来封装...

    @ConfigurationProperties绑定配置信息至Array、List、Map、Bean的实现

    `list`会绑定到配置文件中的`myApp.list`,`map`会绑定到`myApp.map`,`array`会绑定到`myApp.array`,而`bean`则会绑定到一个`MyBean`类型的对象,其属性分别对应`myApp.bean.name`,`myApp.bean.property1`和`...

    Object-List-Map-Array 转成json数据三中方法

    三种方法将Object-List-Map-Array 转成json 数据 并抽取了工具类,可以很方便的设置包含哪些字段,去掉哪些字段; JSONArray/JSONObject fastjson jackson 这三个框架

    测试报告与总结\list,set,map,数组间的相互转换

    测试报告与总结\list,set,map,数组间的相互转换.rar测试报告与总结\list,set,map,数组间的相互转换.rar测试报告与总结\list,set,map,数组间的相互转换.rar测试报告与总结\list,set,map,数组间的相互转换.rar

    MyBatis传入集合 list 数组 map参数的写法

    在MyBatis中,处理集合参数如list、array以及map是非常常见的操作。这些参数通常用于构建动态SQL,特别是当需要在`IN`语句中使用多个值时。下面将详细解释如何在MyBatis中使用这些参数类型。 1. **List参数**: 当...

    27-Object-List-Map-Array 转成json数据

    在做web开发的时候总会用到jquery 的ajax 技术,然而通过ajax 技术从服务端获取的数据大多是json 格式的数据,所以将不同类型的数据转成json 格式是件很常见的技术,总结一下两种方法!

    dwr练习实例(各种数据转换list,map,数组等)

    对于List数据类型,DWR能够将服务器端的ArrayList或LinkedList等转换为JavaScript的Array。在DWR配置文件中,你需要声明允许访问的Java类,例如: ```xml ``` 在这个例子中,`MyClass`的`getListOfObjects`...

    list.toArray方法

    在深入讲解之前,我们需要理解Java集合框架的基础,它包括Set、List和Map等接口,以及它们的实现类,如ArrayList、LinkedList和HashMap等。 List接口是Collection接口的子接口,它代表了一个有序的集合,允许有重复...

    caokegege#Interview#BAT面试笔试33题:JavaList、Java Map等经典面试题!答案汇总1

    1、List集合:ArrayList、LinkedList、Vector等 2、Vector是List接口下线程安全的集合 3、List是有序的 4、Array

    Scala的List类方法整合

    list.copyToArray(array, 1, 2) // array 结果为 Array(0, 1, 2, 0, 0) ``` #### 10. `def distinct: List[A]` 此方法返回一个只包含列表中不同元素的新列表。 **示例代码:** ```scala val list = List(1, 2, 2, 3...

    Java中List与Map初始化的一些写法分享

    在Java编程中,数据结构是程序设计的基础,List和Map是两种非常常用的数据结构。本文将详细介绍Java中初始化List和Map的几种常见方法,并对比它们的优缺点。 首先,我们来看传统的初始化方式: ```java // 初始化...

    Scala的Map相关方法整合

    ### Scala的Map相关方法整合 在Scala编程语言中,`Map`是一种常用的数据结构,用于存储键值对。本文将详细介绍Scala中Map的各种方法及其用途,帮助开发者更好地理解和使用这些功能。 #### 1. `def++(xs:Map[(A,B)]...

    jQuery的Ajax实现异步传输List、Map

    var mapJson = JSON.stringify(Array.from(myMap.entries())); // mapJson 将会是 '[[\"key1\",\"value1\"],[\"key2\",\"value2\"]]' ``` 然后在Ajax请求中: ```javascript $.ajax({ url: 'your_server_...

    Java集合类List-Set-Map的区别和联系.doc

    Java 集合类 List-Set-Map 的区别和联系 Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的...

    你应该了解的JavaScript Array.map()五种用途小结

    JavaScript中的Array.map()方法是一种非常实用的工具,用于在不改变原始数组的情况下,根据提供的回调函数处理数组中的每个元素并创建一个新的数组。由于它不会直接修改原有数组,因此在处理数据时尤其适合需要保持...

    map的用法的源代码资源

    在 JavaScript 中,`Array.prototype.map` 方法的用法类似: ```javascript const numbers = [1, 2, 3, 4, 5]; const squaredNumbers = numbers.map((x) =&gt; x * x); console.log(squaredNumbers); // 输出:[1, 4, ...

Global site tag (gtag.js) - Google Analytics