2012-02-05 71 views
0

是否有可能以某種方式直接從Java模板訪問DAO?我想實現類似於直接從Java模板訪問DAO

<#foreach value="eventsDao.getEvents()" as="event"> 
    <= value="event.getName()" /> 
</#foreach> 

我覺得像寫一切到控制器,然後到模板是沒有必要的,限制了重複性。

此外,JSP,Freemarker和Apache Tiles之間有什麼重大區別?他們允許這個嗎?

+2

有一個原因,事情分成控制器/道/視圖層;在視圖中具有這些類型的依賴關係通常是可維護性的一個壞主意。在一個理想的世界中,你只能將'Map'傳遞給視圖,這樣只有層之間最淺的依賴關係。 – beerbajay 2012-02-05 16:21:54

回答

1

如果你真的想要做到這一點,打破模型視圖分離......有辦法。在JSP中,您有<%! ... %><% ... %>塊,您可以在其中輸入Java代碼。在FreeMarker中,雖然不能插入Java塊,但仍可以調用對象和類的公共方法。調用靜態方法有點棘手,因爲你不能在語言級別按名稱訪問類,但必須將某些東西放入模板的上下文(所謂的數據模型)中,才能做到這一點(請參閱: http://freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55「訪問靜態方法」)。我認爲瓷磚在這個問題上無關緊要。

1

關於JSP,FreeMarker,Tiles問題:Tiles是一個視圖合成框架,與JSP和FreeMarker無關,除了能夠作爲模板使用。

希望JSP和FreeMarker之間的區別很明顯,但簡而言之,FM對於典型視圖構造(如循環)具有更簡潔的語法,並且允許更直接地訪問函數而無需定義和公開函數JSP方式。

關於MVC的「浪費」:當然,您可以在視圖層做所有事情 - 沒有什麼能夠阻止您編寫體系結構不佳的系統,而對於小型應用程序,這可能無所謂。

0

你可以使用Pebble來做到這一點,它也有一個相當乾淨的語法;它看起來像下面這樣:

{% for event in eventsDao.events %} 
    {{ event.name }} 
{% endfor %} 

除此之外,我還建議在卵石主要是因爲這是template inheritance卵石的最大特點Velocity或者Freemarker的。

免責聲明:我是Pebble的主要作者