有没有办法在Grails中将地图呈现为HTML表?
我想知道是否有一种很好的方法可以将有没有办法在Grails中将地图呈现为HTML表?,grails,Grails,我想知道是否有一种很好的方法可以将映射到.gsp页面中的HTML表 示例地图: def map = ['Mammals':['Unicorn','Chimpanzee','Goat'], 'Reptiles':['Snake','Turtle']]; 这将导致如下情况: <table> <thead> <tr> <th>Mammals</th> <th&g
映射到.gsp
页面中的HTML表
示例地图:
def map = ['Mammals':['Unicorn','Chimpanzee','Goat'],
'Reptiles':['Snake','Turtle']];
这将导致如下情况:
<table>
<thead>
<tr>
<th>Mammals</th>
<th>Reptiles</th>
</tr>
</thead>
<tbody>
<tr>
<td>Unicorn</td>
<td>Snake</td>
</tr>
<tr>
<td>Chimpanzee</td>
<td>Turtle</td>
</tr>
<tr>
<td>Goat</td>
<td></td>
</tr>
</tbody>
</table>
哺乳动物
爬行动物
独角兽
蛇
黑猩猩
乌龟
山羊
理想情况下,我可以创建自己的自定义标记,因此我可以这样做:
<stackOverflow:tablizer map="${map}" />
类似的东西-可能是更好的方法,但这是我首先想到的
def mapToTable = { attrs ->
StringBuilder output = new StringBuilder()
if ( attrs.map instanceof Map )
{
Map map = attrs.map
if ( map.size() > 0 )
{
output.append("<table><thead><tr>")
ArrayList[] values = map.values()
int max = values.collect{it.size()}.max()
map.each { key, val ->
output.append("<th>${key}</th>")
}
output.append("</tr></thead><tbody>")
(1..max).each { num ->
output.append("<tr>")
values.each {
if ( it.size() >= num )
{
output.append("<td>${it.get(num-1)}</td>")
}
else
{
output.append("<td></td>")
}
}
output.append("</tr>")
}
output.append("</tbody></table>")
}
}
out << output
}
def mapToTable={attrs->
StringBuilder输出=新的StringBuilder()
if(attrs.map instanceof map)
{
Map Map=attrs.Map
如果(map.size()>0)
{
output.append(“”)
ArrayList[]values=map.values()
int max=values.collect{it.size()}.max()
map.each{key,val->
output.append(“${key}”)
}
output.append(“”)
(1..max).每个{num->
output.append(“”)
价值观{
if(it.size()>=num)
{
output.append(“${it.get(num-1)}”)
}
其他的
{
output.append(“”)
}
}
output.append(“”)
}
output.append(“”)
}
}
out我不能对@James Kleeh的答案发表评论,但我修改了他的代码以打印一个映射列表,比如从Groovy Sql结果中得到的结果:
protected String mapToTable(List<Map> list) {
StringBuilder output = new StringBuilder()
Map first = list.first()
output.append("<table><thead><tr>")
first.each { key, val ->
output.append("<th>${key}</th>")
}
output.append("</tr></thead><tbody>")
list.each { map ->
if (map.size() > 0) {
def values = map.values()
output.append("<tr>")
values.each {
output.append "<td>${it}</td>"
}
output.append("</tr>")
}
}
output.append("</tbody></table>")
output.toString()
}
受保护的字符串映射表(列表){
StringBuilder输出=新的StringBuilder()
Map first=list.first()
output.append(“”)
first.each{key,val->
output.append(“${key}”)
}
output.append(“”)
list.each{map->
如果(map.size()>0){
def values=map.values()
output.append(“”)
价值观{
output.append“${it}”
}
output.append(“”)
}
}
output.append(“”)
output.toString()
}
您必须创建自己的标记。这应该没那么难。@JamesKleeh right-o!我正在寻找有关impl的帮助。地图必须具有唯一的键。顺便说一句。这是无效的。抱歉,我修复了它。