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

FreeMarker 学习详解编程语言

你好 ${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="[email protected]"  /> 
${mail} <#-- 引用的是  --> 
<#assign mail="[email protected]" in bb  /> 
${bb.mail}  <#-- 引用的是  -->

View Code

b.ftl

FreeMarker 学习详解编程语言

<#macro copyright date> 
<p>Copyright (C) ${date} 北京尚学堂.</p>  
</#macro>  
<#assign mail = "[email protected]">

View Code

index.ftl

 

FreeMarker 学习详解编程语言

<#macro copyright date> 
<p>Copyright (C) ${date}</p>  
</#macro>  
<#assign mail = "[email protected]">

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

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/16313.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论