1

我在 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 和标题创建地图并分配给模板的尝试都会给我一个错误。这是我的尝试,但不起作用:

在 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 

想法/想法?

4

2 回答 2

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
}

这对我有用(使用 StringTemplate 的scalasti库,您可能也已经这样做了)。

于 2010-06-12T04:22:58.557 回答
0

有一个简单的替代方案,无需使用额外的包和注释。注册一个 scala 对象适配器,该适配器知道如何从 scala 对象和 scala 集合中检索属性值。

这现在包含在 StringTemplate 常见问题解答中: http ://www.antlr.org/wiki/display/ST4/Altering+property+lookup+for+Scala

于 2012-06-20T18:47:56.943 回答