使用Scala和StringTemplate,我如何遍历Map

时间:2010-06-11 14:18:25

标签: google-app-engine scala stringtemplate

我在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 

思想/想法?

2 个答案:

答案 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