有时我们需要定义一些接口模版,让实现这个模版的开发人员遵循我们的设计。例如开发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>对宏指令解析的优先顺序
,达到继承的效果。
分享到:
相关推荐
总结,Freemarker模版技术提供了丰富的功能,如模板继承、自定义指令等,使得开发者能够灵活地构建动态内容。通过深入理解上述类和接口的工作机制,我们可以更有效地利用Freemarker进行模板设计和开发。
扩充freemarker实现模版继承指令,可以实现类似java的继承,模版现在也可以继承了,也可以实现接口.freemarker interface,freemarker extends
4. **模板继承和导入**: 使用`<#include>`和`<#import>`,可以实现模板的复用和模块化。模板继承允许子模板继承父模板的结构,只需覆盖特定部分。 5. **注释**: 在FreeMarker中,`<!--#-->`用于HTML注释,`...
- `TemplateModel`:所有数据模型对象都必须实现此接口,以供FreeMarker访问。 4. **数据模型绑定** - `Map`:常用的数据模型,键值对形式,可以通过`ModelData`将Java对象转换为FreeMarker可识别的格式。 - `...
模板继承则通过`<#assign>`和`<@parent>`实现,子模板可以继承父模板的结构,然后进行定制。 5. **控制结构** Freemarker提供丰富的控制结构,如条件语句(`<#if>`, `<#elseif>`, `<#else>`)和循环(`<#foreach>`...
总的来说,自定义FreeMarker标签是提高模板引擎灵活性和扩展性的有效方式,也是Java开发中的一个重要技能。通过深入理解FreeMarker的工作原理和API,开发者可以构建出更强大、更符合项目需求的模板解决方案。
在分页应用中,Spring可以用来创建服务层接口和实现,负责与数据库交互,处理分页逻辑。 **Spring Data JPA** 是Spring框架的一个模块,它简化了JPA(Java Persistence API)的使用,使得数据访问更加方便。通过...
3. **配置Repository**:定义一个接口继承自JpaRepository,该接口将自动提供CRUD(创建、读取、更新、删除)操作。也可以自定义更复杂的查询方法。 4. **创建Freemarker模板**:在src/main/resources/templates...
- 使用模板继承和导入提高模板复用性。 - 合理配置模板缓存,优化性能。 7. **进阶特性** - **指令**:如`<#assign>`分配变量,`<#import>`导入其他模板。 - **自定义函数**:通过`TemplateMethodModelEx`接口...
- **模板继承**:使用`<#import>`和`<#include>`指令可以引入其他模板,实现模板的复用。 - **布局模板**:通过`<#assign>`和`<@...>`指令,可以定义布局模板,实现模板的统一风格。 6. **Freemarker与Spring集成...
3. **模板继承**:通过`<#include>`指令,可以实现模板的继承和复用,提高代码的可维护性。 4. **国际化支持**:FreeMarker支持多语言环境,方便进行国际化(i18n)处理。 5. **预编译功能**:可以预先编译模板,...
3. 使用模板继承和导入(`#import`)来复用和组织模板片段。 **错误处理** FreeMarker会在遇到错误时抛出异常,如模板语法错误、数据模型缺失等。你应该捕获这些异常,并提供有意义的错误信息给用户。 总之,...
标题“Spring使用Freemarker发送邮件的一个简单模板”指的是通过Spring的JavaMailSender接口和Freemarker模板来生成和发送邮件。首先,我们需要在项目中引入Spring和Freemarker的相关依赖,确保能够使用这两个库的...
1. **编写Java类**:你需要定义一个处理自定义标签的Java类,这个类需要继承`freemarker.template.TemplateDirectiveModel`接口,并实现其方法。在这个类中,你可以编写处理逻辑,如接收参数、处理数据、生成输出。 ...
- **模板继承**:通过`<#assign>`和`<#macro>`实现模板的复用和扩展,`<#import>`和`<#namespace>`处理命名空间。 - **内置对象**:如`request`、`session`、`application`等,可以直接在模板中访问HTTP上下文中的...
Freemarker是一款强大的模板引擎,常用于Web应用中的视图层,实现动态内容的生成。它采用声明式编程,使得开发者可以专注于数据的处理,而不用关心如何将数据呈现到页面上。本资源包含了Freemarker的中文手册和教程...
- 自定义的MyBatis缓存实现,继承自`Cache`接口,利用Spring Data Redis操作Redis。 - Spring Boot的Controller层,负责接收请求并调用Service层处理业务逻辑。 - Service层,其中包含使用MyBatis和Solr进行数据操作...
在本项目中,我们主要探讨如何手动构建一个基于SpringMVC、Spring Data JPA、Hibernate以及FreeMarker模板引擎的Maven工程,同时实现环境切换功能。这个基础框架为日常开发工作提供了必要的支持。 首先,SpringMVC...
在Freemarker的API方面,我们可以看到一系列的类和接口,如`Configuration`用于设置Freemarker的全局配置,`Template`表示一个模板文件,`Environment`提供了模板执行时的上下文信息。开发者还可以通过`...
1. **创建自定义标签库**:定义一个Java类作为自定义标签的处理器,继承自`freemarker.template.TemplateDirectiveModel`接口,并实现其方法。在这个类中,你可以编写处理标签逻辑的代码。 2. **配置扫描路径**:...