是否有可能以某种方式直接从Java模板访问DAO?我想实现类似于直接从Java模板访问DAO
<#foreach value="eventsDao.getEvents()" as="event">
<= value="event.getName()" />
</#foreach>
我觉得像写一切到控制器,然后到模板是没有必要的,限制了重复性。
此外,JSP,Freemarker和Apache Tiles之间有什么重大区别?他们允许这个吗?
是否有可能以某种方式直接从Java模板访问DAO?我想实现类似于直接从Java模板访问DAO
<#foreach value="eventsDao.getEvents()" as="event">
<= value="event.getName()" />
</#foreach>
我觉得像写一切到控制器,然后到模板是没有必要的,限制了重复性。
此外,JSP,Freemarker和Apache Tiles之间有什么重大区别?他们允许这个吗?
如果你真的想要做到这一点,打破模型视图分离......有办法。在JSP中,您有<%! ... %>
和<% ... %>
块,您可以在其中输入Java代码。在FreeMarker中,虽然不能插入Java块,但仍可以调用对象和类的公共方法。调用静态方法有点棘手,因为你不能在语言级别按名称访问类,但必须将某些东西放入模板的上下文(所谓的数据模型)中,才能做到这一点(请参阅: http://freemarker.org/docs/pgui_misc_beanwrapper.html#autoid_55“访问静态方法”)。我认为瓷砖在这个问题上无关紧要。
关于JSP,FreeMarker,Tiles问题:Tiles是一个视图合成框架,与JSP和FreeMarker无关,除了能够作为模板使用。
希望JSP和FreeMarker之间的区别很明显,但简而言之,FM对于典型视图构造(如循环)具有更简洁的语法,并且允许更直接地访问函数而无需定义和公开函数JSP方式。
关于MVC的“浪费”:当然,您可以在视图层做所有事情 - 没有什么能够阻止您编写体系结构不佳的系统,而对于小型应用程序,这可能无所谓。
你可以使用Pebble来做到这一点,它也有一个相当干净的语法;它看起来像下面这样:
{% for event in eventsDao.events %}
{{ event.name }}
{% endfor %}
除此之外,我还建议在卵石主要是因为这是template inheritance卵石的最大特点Velocity或者Freemarker的。
免责声明:我是Pebble的主要作者
有一个原因,事情分成控制器/道/视图层;在视图中具有这些类型的依赖关系通常是可维护性的一个坏主意。在一个理想的世界中,你只能将'Map'传递给视图,这样只有层之间最浅的依赖关系。 – beerbajay 2012-02-05 16:21:54