FreeMarker模板继承

SpringBoot入门实战:SpringBoot整合Freemarker 1.背景介绍 Freemarker是一个模板引擎,它能够将一个复杂的文本或者结构化数据文件转换成另一种格式,例如html、xml等。在Java开发中,我们通常都会用jsp或其他模板引擎。但是由于jsp存在缺陷,如性能不佳、语法复杂等,导致很多人转向了其他的模板引擎,如Thymeleaf、FreeMarker等。一般来说,选择一个合适的模板引擎对项目开发 阅读详情

动机

freemarker默认是没有模板继承功能的,为其添加新指令@extends,@block,@override,@super,这些指令属于rapid-framework的扩展。

问题

但是,都说加上rapid-framework的jar包,然后修改配置文件就够了, 但是你会发现出现一下问题:

12-May-2017 16:43:11.123 SEVERE [http-nio-8081-exec-1]
org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service()
for servlet [mvc-dispatcher] in context with path [] threw exception
[Handler processing failed; nested exception is
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils]
with root cause java.lang.ClassNotFoundException:
org.apache.commons.lang.StringUtils at
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333)
at
org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)
at
cn.org.rapid_framework.freemarker.directive.DirectiveUtils.getRequiredParam(DirectiveUtils.java:34)
at
cn.org.rapid_framework.freemarker.directive.BlockDirective.execute(BlockDirective.java:22)
at freemarker.core.Environment.visit(Environment.java:427) at
freemarker.core.UnifiedCall.accept(UnifiedCall.java:101) at
freemarker.core.Environment.visit(Environment.java:327) at
freemarker.core.Environment.visit(Environment.java:333) at
freemarker.core.Environment.process(Environment.java:306) at
freemarker.template.Template.process(Template.java:384) …… at
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

注意, 最开头的报错:

java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils]
with root cause java.lang.ClassNotFoundException:
org.apache.commons.lang.StringUtils

所以还需要添加commons.lang相关jar包

开发环境

Tomcat 8.0.42
java 1.8.0_121
IntelliJ IDEA

需要的jar包

  • maven用户
    在pom.xml中添加以下依赖
<dependency>
     <groupId>com.googlecode.rapid-framework</groupId>
     <artifactId>rapid-core</artifactId>
     <version>4.0.5</version>
</dependency>
<dependency>
     <groupId>commons-lang</groupId>
     <artifactId>commons-lang</artifactId>
     <version>2.6</version>
</dependency>

配置文件

需要在${servelet-name}.xml中添加Freemarker拓展配置


    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath">
            <value>WEB-INF/FTL/</value>
        </property>
        <!--设置freemarker环境属性-->
        <property name="freemarkerSettings">
            <props>
                <prop key="template_update_delay">5</prop><!--刷新模板的周期,单位为秒 -->
                <prop key="default_encoding">UTF-8</prop><!--模板的编码格式 -->
                <prop key="locale">UTF-8</prop><!-- 本地化设置 -->
                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                <prop key="time_format">HH:mm:ss</prop>
                <prop key="number_format">0.####</prop>
                <prop key="boolean_format">true,false</prop>
                <prop key="whitespace_stripping">true</prop>
                <prop key="tag_syntax">auto_detect</prop>
                <prop key="url_escaping_charset">UTF-8</prop>
                <prop key="classic_compatible">true</prop>
            </props>
        </property>
        <!--设置模板继承的参数-->
        <property name="freemarkerVariables">
            <map>
                <!--<entry key="xml_escape" value-ref="fmXmlEscape" />-->
                <entry key="extends" value-ref="extendsDirective"/>
                <entry key="override" value-ref="overrideDirective"/>
                <entry key="block" value-ref="blockDirective"/>
                <entry key="super" value-ref="superDirective"/>
            </map>
        </property>
    </bean>

    <!-- freemaker  Directive-->
    <bean id="blockDirective" class="cn.org.rapid_framework.freemarker.directive.BlockDirective"/>
    <bean id="extendsDirective" class="cn.org.rapid_framework.freemarker.directive.ExtendsDirective"/>
    <bean id="overrideDirective" class="cn.org.rapid_framework.freemarker.directive.OverrideDirective"/>
    <bean id="superDirective" class="cn.org.rapid_framework.freemarker.directive.SuperDirective"/>

添加了

property name="freemarkerVariables">
            <map>
                <!--<entry key="xml_escape" value-ref="fmXmlEscape" />-->
                <entry key="extends" value-ref="extendsDirective"/>
                <entry key="override" value-ref="overrideDirective"/>
                <entry key="block" value-ref="blockDirective"/>
                <entry key="super" value-ref="superDirective"/>
            </map>
        </property>

与之相对应的是bean的设置

<!-- freemaker  Directive-->
    <bean id="blockDirective" class="cn.org.rapid_framework.freemarker.directive.BlockDirective"/>
    <bean id="extendsDirective" class="cn.org.rapid_framework.freemarker.directive.ExtendsDirective"/>
    <bean id="overrideDirective" class="cn.org.rapid_framework.freemarker.directive.OverrideDirective"/>
    <bean id="superDirective" class="cn.org.rapid_framework.freemarker.directive.SuperDirective"/>

至于@block,@extends, @override的实例,可以参考链接:
http://coolpeanut.site/home1/page4.html

深入理解Freemarker模板继承与接口实现(下) Freemarker是一个用于Java程序中的模板引擎,它允许你将业务逻辑与页面展示分离,从而使得开发者可以更专注于业务逻辑的实现。模板文件通常以.ftl作为文件扩展名,里面包含了嵌入的Freemarker指令,用于控制数据的输出格式和页面布局。是Freemarker中一个抽象类,它封装了模板环境(Environment)的操作接口。Freemarker的模板渲染都是在环境中完成的,因此在整个渲染过程中起着承上启下的作用。// ... 其他方法。 阅读详情

相关推荐

freemarker模版继承

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

rapid_framework.freemarker error extendsDirective

[b][color=red] 解决方法:因为默认的rapid_framework 3.5.0.1 下载包 未带上 freemarker jar 加入lib即可[/color][/b] [code="java"] org.springframework.beans.factory.CannotLoadBeanClassException: Error loading cl ass [...

要耐得住寂寞 238

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

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

freemarker继承,实现模板的继承

现扩展freemarker,新增加三个指令: @extends,@block,@override 一.目的 父模板页面定义好布局,子模板可以重定义布局中的部分内容 使模板可以实现类似"类"的继承关系,并不限继承层次 二.继承概榄 父模板: base.ftl  &lt;html&gt;      &lt;head&gt;          &lt;@block name="head"&gt...

bingguang1993的博客 1797

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3137

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权

uniapp+华为HBuilder X 4.29跑鸿蒙模拟器报错没有签名授权报错信息11:39:47.976 安装 .hap 到鸿蒙设备 ...11:39:48.517 运行所需的权限没有签名授权,请参考 配置文档11:39:48.517 安装失败。

weixin_66071584的博客 1350

说明freemarker,实现模板的继承

现扩展freemarker,新增加三个指令: @extends,@block,@override 一.目的 父模板页面定义好布局,子模板可以重定义布局中的部分内容 使模板可以实现类似"类"的继承关系,并不限继承层次 二.继承概榄 父模板: base.ftl html>       head>           @block name="head">base_head_c

oceansky123的专栏 4271

从零开始的机械臂yolov5抓取gazebo仿真(一)

本文介绍了如何将机械臂模型导出为URDF

qq_48427527的博客 1万+

springboot使用Freemarker继承

springboot 使用Freemarker继承 最近需要用到Freemarker的继承。但是发现没有关于springboot配置Freemarker的继承的。所以趁现在有时间写个博客。 1. Freemarker继承介绍Freemarker 通过 rapid java实现继承。实际是rapid的jar包提供的三个自定义标签。实现继承用到的有三个标签:@extends,@block ,@ove

liuYinXin的博客 3004

从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境

本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。

weixin_26878995的博客 489

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略

本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。

weixin_29233857的博客 247

Freemarker继承模板和自定义模板的使用

Freemarker模板可以省下很多时间,特别是一个框架类型的web工程或者pdf模板等都很适用。 不多说废话直接说重点: 1.配置freemarker视图解析器 freemarker视图解析器我们常用的是jsp视图解析器,可以多个解析器一起使用的哦! &lt;bean id="viewResolverFtl" class="org.springframework.web.servlet...

辉之素狂 2206

学习C++的递归函数(包含汉诺塔讲解)

简单来讲,递归函数就是函数本身自己调用自己,那么函数又是什么呢?#include <stdio.h> //这行是头文件,不同的头文件可以用不同的函数int main() //这里就是一个main函数//这里是你要编写程序的内容return 0;(这是个小细节如下)所以我们平时用来练习的就是一个main函数,而且是一个整型类型的函数,而这也是最后一句话为什么要加一句 return 0;了,因为它最后要返回整数类型,其它整数也可以,但是大家规定为0,这是C++自带的函数。

2302_81032013的博客 2594

spring 整合freemarker 实现模板继承

用的是rapid框架中实现的freemarker 继承功能, spring freamarker配置部分: [code="xml"] 0 UTF-8 zh_CN [/code]...

cmzx344的专栏 396

从 Service Entry Sheet 按 PO 行项目追溯服务行:PACKNO 与 ESLL 层级解包实战

摘要: SAP MM模块中,外部服务采购的数据结构较为复杂,服务明细并非直接存储在采购订单行项目表EKPO中,而是通过PACKNO关联到服务包表ESLL。本文解析了从采购订单行项目EBELN+EBELP获取服务行号SRVPOS的方法,重点分析了服务包的层级结构(根包、子包SUB_PACKNO),并提供了兼容合同项目的ABAP代码实现。通过EKPO-PACKNO定位根包后,需结合ESUC和ESLL表逐层解析子包,最终获取服务明细数据,解决了服务采购场景下的数据关联难题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 169

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-差分信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的差分拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 440

扩展freemarker,实现模板的继承

  现扩展freemarker,新增加三个指令: @extends,@block,@override   一.目的   父模板页面定义好布局,子模板可以重定义布局中的部分内容 使模板可以实现类似"类"的继承关系,并不限继承层次   二.继承概榄 父模板: base.ftl   &lt;html&gt; &lt;head&gt; &lt;@block na...

245

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

rapid-framework强化freemarker模板继承在struts下也可以用

freemarker的模板是没有继承功能的。rapid-framework提供了几个directive实现了这个功能。 不过官方文档上给出的例子只有跟spring-mvc的支持 struts的展示层支持做的比较死,只靠修改配置无法实现。当然更可能是我没有发现,如果您知道往不吝

easyroom的专栏 2503

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Struts2+Freemarker 实现Django模板继承功能

最近在学习Django,对它的模板继承功能爱不释手,相比以前的使用过的Sitemesh来说,其功能、灵活性、易用性、复用性都比sitemesh高出一大截。 于是结合struts2+Freemarker做过的项目进行思考,原来用struts2+Freemarker也可以轻松做到Django模板的功能,几天试用下来,那不是一般的爽,sitemesh暂时放一边去吧。 以一个例子来说明 1. 首先定...

you_hurt_my_heart的专栏 207

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

php 原生 实现模板继承,谈谈模板继承思想的实现(以freemarker为例)

一、什么是模板继承模板继承不同于模板布局,甚至来说,应该在模板布局的上层。模板继承其实并不难理解,就好比类的继承一样,模板也可以定义一个基础模板(或者是布局),并且其中定义相关的区块(block),然后继承(extend)该基础模板的子模板中就可以对基础模板中定义的区块进行重载。或者更确切的比喻,模板继承更像是java中的implement,而不是extent,尽管在大量php、python、ru...

weixin_39567222的博客 457

springboot使用Freemarker支持模版继承

springboot使用Freemarker继承

ycc297876771的博客 2280

JAva继承编写自行车例子,java – Freemarker中的继承/实例检查

我的用例是为用户提供在模板引擎的帮助下创建报表的可能性.因此,我提取了我的数据模型的相关部分,并将Freemarker集成为模板引擎.到目前为止它工作得很好,但现在我的数据模型包含某些位置的继承 – 但Freemarker似乎不支持操作的实例?如何处理这个问题?是否有其他模板引擎支持模型中的继承?虚构的例子:我有两个班级“汽车”和“自行车”,扩展“车辆”.该模型包含一个“车队”类,其中包含车辆清单...

weixin_35305499的博客 232

springboot加载远程freemarker模板

springboot加载远程freemarker模板ftl 解决方法: 1、springboot启动类继承以下类即可:http://www​.yayihouse.com/yayishuwu/chapter/1675

qq_30908729的博客 826
上一篇: FreeMarker中文乱码
下一篇: SpringMVC 将复杂对象以json格式返回前端
猪杂汤饭
博客等级 码龄12年 238粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值