2010-06-11 47 views
1

我的環境設置很好,使用Google AppEngine中的Scala,StringTemplate。我無法循環瀏覽地圖並將其顯示在模板中。當我剛分配的字符串的簡單列表的模板它的工作原理使用:使用Scala和StringTemplate,我如何通過地圖循環

在斯卡拉的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創建地圖並分配給模板的嘗試都會給我一個錯誤。這裏是我的嘗試,這是不行的:

在斯卡拉的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

刪除我的建議 - 我只是在這裏議論,我創建'case類TitleURL的簡單的想法(網址:字符串,標題:字符串)'並使用它而不是地圖不起作用。根據Marcus的說法,它會產生一個錯誤,如「類FlickrTestServlet $ TitleURL $ 2在模板上下文中沒有這樣的屬性:title [templates/flickr_template if(photos)_subtemplate anonymous]」。 – 2010-06-11 18:19:03

回答

3

雷克斯的建議的後續行動,我能使其工作使用的情況下,類與@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的,因爲你大概也已經這樣做了)。

+0

真棒,工作!謝謝!!是的,我爲StringTemplate使用了scalasti包裝器。我唯一要做的就是添加一個導入Bean Property import scala.reflect._ – 2010-06-12 04:51:24