zoukankan      html  css  js  c++  java
  • [转] fitnesse中的Map处理

    http://blog.csdn.net/doubeizhucele/article/details/42263887

    fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将是table格式(userguide中提到可以改变hashtable的css样式)

    ======   Java 代码   =========

        public Map getMap(Map map) {
            Set set =map.keySet();
            for(Object key:set){
                System.out.println(key+":"+map.get(key));
            }
            return map;
        }

    ====== fitnesse脚本  ============

    !define teacher [!{name:laozhang,tech:Math}]
    !define xiaoming [!{name:tom,age:18,teacher:${teacher}}]

    |script|!-Test-!                 |
    |$a=   |getMap;      |${xiaoming}|

    ==== 执行结果  =======

    ======  分析原因  =================

    1. 修改代码

    public Map getMap(Map map) {
            Set set =map.keySet();
            for(Object key:set){
                System.out.println(key+":"+map.get(key).getClass().getName());
            }
            return map;
        }

    2.  执行fitnesse脚本后,查看日志,发现teacher的value是String型,而不是hashtable对象

    age:java.lang.String
    name:java.lang.String
    teacher:java.lang.String

    3. 再次修改代码

        public Map getMap(Map map) {
            Map output = new HashMap();
            Set set = map.keySet();
            for (Object key : set) {
                System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
                output.put(key, hashtableString2Map((String) map.get(key)));
            }
            return output;
        }

    4. 执行fitnesse脚本后,查看输出结果和日志

    age:18
    name:tom
    teacher:{name=laozhang, tech=Math}

    5. 再次分析原因,发现fitnesse会把map接口对象自动视为hashtable(应该是为了fitnesse展现出较好的样式,但是如果把结果对象作为参数传入到其他方法内,可能会造成不可预期的错误,比如JSONObject的fromObject方法),为了避免可能的错误,需要把输出类型强制转换为HashMap,代码如下

        public HashMap getMap(Map map) {
            Map output = new HashMap();
            Set set = map.keySet();
            for (Object key : set) {
                System.out.println(key+":"+hashtableString2Map((String) map.get(key)));
                output.put(key, hashtableString2Map((String) map.get(key)));
            }
            return (HashMap) output;
        }

    ==== 新增方法hashtableString2Map ============

    public static Object hashtableString2Map(String hashtableString) {
            if (hashtableString.startsWith("<table class="hash_table">")
                    && hashtableString.endsWith("</table>")) {
                Map map = new HashMap();
                Document document = XMLParser
                        .getDocumentFromString(hashtableString);
                Element parent = XMLParser.getRootNode(document);
                List hash_rows = parent.elements();
                String key = "";
                String value = "";
                for (int i = 0; i < hash_rows.size(); i++) {
                    Element hash_row = (Element) hash_rows.get(i);
                    List hashtableList = hash_row.elements();
                    for (int j = 0; j < hashtableList.size(); j++) {
                        Element ele = (Element) hashtableList.get(j);
                        String attrValue = ele.attributeValue("class");
                        if ("hash_key".equals(attrValue)) {
                            key = ele.getText();
                        } else if ("hash_value".equals(attrValue)) {
                            value = ele.getText();
                        }
                        map.put(key, value);
                    }
                }
                return map;
            }
            return hashtableString;
        }

    再次执行fitnesse脚本,得到结果

  • 相关阅读:
    学习笔记5_Day09_网站访问量统计小练习
    学习笔记4_ServletContext(重要整个Web应用的动态资源之间共享数据)
    学习笔记03_Day09-----Servle与反射()
    学习笔记2_Day09_servlet的细节
    学习笔记1_Day09_Servlet
    OC对数组排序的方法
    sqlite事务处理
    封装数据库
    JsonModel的使用
    RBAC表
  • 原文地址:https://www.cnblogs.com/shengs/p/6582749.html
Copyright © 2011-2022 走看看