zoukankan      html  css  js  c++  java
  • FreeMarker 学习

    一、FreeMarker

         FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。(百度百科)

       FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。

         FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境。

    优点:

     1. FreeMarker的优点一,可以彻底的分离表现层和业务逻辑。
      使用JSP 开发过程中发现在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。
      FreeMarker根本不支持Java脚本代码。
      FreeMarker的原理就是:模板+数据模型=输出,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。
          
    2. FreeMarker
    的优点二,可以提高开发效率。
      使用JSP 页面来展示数据的,即所谓的表现层。大家都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,大家在不必在等待界面设计开发人员完成页面原形后,大家再来开发程序。

    缺点:

     1.FreeMarker的缺点一,应用FreeMarker模板技术,在修改模板后,可能会看到已经过期的数据。如:生成静态的HTML页面后,如果一旦模板改变,而没有及时更新模板生成的HTML页面的话,用户看到的就是过期的数据。
     2.FreeMarker的缺点二FreeMarker不支持集群应用。为了编成的方便性,把序列化的东西都放到了Session中,如Session,request等,在开发的过程中确实方便,但如果将应用放到集群中,就会出现错误

    二、数据格式

       freeMark 的数据格式是树状结构 ,使用Map封装数据 key必须是string,其他数据类型无法操作。

    三、使用

    public static void main(String[] args) throws IOException, TemplateException{
            //创建Freemarker配置实例
            Configuration cfg = new Configuration();
            cfg.setDirectoryForTemplateLoading(new File("templates")); 
            
            //创建数据模型
            Map<String,Object> root = new HashMap<String,Object>();
            root.put("name", "张三");//字符串类型
            root.put("random", new Random().nextInt(100));
            
            List<Map<String,Object>> listMap=new ArrayList<Map<String,Object>>();
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("name", "A1");
            map.put("name", "A2");
            listMap.add(map);
            root.put("listMap", listMap);
            
            //加载模板文件
            Template template=cfg.getTemplate("a.ftl");
            //显示生成的数据
             Writer writer=new OutputStreamWriter(System.out);
            // Writer writer  = new OutputStreamWriter(new FileOutputStream("html/index.html"),"UTF-8");  
             template.process(root, writer);  
             writer.flush();
        }

    a.ftl

    你好 ${name} 欢迎学习FreeMarker
    <#--if 语句 -->
    #if 语句
    <#if name=="张三">张三</#if>
    <#--  if  else-->
    
    # gt 大于   gte 大于等于 
    
    <#if random gt 60 >
          ${random}: 及格
      <#else>
         ${random}: 不及格
    </#if>
    
    <#--  if else if else语句测试:    -->
    <#if random gte 90>
        ${random}:优秀!
    <#elseif random gte 80>
        ${random}:良好!
    <#else>
        ${random}: 一般!    
    </#if>
    
    <#-- 遍历List -->
    <#list listMap as map >
        <b>${map.name}</b> <br/>
    </#list>
    
    <#-- include -->
    <#include "index.ftl" />
    
    <#-- 自定义指令  macro指令-->
    <#macro m1>   <#--定义指令m1 -->
        <b>aaabbbccc</b>
        <b>dddeeefff</b>
    </#macro>
    <@m1 />  <#--调用上面的宏指令 -->
    
    <#-- 定义带参的宏指令:  -->
    
    <#macro m2 a b c >
        ${a}--${b}--${c}
    </#macro>
    <@m2 a="老高" b="老张" c="老马" />
    
    <#-- nested指令: -->
    
    <#macro border> 
      <table border=4 cellspacing=0 cellpadding=4>
          <tr>
              <td> 
                <#nested> 
              </td>
          </tr>
      </table> 
    </#macro>
    <@border >表格中的内容! 方式二</@border>
    <#--  命名空间  -->
        <#import "b.ftl" as bb  />
        
        <@bb.copyright date="2010-2011" />
        
        ${bb.mail}
        
        <#assign mail="my@163.com"  />
        
        ${mail} <#-- 引用的是  -->
        
        <#assign mail="my@126.com" in bb  />
        
        ${bb.mail}  <#-- 引用的是  -->
    View Code

    b.ftl

    <#macro copyright date>
      <p>Copyright (C) ${date} 北京尚学堂.</p> 
    </#macro> 
    <#assign mail = "bjsxt@163.com">
    View Code

    index.ftl

    <#macro copyright date>
      <p>Copyright (C) ${date}</p> 
    </#macro> 
    <#assign mail = "bjsxt@163.com">
    View Code

     三、在WEB项目中使用 (官方demo)

      

    public class FreemarkServlet extends HttpServlet{
        private Configuration cfg; 
        public void init() {
            cfg=new Configuration();
            cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");
        }
        public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
            doPost(request, response);
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
                Map<String,Object> root = new HashMap<String,Object>();
                root.put("message", "Hello World!");
                Template template = cfg.getTemplate("index.ftl");
                Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), template.getEncoding()));
                response.setContentType("text/html; charset=" + template.getEncoding());
                try {
                    template.process(root, out);
                    out.flush();
                } catch (TemplateException e) {
                    throw new ServletException( "Error while processing FreeMarker template", e);
                }
            }
    }
    1、在WEB-INF下建立目录  templates  在里面建文件 index.ftl
    <html>
    <head>
      <meta charset="UTF-16">
      <title>FreeMarker Example Web Application 1</title>
    </head>
    <body>
      ${message}
    </body>
    </html>
    2、web.xml
    <?xml version="1.0" encoding="UTF-8"?> 
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <servlet> 
          <servlet-name>freeMark</servlet-name> 
          <servlet-class>com.jalja.servlet.FreemarkServlet</servlet-class> 
          <load-on-startup>1</load-on-startup> 
      </servlet> 
      <servlet-mapping> 
          <servlet-name>freeMark</servlet-name> 
          <url-pattern>/freeMark</url-pattern> 
      </servlet-mapping> 
      </web-app>

    在WEB-INF下建立目录  templates  在里面建文件 index.ftl

    每天用心记录一点点。内容也许不重要,但习惯很重要!
  • 相关阅读:
    UE4/Unity绘制地图
    腾讯地图定位打卡功能实现
    腾讯地图GPS轨迹回放-安卓篇
    腾讯地图个性化图层创建及发布
    使用腾讯地图实现汽车沿轨迹行驶功能
    腾讯地图GPS轨迹录制
    微信小程序地图定位开发教程
    基于腾讯地图定位实现物业巡检防作弊场景
    Java 序列化
    Java HashMap
  • 原文地址:https://www.cnblogs.com/jalja/p/FreeMarker.html
Copyright © 2011-2022 走看看