`

Freemarker是个好东西

 
阅读更多

    最近用freemarker做一个代码生成工具,以减少工作量,因为我们项目中开发已经格式化了、固定化了,为什么还要完全自己写呢。fm用起来尽管有不方便的地方,但功能确实挺强大的,下面分享一下我在使用中遇到的问题。

1.先说说常用的函数吧

html : 将特殊html标记进行转换,如<转换成&lt;

cap_first : 首字母大写

lower_case : 转换成小写

upper_case :转换成大写

trim : 剪掉前后空白

size :得到序列、数组的元素个数

int :获得小数的整数部分

substring (from,  toExclusive):取子串

contains :和java同

ends_with :  以…结尾 吗

starts_with :  以…开头吗

last_index_of :  最后的索引所在位置

length :  字符串长度

matches :是否 匹配 一个正则

replace :  替换
    ${"this is a car acarus"?replace("car", "bulldozer")}----------->
    this is a bulldozer abulldozerus

 

  fm的函数调用语法是变量名后面跟一个问号,再写上方法名,如:${test?upper_case}

  如果要调用2个以上的内置方法,则连续写,如:${test?upper_case?html}

 

2.自定义方法

  有时候内置的方法无法满足你的特殊需求,怎么办?实现TemplateMethodModelEx接口,使用方法 Object exec(List list),下面是一个取模板里变量类名的方法:

public class GetClsNameTMM implements TemplateMethodModelEx{
     private final static Log log= LogFactory.getLog(GetClsNameTMM.class);
    public Object exec(List list) throws TemplateModelException {
        if (list.size()!=1){
            return new TemplateModelException("wrong param number, must be 1!");
        }

        String name = list.get(0).class.toString();
        log.debug("class name of '"+list.get(0)+"' is '"+name+"'");
        return name;
    }
}

在java中定义参数map的时候:

root.put("nameOfClass", new GetClsNameTMM());
 

然后在模板里如下调用:

nameOfClass(${someVar})

 

3.如何取得变量类名

  如果是javabean,可以通过“变量.class.simpleName”或“变量.class.name”,但对于String这样的内置java类则得不到,原因是变量在模板中并不是原始的类型,fm会为每种类型选择一个合适的包装器,如果你想任意类型的变量都能取到类名,做进一步的判断,唯一的选择是2中提供的方法--定义一个方法,实现TemplateMethodModelEx

 

4.删除连续多个变量之间的换行符

 设想这样一个应用场景,你想生成一个java方法的代码,方法的参数是多个的,你一定不希望它是一行一个参数吧,那你就需要使用<#t>标签了,它的意思是去掉当前行首尾的空白,注意,换行也当成空白,当初看文档的时候不知道这一点,所以忽略了,好一顿google才找到答案。比如下面的例子:

  1 <#t> 
  2<#t> 
  3<#lt> 
  4 
  5<#rt> 
  6 

 执行后的结果是:

写道
1 23
4
5 6

 <#t>在行里的位置无所谓,类似还有<#lt><#rt>,意思是去掉左侧和右侧的空白。

 

5.如何判断变量是否存在或对象的属性是否为null

  用??进行判断,如下:

  <#if user??><h1>Welcome ${user}!</h1></#if>

  存在或有值则为true

 

6.如何输出${xxx} 这样的字符串

 

  jsp el的语法和fm很像,都支持${}这样来输出变量内容,当然jsp本身其实也是一种模板技术,二者本质是一样的,你如果想生成jsp el的代码就会遇到这个问题,不能直接写,否则fm会把它当成fm的东西来解析成它变量了,这时候需要使用<#noparse>标签。

 

<#noparse>${ccc}</#noparse>

  这样fm就不会把它当成变量来解析而是直接输出 ${ccc} 了

  还有其它很多功能就不说了,很容易在文档中找到,以上只是一些比较重要而且不容易找到答案的地方。

 

分享到:
评论

相关推荐

    jsp 静态引擎(freemarker)生成静态html案例

    个人觉得对于一个view层的东西来说,你要做的就是把view展现好就行了,不要再view中调用业务方法. 以前在公司做产品和后来做项目时就一再和手下的coder强调这点,但是因为种种原因,大家都还是会偷懒,直接在view中调用....

    Freemarker:我自己学习freemarker时写的关于freemarker的一些东西

    在这个"Freemarker:我自己学习freemarker时写的关于freemarker的一些东西"项目中,我们可以期待看到一些关于学习Freemarker的基础知识、实例和经验分享。 1. **Freemarker基本概念** - **模板语言**: Freemarker...

    FreeMarker(最全面的学习教程)

    迄今为止,学习FreeMarker最全面的、最权威的教程。 好东西,值得你拥有。

    struts2 好东西

    Struts2是一个强大的Java web应用程序框架...尽管在近年来Spring Boot等新兴框架的冲击下,Struts2的热度有所下降,但它依然是许多企业级项目的首选,尤其对于那些已经熟悉Struts2的开发者来说,它仍然是一个"好东西"。

    搭建struts hibernate log4j spring(好东西)

    本文将详细介绍如何在Web项目中集成Struts、Hibernate、Log4j以及Spring框架,构建一个完整的Java Web应用程序环境。这些技术组合在一起能够提供强大的功能支持,包括MVC架构实现、对象关系映射(ORM)、日志记录...

    有用的东西 mybatis

    【标题】:“有用的东西 mybatis” 在IT领域,MyBatis是一个非常重要的持久层框架,它简化了Java应用程序与数据库之间的交互。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。它将SQL语句与Java...

    jblog:一个简洁漂亮的Java博客,基于Spring MVC + Hibernate + MySQL + Bootstrap + freemarker。实现

    把重要的东西写下来保存是个很不错的选择。 写作的过程中会总结增强理解 分享能帮助有需要有人,还能在线与人交流一起探讨 下次遇到此类问题有据可查 温故而知新 等等... 遇到的问题&新生 写作

    基于MyEclipse的Java代码生成三层+页面的程序

    这个类在com.gogotown.service包里的CodeFactoryService类里,打开,修改一下...不过作者写的真好,学到了不少东西,面向对象用的很好,很棒。但是可能也会有瑕疵,大家有机会可以看看源码,程序路上一定要学会谦虚!)

    jqurey例子

    这是个应用到struts2.0,freemarker,jqurey的ajax部分做的一个简单的小例子.发现jqurey是个很强大的东西.很好的封装了javascript可以更好的取元素,和做特效.我感觉应该是个算是个插件吧.应用很灵活就引入一个js...

    struts2,Hibernian 写的一个教科书似的系统(值得学习)

    3. **结果类型**:定义了Action执行后的跳转方式,可以是JSP、Freemarker或其他模板技术。 4. **插件架构**:Struts2支持丰富的插件,如Struts2-dojo、Struts2-json等,方便扩展功能。 Hibernate的主要特性包括: ...

    jsp二维菜单,很好用的东西

    7. **SEO优化**:一个好的二维菜单系统还应该考虑到搜索引擎优化(SEO),确保每个菜单链接都能被搜索引擎正确抓取和理解。 在“example”这个压缩包文件中,可能包含了实现以上功能的JSP示例代码、JavaScript文件...

    ssm框架所需jar包

    2. **druid-1.1.6.jar**:Druid是一个强大的数据库连接池组件,提供监控、扩展性以及更好的性能。在SSM项目中,Druid通常作为数据源,负责管理数据库连接,提高数据库操作的效率。 3. **aspectjweaver-1.8.8.jar**...

    xdoclet-src-1.2.1.zip eclipse

    "xdoclet-src-1.2.1.zip eclipse缺少的这个东西"描述的可能就是这种问题,即用户在Eclipse环境中需要XDoclet的功能但未找到对应的集成。 在XDoclet-1.2.1源码中,我们可以看到以下几个关键部分: 1. **核心库**:...

    struts2.1.6 jar&出现404错误的原因,自己刚整理一些的东西

    这些JAR文件包括核心库、插件和依赖的第三方库,如ognl、freemarker等。缺失任何关键的JAR文件都可能导致404错误。可以通过检查项目构建路径或者Web应用的WEB-INF/lib目录来确认JAR文件的完整性和正确性。 再者,...

    最新struts2.1.1源码

    2. **结果类型(Result Types)**:除了默认的JSP结果外,Struts2还支持多种结果类型,如FreeMarker、Velocity等模板引擎,甚至可以跳转到另一个Action。 3. **插件支持(Plugin Support)**:Struts2允许扩展其...

    tmall_springboot:将导致的SSM天猫商城用SpringBoot重构,并加上一些新东西

    【标题】:“tmall_springboot:SSM天猫商城的SpringBoot重构与扩展” 这个项目“tmall_springboot”是针对原有的SSM...对于开发者来说,这是一个很好的学习和实践SpringBoot、微服务架构以及前端技术的实战项目。

    SpringBoot开发非常美观的java博客系统(包含后台管理功能)

    视图模板 Freemarker 其它 Jsoup、fastjson jQuery、Seajs Bootstrap 前端框架 UEditor/Markdown编辑器 font-Awesome 字体/图标 准备工作(sql文件在项目里面) 安装 Jdk8 安装 Maven 准备 IDE (如果你不看源码,...

    web基础笔记

    //concat()把两个数组内的元素放在一个数组内array1=array1.reverse();//reverse()倒序、反转array1=array1.sort();//排序 可在括号内指出排序的函数var str =array1.toString();//把数组转换成以逗号分隔的字符串...

    springboot-layui-qm平台:位置:springboot + mybatis-plus + shiro前端:layui模板引擎:freemartker数据库:postgresql基础后台管理架子

    该项目是一个简单的单体应用,就没有比它更简洁的画面了,基于springboot2.16,mybatis-plus,shiro,layui,freemarker,实现了maven打包罐加密,防止反编译,加载外部第三方库,加载外部配置文件,扩展jar包体积,...

Global site tag (gtag.js) - Google Analytics