z1109079622 发表于 2021-2-15 18:24:26

自己记的freemarker笔记,分享出来学习

本帖最后由 z1109079622 于 2021-2-15 18:29 编辑

# freemarker 网页显示有点问题,我把源文件放到附件里了

## 一、数据类型

### 1.布尔型

```
布尔类型不能直接输出,要先转化为字符串
```

- `?c`
- `?string`

`${flag?string("yes","no")}`:如果flag的值是true,那值就是yes,如果是false那值就是no

### 2.日期类型

```
布尔类型不能直接输出,要先转化为日期类型或字符串
```

- `?date`:年月日
- `?time`:时分秒
- `?datetime`:年月日时分秒
- `?string("自定义日期格式")`:yyyy-MM-dd HH-mm-ss

`${createDate?string("yyyy年MM月dd日 HH:mm:ss")}`

### 3.数值类型

```
数值类型可以直接输出
```

#### 转字符串

- `?c`:转普通字符串
- `?string.currency`:货币型字符串
- `?string.percent`:百分比型字符串

#### 保留浮点型数值指定小数位

- `?string["0.##"]`

`${avg?string["0.##"]}`:保留小数点后两位

### 4.字符串类型

#### 常用api

- `?substring(start,end)`:截取字符串(左闭右开)
- `?uncap_first`:首字母小写输出
- `?cap_first`:首字母大写输出
- `?lower_case`:字母转小写
- `?upper_case`:字母转大写
- `?length`:获取字符串长度
- `?starts_with("A")?string`:是否以指定字符串开头(boolean)
- `?ends_with("B")?string`:是否以指定字符串结尾(boolean)
- `?index_of("AAA")`:获取指定字符处的索引
- `?trim`:去除字符串前后空格
- `?replace("A","B")`:替换指定字符串

#### 字符串空值的处理

```
FreeMarker的变量必须赋值,否则就会抛出异常。而对于 FreeMarker来说,null值和不存在的变量是完全一样
的,因为 FreeMarker无法理解 null值
```

##### "!"指定确实变量的默认值

`${value!"默认值"}`:如果value值为空,那默认值是字符串:默认值

##### "??"判断变量是否存在

`${(value??)?string}`:如果变量存在,就返回true,不存在就返回false

### 5.sequence序列类型

```
数组、list、set
```

#### 输出

使用**#list**进行输出

```xml

      ${元素名}


```

#### api

- `${序列名?size}`:获取序列的长度
- `${序列名?index}`:获取序列元素的下标
- `${序列名?first}`:获取第一个元素
- `${序列名?last}`:获取最后一个元素
- `${序列名?join(",")}`:以","分隔 把数组拼成一个字符串
- ` `:倒序输出
- ` `:升序输出
- ` `:降序输出

#### 如果list集合元素是JavaBean

**JavaBean**对象的属性一定要有对应的get方法才能获取对应的值

```xml

      ${user.id}


```

按照指定字段排序

```xml

      ${user.id}


```

### 6.hash类型

```
Map集合
也是用list标签输出
```

- 获取key并通过key获取value

```

          ${key}
          ${hash}

```
- 直接获取map的value

```

          ${value}

```

## 二、常用指令

### assign

```
使⽤assign指令你可以创建⼀个新的变量, 或者替换⼀个已经存在的变量。
```

```
(可以定义多个变量)


```

### 逻辑判断指令

**注:小于是lt、 大于是gt、大于等于是gte、 小于等于是lte**

```

...

...

...

...

```

### list

- ```



```
- ```



                  当没有选项时,执⾏else指令

```

### macro 自定义指令

- 不带参数的

```
格式:

                  指令内容


使⽤:

```
- 带参参数的

```
格式:

                  指令内容


使⽤:

```

### nested占位符

```
可以将⾃定义指令中的内容通过nested指令占位,当使⽤⾃定义指令时,会将占位内容显示。
```

```

      这是⼀段⽂本!


这是⽂本后⾯的内容!
```

### import

```
导入其他flt的命名空间,就可以使用命名空间中定义的宏和方法了
```

```




```

### include

```
在freemarker中插入整个页面。html文件或者freemarker文件都可以
```

## 三、FreeMarker页面静态化

```
用于输出html
可以把数据库中的数据写入到html中,用于内容不经常改变的页面
```

- 服务器

```java
// 实例化模板配置对象
Configuration configuration = new Configuration();
// 设置加载模板的上下⽂ 以及 设置加载模板路径(模板存放的路径)

configuration.setServletContextForTemplateLoading(getServletContext(),"/template");
// 设置模板的编码格式
configuration.setDefaultEncoding("UTF-8");
// 加载模板⽂件,获取模板对象
Template template = configuration.getTemplate("news.ftl");

// 设置模型数据
Map map = new HashMap();
map.put("title", "特别就业季:稳就业情况如何? 哪些问题待解?");
map.put("source", "⼈⺠⽇报");
map.put("pubTime", new Date());
map.put("content", "中共中央政治局常务委员会近⽇召开会议强调," +
"要有针对性地开展援企、稳岗、扩就业⼯作," +
"做好⾼校毕业⽣、农⺠⼯等重点群体就业⼯作," +
"积极帮助个体⼯商户纾困。疫情期间,稳就业情况如何?还有哪些问题待解?" +
"记者采访了不同群体,记录这个特别的就业季。");

// 获取项⽬所在的根⽬录
String basePath = request.getServletContext().getRealPath("/");
// 设置⻚⾯存放的⽬录
File htmlFile = new File(basePath + "/html");
// 判断⽬录是否存在
if (!htmlFile.exists()) {
// 如果⽬录不存在,则新建⽬录
          htmlFile.mkdir();
}
// 获取⽂件名(随机⽣成不重复的⽂件名)
String fileName = System.currentTimeMillis() + ".html";
// 创建html⽂件
File file = new File(htmlFile, fileName);
// 获取⽂件输出流
FileWriter writer = new FileWriter(file);

try {
// 输出html      将模型数据填充到模板中
          template.process(map, writer);
// 输出成功
          System.out.println("新闻创建成功!");
} catch (TemplateException e){
      e.printStackTrace();
} finally {
          writer.flush();
      writer.close();
}

```
页: [1]
查看完整版本: 自己记的freemarker笔记,分享出来学习