本帖最后由 小石姐姐 于 2017-12-11 16:19 编辑
## Freemarker
* FreeMarker 是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式的文本用来自动生成源代码)的通用工具
* 扩展名.ftl文件 (采用.html文件也可以)
* 步骤
* 模板 + 数据模型 = 输出
* 1、创建Configuration,生成模板实例
* Configuration configuration = new Configuration();
* configuration.setDirectoryForTemplateLoading(new File("ftl文件位置"));
* 2、指定使用模板文件,生成Template实例
* Template template = configuration.getTemplate("flt文件名");
* 3、填充数据模型,数据模型就是一个Map
* Map<String, String> map = new HashMap<String, String>();
* map.put(key, value);
* 4、调用Template实例process完成数据合并
* template.process(map, 目标Writer输出流);
* 默认值不存在
* 不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况, 通过在变量名后面跟着一个!和默认值
* `<h1>Welcome ${user!"Anonymous"}!</h1>`
* 通过放置??来询问 FreeMarker 一个变量是否存在。将它和 if指令合并,那么如果 user 变量不存在的话将会忽略整个问候代码段
* `<#if user??><h1>Welcome ${user}!</h1></#if>`
* 字符串使用的内建函数:
* html: 字符串中特殊 HTML 字符需要用实体引用代替(比如<代替<)
* cap_first:字符串的第一个字母变为大写形式
* lower_case:字符串的小写形式
* upper_case:字符串的大写形式
* trim:去掉字符串首尾的空格
* 序列使用的内建函数:
* size:序列中元素的个数
* 数字使用的内建函数:
* int:数字的整数部分(比如-1.9?int 就是-1)
```
// 创建Configuration,生成模板实例
Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
configuration.setDirectoryForTemplateLoading(new File("src/main/webapp/WEB-INF/templates"));
// 指定使用模板文件,生成Template实例
Template template = configuration.getTemplate("hello.ftl");
// 填充数据模型,数据模型就是一个Map
Map<String, Object> map = new HashMap<>();
// map.put("title", "标题");
map.put("msg", "内容");
// 调用Template实例process完成数据合并
template.process(map, new PrintWriter(System.out));
==================================================
web项目简单应用
// 判断id对应的HTML页面是否存在
String htmlRealPath = ServletActionContext.getServletContext().getRealPath("/freemarker");
File htmlFile = new File(htmlRealPath + "/" + model.getId() + ".html");
// 如果不存在通过freemarker模板生成页面
if (!htmlFile.exists()) {
//配置模板对象,配置模板位置
Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
configuration.setDirectoryForTemplateLoading(
new File(ServletActionContext.getServletContext().getRealPath("/WEB-INF/freemarker_template")));
//获取模板对象
Template template = configuration.getTemplate("promotion_showdetail.ftl");
//通过webservice获取数据
Promotion promotion = WebClient.create(
Constants.BOS_MANAGEMENT_URL + "/services/promotionService/promotion/"+model.getId())
.accept(MediaType.APPLICATION_JSON).get(Promotion.class);
//封装数据
Map<String, Object> map=new HashMap<>();
map.put("promotion", promotion);
//输出到页面
template.process(map, new FileWriter(htmlFile));
}
// 存在将文件返回
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
FileUtils.copyFile(htmlFile, ServletActionContext.getResponse().getOutputStream());
---------------------------------------------------------
promotion=map中的键
---------------------------------------------------------
模板文件
<link rel="stylesheet" type="text/css" href="css/promotion_detail.css">
<div class="container promotions" >
<div class="col-md-2 prolist">
<h5 class="title"><a href="#/promotion"><strong>返回促销列表</strong></a></h5>
<img src="images/pro.jpg" class="img-responsive">
</div>
<div class="col-md-10 procontent">
<h5 class="title">${promotion.title}</h5>
<div class="intro">
<p>活动范围: ${promotion.activeScope}</p>
<p>活动时间: ${promotion.startDate?string("yyyy-MM-dd")} -
${promotion.endDate?string("yyyy-MM-dd")}</p>
</div>
<div class="partline clearfix"></div>
<div class="promotionbox">
${promotion.description}
</div>
</div>
</div>
```
========================================================
FreeMarker 是一个模板 技术
* FreeMarker与Web容器无关
* 它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java
* velocity 也是一个模板技术, 没有freemarker 有名
struts2 视图技术 同时 支持 JSP、FreeMarker 、Velocity
JSP 文件 扩展名 .jsp
FreeMarker 模板扩展名 .ftl
Velocity 模板扩展名 .vm
* DLog4j 使用 velocity 制作开源博客系统
思想: 模板文件ftl + Java数据对象 ====== 生成HTML网页
下载 最新版本 freemarker 2.3.19 将lib/jar 复制 工程
模板文件 + 数据模型 = 输出
1、创建Configuration,生成模板实例
Configuration configuration = new Configuration();
configuration.setDirectoryForTemplateLoading(new File("ftl文件位置"));
2、指定使用模板文件,生成Template实例
Template template = configuration.getTemplate("flt文件名");
3、填充数据模型,数据模型就是一个Map
Map<String, String> map = new HashMap<String, String>();
map.put(key, value);
4、调用Template实例process完成数据合并
template.process(map, 目标Writer输出流);
安装freemarker_eclipseplugin 插件
* 将 freemarker_eclipseplugin 文件夹 复制 myeclipse/dropins 目录
* 重启myeclipse
编写ftl 过程中 通过 ${} 嵌入变量
条件判断:<#if 条件> 内容 </#if>
集合遍历:<#list 集合 as 每个对象> 每个对象 </#list>
包含另一个页面 : <#include "URL路径">
数据不存在 ` <h1>Welcome ${user!"Anonymous"}!</h1>` 处理 user不存在 输出 Anonymous
调用函数 ${"<a href='xxx'>link</a>"?html}
应用一: 扩展struts2 模板
`<s:textfield>` 生成 input 默认xhtml 生成tr , 使用simple,只生成input
需求: `<s:textfield>` 生成` <label> <input> `
第一步 : 在src下创建 template/itcast
第二步 : 创建 theme.properties
parent = simple
第三步:重写自己主题
第四步:在页面中指定 主题 itcast
应用二: 进行web优化,页面静态化 *******
|
|