`
yuanhuiwu
  • 浏览: 87223 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Freemarker模版实现接口和继承(上)

阅读更多

有时我们需要定义一些接口模版,让实现这个模版的开发人员遵循我们的设计。例如开发jsp模版时,定义好header,footer,子页面必须实现中间的内容contents.

 

如何才能实现freemarker接口模版,类似Java中的接口,在接口模版中定义一些“方法”,子模版override父模版中的“方法”?

 

其实利用freemarker的宏macro和inlcude指令,就可以达到我们的目的。宏macro已经设计的相当好了,可以带参数等,再加上<#include>指令,接口模版指日可待。

 

接口模版interface.ftl

 

start
< @mid/>
end

 

子模版implement.ftl

<#include "interface.ftl">
< #macro mid>
实现
< /#macro>

 

结果是:

 

start

实现

end

 

绝!

 

接口模版不能单独运行,因为找不到宏<@mid>定义,类似Java中的接口,子模版必须实现宏<@mid>。

子模版使用<#include>指令继承接口模版,并实现了宏<@mid>。

 

你笑了!!@!!@! 这就是接口啊?使用<#assign>在父模版定义一个变量,子模版实现不就可以了!!!

如果你正这样做了,现在的你正如当初的我。

 

想想Java中的变量和方法,<#assign>和<#macro>类似。

 

<#assign>定义和解释是同时进行的,在模版中的位置相当重要!

<#macro>定义和解释是分开的,只有调用时才会解释里面的内容;位置不重要;宏里面可以访问外面定义的变量,也可以使用local指令定义/替换局部变量。

 


所以子模版这样写也是可以的:


< #macro mid>
实现
< /#macro>

<#include "interface.ftl">

Java实现接口都是先implemnts interface,再重写接口方法。所以不推荐第二种写法。

 

顺藤摸瓜,类似Java中的继承, 如果我要开发extends.ftl,继承implement.ftl,我在extends.ftl中也写一个同名的宏< @mid>

 

extends.ftl

 

<#include " implement.ftl ">
< #macro mid>
继承
< /#macro>

 

结果:

 

start

实现

end

 

晕倒!

 

freemarker的宏有一个重要的特性:<#incluce>的模版优先使用自身的宏指令。

 

下一篇《Freemarker模版实现接口和继承(下)》介绍定义一个扩展<#include>标签的宏指令<@extends>,修改freemarker<#include>对宏指令解析的优先顺序 ,达到继承的效果。

1
4
分享到:
评论

相关推荐

    Freemarker模版实现接口和继承(下)

    NULL 博文链接:https://yuanhuiwu.iteye.com/blog/1133745

    freemarker模版继承

    扩充freemarker实现模版继承指令,可以实现类似java的继承,模版现在也可以继承了,也可以实现接口.freemarker interface,freemarker extends

    Struts2入门教程(全新完整版)

    方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 32 4.使用默认的execAndWait拦截器 33 5. ...

    Struts2 in action中文版

    4.5.1 实现Interceptor接口 78 4.5.2 构建AuthenticationInterceptor拦截器 79 4.6 小结 82 第5章 数据转移:OGNL和类型转换 84 5.1 数据转移和类型转换:Web应用程序领域的常见任务 85 5.2 OGNL和Struts 2 85 ...

    Spring 2.0 开发参考手册

    14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.5. 绑定支持和表单处理 14.5. XSLT 14.5.1. 写在段首 14.5.2. 小结 14.6. 文档视图(PDF/...

    struts2讲义_吴峻申

    5.6.1 主题和模板介绍 116 5.6.2 非表单标签介绍 119 5.7 Struts2自定义标签实现图形验证功能 121 第6章 Struts2非JSP视图技术 125 6.1 velocity视图技术使用介绍 125 6.2 freemarker视图技术使用介绍 128 6.3 ...

    Spring中文帮助文档

    14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.5. 绑定支持和表单处理 14.5. XSLT 14.5.1. 写在段首 14.5.2. 小结 14.6. 文档视图(PDF/...

    Spring API

    14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.5. 绑定支持和表单处理 14.5. XSLT 14.5.1. 写在段首 14.5.2. 小结 14.6. 文档视图(PDF/...

    Spring-Reference_zh_CN(Spring中文参考手册)

    11.2. 利用JDBC核心类实现JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口 ...

    spring chm文档

    14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 14.4.5. 绑定支持和表单处理 14.5. XSLT 14.5.1. 写在段首 14.5.2. 小结 14.6. 文档视图(PDF/...

    Code-Generate::rocket: 一个基于原生Mysql & SpringBoot & Mybatis 的代码生成器,建表之后即可完全解放双手

    允许开发者继承接口实现自定义文件内容,阅读简单开源项目的首选 测试同学的测试Demo案例,1秒钟造一个,就说快不快 学生党快速交作业(咳咳咳,如果你是该类,一定要关注加点赞啊!) 效果演示 步骤说明: 自行建立...

    单点登录源码

    服务网关,对外暴露统一规范的接口和包装响应结果,包括各个子系统的交互接口、对外开放接口、开发加密接口、接口文档等服务,可在该模块支持验签、鉴权、路由、限流、监控、容错、日志等功能。示例图: ![API网关]...

    cms后台管理

    类ContentListDirective继承自AbstractContentDirective,最主要的是execute方法 public class ContentListDirective extends AbstractContentDirective { /** * 模板名称 */ public static final String TPL...

Global site tag (gtag.js) - Google Analytics