java framemaker教程_《FreeMarker教程-笔录》

本文详细介绍了FreeMarker模板引擎的使用,包括如何通过FreeMarker生成.java类文件和.html文件。通过示例展示了如何配置环境,创建模板文件,以及如何在Java代码中使用FreeMarker进行动态内容生成。此外,文章还涵盖了FreeMarker的基本语法、内建函数、变量空判断以及宏指令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们学习一下FreeMarker模板引擎。它是基于模板文件生成其他文本的通用工具。本章我们主要讲使用FreeMarker模板引擎生成 .html 文件和生成 .java 类文件。

简介

FreeMarker是一款用java语言编写的模版引擎,它虽然不是web应用框架,但它很适合作为web应用框架的一个组件。

特点:

轻量级模版引擎,不需要Servlet环境就可以很轻松的嵌入到应用程序中

能生成各种文本,如html,xml,java,等

入门简单,它是用java编写的,很多语法和java相似

环境配置

首先我们需要配置FreeMarker环境,两种方式任选其一(推荐maven):

1.下载它的依赖jar包

2.用maven配置。

org.freemarker

freemarker

2.3.20

--------------好了,环境配好了我们开始搞点事情吧!

通过FreeMarker的模板文件生成java类文件

1.新建一个javaweb工程(eclipse/idea都可以)

2.在资源目录下新建一个templates目录(用来存放我们所有的FreeMarker模板文件xxx.ftl,模板文件的后缀名称为 ".ftl")

3.新建一个模板文件 hello.ftl (文件内容):

package ${classPath};//模板中变量引用(动态赋值)

public class ${className} {

public static void main(String[] args) {

System.out.println("${helloWorld}");

}

}

4.在java类的src目录包下(包名随便【不过需要注意的是要和代码里生成的包位置一致】)新建FreemarkerTest.java (文件内容):

package com.yu.scloud.baseframe.frame.freemarker;

import com.yu.scloud.baseframe.frame.pojo.User;

import freemarker.template.Configuration;

import freemarker.template.Template;

import java.io.*;

import java.util.*;

public class FreemarkerTest {

private static final String TEMPLATE_PATH = "src/main/resources/templates";//模板路径【指向你自己的模板文件存放路径】

public static void main(String[] args) {

autoGenJAVATest();//通过.ftl模板生成java类

}

//根据模板自动创建java类-示例

private static void autoGenJAVATest()

{

Map dataMap = new HashMap();

dataMap.put("classPath", "com.yu.scloud.baseframe.frame.freemarker");

dataMap.put("className", "AutoGenHello");

dataMap.put("helloWorld", "通过 演示 FreeMarker的HelloWorld!");

String DEST_PATH = "src/main/java/com/yu/scloud/baseframe/frame/freemarker";//目标路径【指向你自己的类文件存放路径】

genFileWithTemplate(TEMPLATE_PATH,DEST_PATH,"hello.ftl","AutoGenHello.java",dataMap);

}

//通过.flt模板生成file(封装了一下 方便统一调用)

private static void genFileWithTemplate(String templateDir,String destDir,String templateFileName,String destFileName,Map dataMap)

{

//创建freeMarker配置实例

Configuration configuration = new Configuration();

Writer out = null;

try {

//设置模版路径

configuration.setDirectoryForTemplateLoading(new File(templateDir));

//加载模版文件

Template template = configuration.getTemplate(templateFileName);

//生成数据

File docFile = new File(destDir + "\\" + destFileName);

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));

//输出文件

template.process(dataMap, out);

System.out.println(destFileName+" 模板文件创建成功 !");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (null != out) {

out.flush();

out.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

}

5.执行 FreemarkerTest.java的main方法,成功后会在上面代码中指定的DEST_PATH指向的目录下生成一个 AutoGenHello.java 文件,(文件内容):

package com.yu.scloud.baseframe.frame.freemarker;

public class AutoGenHello {

public static void main(String[] args) {

System.out.println("通过 演示 FreeMarker的HelloWorld!");

}

}

以上就是使用FreeMarker模板引擎生成.java类文件的全部过程。我们可以对生成的文件简单分析一下:

hello.ftl模板文件中 package ${classPath}; 被替换成了

package com.yu.scloud.baseframe.frame.freemarker;

public class ${className} { 被替换成了

public class AutoGenHello {

......

我们通过模板可以生成多种多样更加复杂的类文件,对于我们日常开发很有帮助。比如Spring框架中的 Controller、Dao、Service以及ServiceImpl,这些类文件我们反复会去创建,并且好多文件格式、方法都是差不多的,这样我们就可以通过模板引擎去一键创建,方便的不要不要滴~~~

接下来我们将使用FreeMarker模板生成html文件

通过FreeMarker的模板文件生成Html文件

其实很简单

新建 hello-html.ftl 文件(用来生成html的模板文件---示例代码中包含了FreeMarker基本的语法使用,东西相对比较多仔细阅读)

我们对上面生成java的那个类改造一下:替换一下你生成html文件的路径以及生成的文件名称:

FreemarkerTest.java类(文件内容):

package com.yu.scloud.baseframe.frame.freemarker;

import com.yu.scloud.baseframe.frame.pojo.User;

import freemarker.template.Configuration;

import freemarker.template.Template;

import java.io.*;

import java.util.*;

public class FreemarkerTest {

private static final String TEMPLATE_PATH = "src/main/resources/templates";//模板路径

//通过.ftl模板生成java类

public static void main(String[] args) {

autoGenHTMLTest();

// autoGenJAVATest();

}

//根据模板自动创建html-示例

private static void autoGenHTMLTest()

{

//给模板文件组装数据

Map dataMap = new HashMap();

User user=new User();

user.setName("Template-FreeMarker");

user.setId("123456789");

dataMap.put("user",user);

dataMap.put("title","FreeMarker自动生成HTML");

dataMap.put("datetime",new Date());

//设置列表数据

List peoples=new ArrayList<>();

for(int i=0;i<3;i++)

{

User user2=new User();

user2.setName("A"+i);

user2.setId("a"+i);

peoples.add(user2);

}

dataMap.put("peoples",peoples);

//设置map数据

HashMap employees=new HashMap<>();

for(int m=0;m<6;m++)

{

User user3=new User();

user3.setName("雇员"+m);

user3.setId("emp"+m);

employees.put(user3.getId(),user3);

}

dataMap.put("employees",employees);

String DEST_PATH = "src/main/resources/static/demo";//目标路径

genFileWithTemplate(TEMPLATE_PATH,DEST_PATH,"hello-html.ftl","hello.html",dataMap);

}

//通过.flt模板生成file

private static void genFileWithTemplate(String templateDir,String destDir,String templateFileName,String destFileName,Map dataMap)

{

//创建freeMarker配置实例

Configuration configuration = new Configuration();

Writer out = null;

try {

//设置模版路径

configuration.setDirectoryForTemplateLoading(new File(templateDir));

//加载模版文件

Template template = configuration.getTemplate(templateFileName);

//生成数据

File docFile = new File(destDir + "\\" + destFileName);

out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));

//输出文件

template.process(dataMap, out);

System.out.println(destFileName+" 模板文件创建成功 !");

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (null != out) {

out.flush();

out.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

}

}

hello-html.ftl 文件内容:

body{

color: #666666;

}

.title{

font-weight: bold;

color:#000;

}

${title}

名称:${user.name}

年龄:${user.id}
《FreeMarker语法汇总》
声明变量cdate="自定义变量"
条件判断
${cdate}
变量未声明

#if>

字符串截取(原始字符串:"字符串截取Demo"
截取索引为2的字符:${str[2]}
截取区间2-5字符串:${str[2..5]}
算数运算(声明了两个变量a=5,b=8)
"+":${a+b}
"-":${a-b}
"*":${a*b}
"/":${a/b}
"%":${a%b}
比较运算符
a大于等于b#if>
a小于b#if>
内建函数
第一个字母大写:${HELLO?cap_first}
所有字母小写:${HELLO?lower_case}
所有字母大写:${HELLO?upper_case}
数值取整(3.1415926):${fnum?int}
日期格式化:${datetime?string("yyyy-MM-dd")}
获取列表长度:${peoples?size}
遍历列表项:
  • 人:${people.name}

#list>

遍历Map项key:
  • 键:${key}--值:${employees[key].name}

#list>

遍历Map项value:
  • 值:${value.name}

#list>

引入其它ftl模板文件:
宏命令(自定义不带参数的标签)
不带参数宏:${title}

#macro>

宏命令(自定义带参数的标签)
带参数宏:${title}--${p0}--${p1}--${p2}

#macro>

${other.otherftl}

hello-other-html.ftl 文件内容:

我是被include的模板内容

User.java类内容:

package com.yu.scloud.baseframe.frame.pojo;

import java.io.Serializable;

public class User implements Serializable{

String id;

String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

执行 FreemarkerTest.java中的main方法,会在目录下生成 hello.html 文件内容(对比一下模板文件):

body{

color: #666666;

}

.title{

font-weight: bold;

color:#000;

}

FreeMarker自动生成HTML

名称:Template-FreeMarker

年龄:123456789
《FreeMarker语法汇总》
声明变量cdate="自定义变量"
条件判断
自定义变量
字符串截取(原始字符串:"字符串截取Demo"
截取索引为2的字符:串
截取区间2-5字符串:串截取D
算数运算(声明了两个变量a=5,b=8)
"+":13
"-":-3
"*":40
"/":0.625
"%":5
比较运算符
a小于b
内建函数
第一个字母大写:HelloMari
所有字母小写:hellomari
所有字母大写:HELLOMARI
数值取整(3.1415926):3
日期格式化:2018-04-14
获取列表长度:3
遍历列表项:
  • 人:A0
  • 人:A1
  • 人:A2
遍历Map项key:
  • 键:emp5--值:雇员5
  • 键:emp4--值:雇员4
  • 键:emp3--值:雇员3
  • 键:emp2--值:雇员2
  • 键:emp1--值:雇员1
  • 键:emp0--值:雇员0
遍历Map项value:
  • 值:雇员5
  • 值:雇员4
  • 值:雇员3
  • 值:雇员2
  • 值:雇员1
  • 值:雇员0
引入其它ftl模板文件:
我是被include的模板内容
宏命令(自定义不带参数的标签)
不带参数宏:FreeMarker自动生成HTML
宏命令(自定义带参数的标签)
带参数宏:FreeMarker自动生成HTML--参数0--参数1--参数2
另一个ftl文件定义的变量

以上是使用FreeMarker模板引擎生成Html文件的全部过程。

下面列一下FreeMarker的基本语法(以下为转载勿喷):

数据类型

和java不同,FreeMarker不需要定义变量的类型,直接赋值即可。

字符串: value = "xxxx" 。如果有特殊字符 string = r"xxxx" 。单引号和双引号是一样的。

数值:value = 1.2。数值可以直接等于,但是不能用科学计数法。

布尔值:true or false。

List集合:list = [1,2,3] ; list=[1..100] 表示 1 到 100 的集合,反之亦然。

Map集合:map = {"key" : "value" , "key2" : "value2"},key 必须是字符串哦!

实体类:和EL表达式差不多,直接点出来。

字符串操作

字符串连接:可以直接嵌套${"hello , ${name}"} ; 也可以用加号${"hello , " + name}

字符串截取:string[index]。index 可以是一个值,也可以是形如 0..2 表示下标从0开始,到下标为2结束。一共是三个数。

比较运算符

== (等于),!= (不等于),gt(大于),gte(大于或者等于),lt(小于),lte(小于或者等于)。不建议用 >,< 可能会报错!

一般和 if 配合使用

内建函数

FreeMarker 提供了一些内建函数来转换输出,其结构:变量?内建函数,这样就可以通过内建函数来转换输出变量。

html: 对字符串进行HTML编码;

cap_first: 使字符串第一个字母大写;

lower_case: 将字符串转成小写;

upper_case: 将字符串转成大写;

size: 获得集合中元素的个数;

int: 取得数字的整数部分。

变量空判断

!   指定缺失变量的默认值;一般配置变量输出使用

??  判断变量是否存在。一般配合if使用 #if>

宏指令

可以理解为java的封装方法,供其他地方使用。宏指令也称为自定义指令,macro指令

语法很简单: 声明macro #macro>; 使用macro

命名空间

可以理解为java的import语句,为避免变量重复。一个重要的规则就是:路径不应该包含大写字母,使用下划线_分隔词语,myName --> my_name

语法很简单:

其他没有说明的语法是因为和java一样,没什么特别之处。所以没有列出来。

SpringMVC整合FreeMarker

1.SpringMVC环境配置(这里就不展开了,不会的百度一下吧)

2.Maven配置:

org.freemarker

freemarker

2.3.20

org.springframework

spring-context-support

4.1.4.RELEASE

3.springmvc的配置文件:

4.Controller 层

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class HelloFreeMarkerController {

@RequestMapping("/helloFreeMarker")

public String helloFreeMarker(Model model) {

model.addAttribute("name","ITDragon博客");

return "helloFreeMarker";

}

}

5.最后是Freemarker文件

FreeMarker Web

Hello ${name} !

小结

1 知道了FreeMarker是一块模版引擎,可以生产xml,html,java等文件

2 知道了FreeMarker文件提供占位符,java文件提供数据,通过FreeMarker模版引擎生产有数据的页面,文中是将数据放在Map中。web应用可以用setter/getter 方法

3 知道了FreeMarker语法中字符串的显示特殊字符,截取的操作。以及一些内置方法的使用

4 重点了解FreeMarker的空判断知识点。判断变量是否为空用 "??" ,如果变量为空设置默认值。如果不注意空问题,可能会出现黄色页面的提示哦!

5 FreeMarker的宏概念,命名空间,引入文件,给变量赋值,集合的遍历等。

6 Freemarker 整合SpringMVC。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值