[转] 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脚本,得到结果
最新文章
- The SQL Server Service Broker for the current database is not enabled
- C#学习笔记----栈与堆的知识
- 使用hue+oozi构建任务调度系统
- C# 命令绑定
- android适配器及监听点击和滚动在ListView中的使用
- 倒影(box-reflect)
- mysql 链接数据库
- [置顶] think in java interview-高级开发人员面试宝典(七)
- MAC随机修改批处理
- Oracle总结第三篇【PLSQL】
- shell 报错:syntax error: unexpected end of file
- Python标准库之ConfigParser模块
- card布局解决复杂操作的布局问题
- 判断exe执行结束,事件监听
- java web----TCP/DUP 通信
- python 百度cpc点击
- 因写太多 BUG!程序员遭公司颁奖羞辱,做的一个比一个绝​
- jenkins 多用户同时触发构建—简单实用
- JQUERY双下拉框内容的左右移动
- mysql出现1030 Got error 28 from storage engine解决方法
热门文章
- log4e下载地址
- 大数据 -- Spark
- java基础篇---文件上传(commons-FileUpload组件)
- [转]操作MySQL数据库报出:Parameter index out of range (1 >; number of parameters, which is
- WPF打包工具
- 编译JDK源代码【转】
- 【oneday_onepage】——美国主食吃什么
- Servlet 全局验证是否登录
- 【转】如果有人让你推荐Python技术书,请让他看这个列表
- 《FPGA全程进阶---实战演练》第十一章 VGA五彩缤纷