2012-02-05 47 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的主要作者