http://blog.csdn.net/doubeizhucele/article/details/42263887
fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将是table格式(userguide中提到可以改变hashtable的css样式)
====== 代码 =========
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.Stringname:java.lang.Stringteacher: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:18name:tomteacher:{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脚本,得到结果