我在Google AppEngine中使用Scala,StringTemplate很好地设置了我的环境。我无法循环浏览地图并将其显示在模板中。当我为模板分配一个简单的字符串列表时,它使用:
在Scala Servlet中:
var photos = List[String]()
//... get photo url and title ...
photos = photo_url :: photos
template.setAttribute("photos", photos: _*)
在模板中:
$photos: { photo|
<div><img src="$photo$_s.jpg"></div>
}$
以上作品。但是,任何使用url和title创建Map并分配给模板的尝试都会给我一个错误。这是我的尝试,但不起作用:
在Scala Servlet中:
var photos = List[Map[String,String]]()
//... get photo url and title ...
photos = Map("url" -> url, "title" -> title) :: photos
template.setAttribute("photos", photos: _*)
在模板中:
$photos: { photo|
<div><img src="$photo.url$_s.jpg" title="$photo.title$"></div>
}$
这给了我以下错误
Class scala.collection.immutable.Map$Map2 has no such attribute: title in template context
思想/想法?
答案 0 :(得分:3)
根据Rex的建议,我能够使用带有@BeanProperty
注释的案例类来使其工作:
case class MyPhoto(@BeanProperty val url: String, @BeanProperty val title: String)
def generateMyPhotos() : String = {
val tp = new StringTemplate("$photos: { photo|<div><img src=\"$photo.url$_s.jpg\" title=\"$photo.title$\"></div>}$")
val photos = List(MyPhoto("http://myphoto.com", "my photo"))
tp.setAttribute("photos", photos: _*)
tp.toString
}
这对我有用(使用scalasti库进行StringTemplate,你可能已经做过了。)
答案 1 :(得分:0)
有一个简单的替代方案,不使用额外的包和注释。注册一个知道如何从scala对象和scala集合中检索属性值的scala对象适配器。
现在包含在StringTemplate FAQ中: http://www.antlr.org/wiki/display/ST4/Altering+property+lookup+for+Scala