Java Web开发——FreeMarker模板使用方法讲解

Quotes:  程序员之家   http://www.sunxin.org

作者:娜   来源:程序员之家    发布者:admin

 

FreeMarker 简介

FreeMarker 模板文件主要由如下 4 个部分组成 :

1, 文本 : 直接输出的部分

2, 注释 :<#-- ... --> 格式部分 , 不会输出

3, 插值 : ${...} #{...} 格式的部分 , 将使用数据模型中的部分替代输出

4,FTL 指令 :FreeMarker 指定 , HTML 标记类似 , 名字前加 # 予以区分 , 不会输出

 

下面是一个 FreeMarker 模板的例子 , 包含了以上所说的 4 个部分

<html><br>

<head><br>

<title>Welcome!</title><br>

</head><br>

<body><br>

<#-- 注释部分 --><br>

<#-- 下面使用插值 -->

<h1>Welcome ${user} !</h1><br>

<p>We have these animals:<br>

<u1><br>

<#-- 使用 FTL 指令 -->

<#list animals as being><br>

   <li>${being.name} for ${being.price} Euros<br>

<#list><br>

<u1><br>

</body><br>

</html>

 

java 程序中使用 FreeMarker

FreeMarker 的模板就是一个 .ftl 文本文件 , 在该文件中使用了一些 FreeMarker 的特别标记 , 这些标记会动态显示 , 或者控制程序输出 , 如下面的模板文件代码 :

${name} ,你好! ${msg}

这里类似于 ${} 的就是动态的内容 , 称作 " 插值 ".

为了使用 FreeMarker 来将数据模型中的值合并到模板文件中 , 可按如下步骤进行 :

1, 创建 Configuration 实例 , 该实例负责管理 FreeMarker 的模板加载路径 , 负责生成模板实例

2, 使用 Configuration 实例来生成 Template 实例 , 同进需要指定使用的模板文件

3, 填充数据模型 , 数据模型就是一个 Map 对象

4, 调用 Template 实例的 process 方法完成合并 .

 

下面是一个使用 FreeMarker 创建输出的 Java 程序 , 程序源代码如下 :

package lee;

import java.util.*;

import java.io.*;

import freemarker.template.*;

 

public class HelloFreeMarker

{

    private Configuration cfg;

    public void init() throws Exception

{

        // 初始化 FreeMarker 配置

        // 创建一个 Configuration 实例

        cfg = new Configuration();

        // 设置 FreeMarker 的模版文件位置

        cfg.setDirectoryForTemplateLoading(new File("templates"));

    }

   

public void process()throws Exception

{

        Map root = new HashMap();

        root.put("name", "FreeMarker!");

   root.put("msg" , " 您已经完成了第一个 FreeMarker 的示例 ");

        Template t = cfg.getTemplate("test.ftl");

        t.process(root, new OutputStreamWriter(System.out));

 

}

 

public static void main(String[] args)throws Exception

{

   HelloFreeMarker hf = new HelloFreeMarker();

   hf.init();

   hf.process();

}

}

上面的代码创建了一个 Map 实例 , 这个 Map 将作为模板文件的数据模型 , 我们要使用 FreeMarker 必须导入 freemarker.jar 文件 ,FreeMarker 的官网是 http://freemarker.sourceforge.net/, 虽然 FreeMarker 可以在 Java 程序中使用 , 但大部分时候还是用来生成 HTML 页面 .

 

Web 应用中使用 FreeMarker

 

Web 应用中使用 FreeMarker 跟在 Java 程序中使用并没有太大的区别 . 下面是一个在 Web 中使用的例子 , 用来生成 HTML 页面的模板文件内容如下 :

<html>

<head>

<title>FreeMarker HelloWorld</title>

</head>

<body>

${message}

</body>

</html>

我们在 Web 应用中使用 FreeMarker , 应该让 Servlet 来合并模板和数据 , 因此 ,Servlet 负责创建 Configuration 实例 , 并负责合并模板和数据 , 下面是 Servlet 源代码 :

package lee;

import java.util.*;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import freemarker.template.*;

 

public class HelloServlet extends HttpServlet

{

    private Configuration cfg;

    public void init()

{

        // 初始化 FreeMarker 配置

        // 创建一个 Configuration 实例

        cfg = new Configuration();

        // 设置 FreeMarker 的模版文件位置

        cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");

    }

   

    public void service(HttpServletRequest request, HttpServletResponse response)

        throws ServletException, IOException

{       

        // 建立数据模型

        Map root = new HashMap();

        root.put("message", "Hello FreeMarker!");    

        // 取得模版文件

        Template t = cfg.getTemplate("test.ftl");       

        // 开始准备生成输出

        // - 使用模版文件的 charset 作为本页面的 charset

        // - 使用 text/html MIME-type

        response.setContentType("text/html; charset=" + t.getEncoding());

        Writer out = response.getWriter();

       

        // 合并数据模型和模版,并将结果输出到 out

        try

   {

            t.process(root, out);

        }

   catch (TemplateException e)

   {

            throw new ServletException(" 处理 Template 模版中出现错误 ", e);

        }

    }

}

可以看到这个 Servlet 类的代码与普通的 Java 程序 中使用 FreeMarker 大致一样 , 区别有两个 :1, 设置 FreeMarker 加载模板的方法不一样 , Servlet 中设置加载的方法是 setServletContextForTemplateLoading, 第一个参数是本 web 应用的 ServletContext, 第二个参数是模板文件的路径 .;2, 结果必须输出到 HttpServletResponse , 才能被浏览器加载 .

配置 Servlet web.xml 文件中的代码如下 :

<web-app>

<servlet>

   <servlet-name>hello</servlet-name>

   <servlet-class>lee.HelloServlet</servlet-class>

</servlet>

<servlet-mapping>

   <servlet-name>hello</servlet-name>

   <url-pattern>/hello</url-pattern>

</servlet-mapping>

</web-app>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值