环境准备
导入包 freemarker.jar (struts2自带)
代码生成器的halloWorld
案例:每个IXXXDAO都要继承于泛型dao接口,比如
package com.lwf.dao; //包所在目录
import com.lwf.domain.Permission; //引用的domain包
public interface IPermissionDAO extends IgenericDAO<Permission>{
}
1 . 创建模版文件夹,和IDAO的模版文件
//用${className} 代替Permission
package com.lwf.dao;
import com.lwf.domain.${className};
public interface I${className}DAO extends IgenericDAO<${className}>{
}
2 . 编写代码生成器的java代码
- 目标=模版+数据模型,
- 此处的路径,都是在项目的根目录下的路径
public static void main(String[] args) throws Exception {
//声明模版的目录
Configuration cfg=new Configuration();
File f = new File("src/main/java/codegen/template");
cfg.setDirectoryForTemplateLoading(f);
//获取模版对象
Template template = cfg.getTemplate("IDAO.ftl");
//创建数据模型对象
Map<String,Object> map= new HashMap<>();
map.put("className", "Brand");
//生成代码
File out=new File("src/main/java/com/lwf/dao/IBrandDAO.java");
template.process(map, new FileWriter(out));
}
之后会在src/main/java/com/lwf/dao中生成IBrandDAO.java的文件
package com.lwf.dao;
import com.lwf.domain.Brand;
public interface IBrandDAO extends IgenericDAO<Brand>{
}
数据模型的规则
1. 模板语言概念
- 插值:`${XX}`,在生成目标文件时候,根据数据模型,替换模版中的${XX}内容
- FTL标签: 逻辑语言,指令
- 注释: <#-XXX->
- 标准本文,除了上面三个,其他原样输出.
2. 插值的使用
- 简单使用
- 直接输出
${userName},${user.userName}
- 若不存在该userName,会报错.
- 不存在user,会报错.
- 直接输出
处理不存在的插值
- ${插值!”默认值”},若插值不存在,取默认值.
- ${插值!”“},若插值不存在,就不写.
- ${user.userName!”“} ,若user不存在,依然报错,仅代码最后一个可以为空
- ${(user.userName)!”“},诺user不存在,就不写,不会报错
对象中的方法
- ${user.getName()};
与el表达式不同点
- el表达式可以访问简单值的在java中方法 如:${字符串.subString(1)}
- freemarker,使用简单值的方法,是其内建的,不是java中的方法.
- 复杂操作,尽量在后台完成.
- freemarker的内建函数
- 首字母大写
${"green mouse"?cap_first}
结果:Green mouse
- 首字母大写
3. 指令的使用
判断指令
<#if 条件1>结果1
<#elseif 条件2>结果2
<#else>其他结果</#if>- 条件语句为boolean表达式:
<,>,==,!=,==null
判断对象是否存在:
<#if user.name??>
user.name存在就返回true,若user不存在,就报错.<#if (user.name)??>
任何一个层级不存在,就返回false .
- 遍历指令
<#list 集合 as 元素>
${元素}
</#list>