A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 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优化,页面静态化  *******

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马