在采用FreeMarker做前台视图模板的情况下,我们可以通过<#include>标签和自定义宏来解决很多重复性工作。
一个简单的FreeMarker宏:
<#macro sayHello name=""> hello ${name} </#macro>
然后通过如下的形式调用:
<@sayHello name="shannon" />
不过这种在模板页中定义的宏能力有限。【1】假设,我们很多页面都要输出一个热门排行框,而排行数据需要从controller层动态获取,我们可以用这 种宏来完成所有的展示工作,但前提是相应的controller和接口中层需要预先将这些排行数据放到model中去,因此对于后端来说这也是一个重复性 的工作。那么有没有一种方式可以让后端也脱离这种重复工作呢?答案是肯定的,这也是写这篇博客的目的。
在一个偶然的机会发现jeecms项目中用到了这种方式,于是借鉴了一番。
FreeMarker不仅可以在前端的模板页中定义宏,还可以通过扩展其接口在后端实现宏,这有什么好处呢?这种方式就好比让你的模板页具备了从前 端再次回到后端的能力。这样我们就能很好的解决【1】处的假设,我们无需在各个controller的各个接口中去重复的向model中添加所需的排行数 据,而是当FreeMarker渲染模板页时遇到相应的宏它可以回到后端去调用相应的方法取到所需的数据。例子如下:
import freemarker.core.Environment; import freemarker.template.ObjectWrapper; import freemarker.template.TemplateDirectiveModel; /** * FreeMarker自定义宏 * 获取App下载排行列表 * 参数包括 length(列表长度) mtypeCode(主类型代码) typeCode(小类型代码) rankMode(排行模式1、2、3) * @author shannon * */ public class FMAppRankDirective implements TemplateDirectiveModel { @Resource(name = "appRankService") private AppRankService appRankService; @SuppressWarnings("unchecked") @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { //DirectiveUtils是借用jeecms项目中的工具类,主要是因为它集成了一些异常处理功能, //其实完全可以不用它,params是个Map,自己通过key取值就可以了,做一下空值判断 Integer length = DirectiveUtils.getInt("length", params); Integer mtypeCode = DirectiveUtils.getInt("mtypeCode", params); Integer typeCode = DirectiveUtils.getInt("typeCode", params); Integer rankMode = DirectiveUtils.getInt("rankMode", params); ArrayList<App> rankList = appRankService.getRankList(length, mtypeCode, typeCode, rankMode); env.setVariable("appRankList", ObjectWrapper.DEFAULT_WRAPPER.wrap(rankList)); if (body != null) { body.render(env.getOut()); } } }
通过实现FreeMarker的TemplateDirectiveModel就在后端实现了一个自定义的宏,这个宏的功能很简单,只是根据给定的参数将排行数据“appRankList”放到model中去,然后模板页中就可以使用这个变量了。
FreeMarker的配置参数中需要将这个宏加入进去。
<bean id="appRankDirective" class="com.shannon.example.rank.util.FMAppRankDirective" /> <bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> ……其他配置略…… <property name="freemarkerVariables"> <map> ……其他配置略…… <entry key="appRankDirective" value-ref="appRankDirective"/> </map> </property> </bean>
在模板页中使用:
<#-- 应用下载排行框,title为该框的标题,length为排行列表长度,mtypeCode为主类型代码,typeCode为小类型代码,rankMode为排行方式 1为总下载量,2为月下载量,3为昨日增长下载量 --> <#macro appRankBox title="" length=10 mtypeCode=1 typeCode=-1 rankMode=1> <@appRankDirective length=length mtypeCode=mtypeCode typeCode=typeCode rankMode=rankMode /> <h3 class="box-title">${title}</h3> <div class="box"> <ul class="row-list"> <#list appRankList as item> ……详细输出内容略…… </#list> </ul> </div> </#macro>
这里我在模板页中又定义了一个宏,负责内容及样式的输出,因为模板页中的宏比较直观,让后端的宏只负责拿数据。其他页面直接使用“appRankBox”就可以了,然后由它来调用后端的“appRankDirective”宏来拿数据。
这样,controller就从重复工作中脱身了。
你好,咨询一个问题。templateDirectiveBody对应的render方法到底是干什么用的。
就没有body。
如果用法如下:
<@appRankDirective ... > ... </@appRankDirective>
这标签中间的内容就是body
相关推荐
NULL 博文链接:https://zhenghuazhi.iteye.com/blog/1923544
里面 集合了 一个 简单的 Freemarker demo 代码 和一个 freemarker 自定义标签代码
spring mvc freemarker 自定义标签demo spring mvc 通过自定义的标签在jsp页面调用,初学,记录下做个备忘
一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx
NULL 博文链接:https://asialee.iteye.com/blog/2062313
在jfinal的基础上,实现freemarker自定义标签的自动扫描和注册,本资源包不含jfinal框架,需在已有框架的基础上添加包中的代码,如需jfinal框架请自行到官网下载
NULL 博文链接:https://renxin-327666062-qq-com.iteye.com/blog/1532731
该例采用单元测试,实现fremarker通用下拉框,满足所有web下拉框需求
spring boot + mybaits +freemarker +maven 架构来袭 注解版 spring boot + mybaits +freemarker +maven 架构来袭 注解版
使用Spring boot + FreeMarker 实现代码生成功能,完整案例可以查看 eladmin 项目,教程地址: https://www.ydyno.com/archives/1177.html
springsecurity(用spring ibatis freemaker)实现的用户自定义的权限管理页面, 里头包括数据库脚本 和原数据 和原代码 主要参考http://blog.csdn.net/k10509806/article/details/6369131 这个人的文章做的
springMVC3.2+Hibernate4+freemarker 代码框架采用springMVC3.2.4+hibernate4.2.8+freemarker2.3.16 功能方面只是一个简单的注册登录,前台使用freemarker渲染,使用了freemarker自定义标签。
支持生成DAO,PO,和sql语句的xml文件。
FreeMarker模板引擎不错,使用非常简单,其实可以做很多事情,比如代码自动生成,按格式生成work文件等,这里简单的实现了按照实体生成建表语句、action、biz、dao和对应的xml文件等
赠送jar包:freemarker-2.3.31.jar; 赠送原API文档:freemarker-2.3.31-javadoc.jar; 赠送源代码:freemarker-2.3.31-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.31.pom; 包含翻译后的API文档:...
赠送jar包:freemarker-2.3.30.jar; 赠送原API文档:freemarker-2.3.30-javadoc.jar; 赠送源代码:freemarker-2.3.30-sources.jar; 赠送Maven依赖信息文件:freemarker-2.3.30.pom; 包含翻译后的API文档:...
1. 使用Apache POI 3.9 自定义样式导出Excel文件; 2. 使用freemarker动态生成word .doc文档(带图片Word以及复杂格式word) 详细说明见个人博客及 github: https://github.com/DuebassLei/excel-poi
安装freemarker插件(freemarker的eclipse插件) a) 首先下载 freemarker-ide-0.9.14.zip(在这里不用下载了,附件中已经有了) b) 解压后:把hudson.freemarker_ide_0.9.14这个文件放到:eclipse\plugins下面 c) 发现...
本篇文章主要介绍了Spring Boot使用模板freemarker的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
FreeMarker,FreeMarker