freemarker总结

一。 freemarker简介

    在互联网软件内容网站中 一般首页的访问量大,为了提供首页的访问效率,一般 首页的内容以及其中的新闻等信息都可以实现html静态化 浏览器访问时 设置浏览器的缓存策略和生成静态页面的周期一致 可以使访问效率大大提升 同时配合cdn处理图片 js css等资源 可以在首页访问时 理论完全脱离数据库  降低应用压力

  原理图:

   

实际应用案例

  比如 新闻门户网站  后台添加新闻时  通过新闻数据+预定义的模板ftl 生成静态的html  新闻数据插入数据库 绑定该html新闻保存的html位置 如果该新闻被推送到首页 

生成首页静态html时  将该新闻的超链接指向 该文章的静态html

下图访问服务(nginx集群+cdn缓存+后台应用服务器  MQ表示队列)



二 。freeemarker模板语法

 freemarker的模板 ftl为后缀 语法类似于jsp的标签

添加 hellworld.ftl

[html]  view plain  copy
  1. <#---------------------freemarker注释-->  
  2. <#--定义变量-->  
  3. <#assign id=1 name='zs' sex='boy' ifSuc=true>  
  4. 我的名字是:${name} 性别是 ${sex}<br/>  
  5. <#---------------------定义数组-->  
  6. <#assign hobbyArr=['篮球','足球','排球']>  
  7. <#---------------------if语句 判断变量是否存在-->  
  8. <#if hobbyArr??>  
  9.    hobbyArr变量存在<br/>  
  10. </#if>  
  11. <#--------------------- 循环语句   
  12.  for循环   
  13.  foreach  
  14.   临时变量 _index表示当前的下标  
  15.   临时变量 _has_next表示是否还有下一个值  
  16.   #break表示终止循环  
  17. -->  
  18. <#list 1..9 as i>  
  19.    ${i}  
  20. </#list>  
  21. <br/>  
  22. <#list hobbyArr as hobby>  
  23.   下标是:${hobby_index} 值:${hobby} <br/>  
  24.   <#if !hobby_has_next>已经是最后一个<#break></#if>  
  25. </#list>  
  26. <br/>  
  27. <#----------------------include包含会覆盖当前ftl中相同名字的变量-->  
  28. <#include "inc.ftl">  
  29.   ${name}  
  30. <#----------------------import包含模板 使用一个别名来控制包含文件中变量的作用于    
  31.     访问时使用 inc.变量名不会覆盖当前ftl变量-->    
  32. <#import "inc.ftl" as inc>  
  33. ${inc.name}  
  34. <br/>  
  35. <#----------------------macro宏类似于java中的方法 定义不会执行 调用才会执行 定义参数可以给默认值  
  36.     比如 addCalc p1 p2=10  如果调用不传入p2 默认就是10  
  37. -->  
  38. <#macro addCalc p1 p2=10>  
  39.  <#if p2=0 && p1=0>  
  40.     <#return>  
  41.  </#if>  
  42.    输出结果为:${p1+p2}  
  43. </#macro>  
  44. <@addCalc p1=100 p2=300/>  
  45. <@addCalc p1=567 p2=123/>  
  46. <@addCalc p1=567/>  
  47. <@addCalc p1=0 p2=0/>  
  48. <br/>  
  49. <#--macro中使用嵌套 #nested将 调用宏 body内容嵌套进入-->  
  50. <#macro myuser name>  
  51.   您的姓名是:${name}<br/>  
  52.   <#nested name?length>  
  53. </#macro>  
  54. <@myuser name='zs';len>名字长度:${len}</@myuser>  
  55. <br/>  
  56. <#----------------------字符串的转义处理  
  57. -->  
  58. ${"我的名字是\"zs\""}  
  59. ${r"我的名字是:${name}"}<#--字符串的${}添加了r表示是纯文本 直接输出不解析-->  

添加一个包含的ftl  inc.ftl

[html]  view plain  copy
  1. <#assign id=2 name='ls' sex='girl'>  

freemarker内置的处理函数(http://freemarker.org/docs/ref_builtins.html)

通过在一个ftl添加  ${aa?aa} 出错后 在错误堆栈中打印了所有函数

[html]  view plain  copy
  1. freemarker.core.ParseException: Syntax error in template "helloworld.ftl" in line 61, column 6:  
  2. Unknown built-in: "aa". Help (latest version): http://freemarker.org/docs/ref_builtins.html; you're using FreeMarker 2.3.26-incubating.  
  3. The alphabetical list of built-ins:  
  4. abs, ancestors, api,   
  5. boolean, byte,   
  6. c, cap_first, capitalize, ceiling, children, chop_linebreak, chunk, contains, counter,   
  7. date, date_if_unknown, datetime, datetime_if_unknown, default, double,   
  8. ends_with, ensure_ends_with, ensure_starts_with, esc, eval, exists,   
  9. first, float, floor,   
  10. groups,   
  11. has_api, has_content, has_next, html,   
  12. if_exists, index, index_of, int, interpret, is_boolean, is_collection, is_collection_ex, is_date, is_date_like, is_date_only, is_datetime, is_directive, is_enumerable, is_even_item, is_first, is_hash, is_hash_ex, is_indexable, is_infinite, is_last, is_macro, is_markup_output, is_method, is_nan, is_node, is_number, is_odd_item, is_sequence, is_string, is_time, is_transform, is_unknown_date_like, iso, iso_h, iso_h_nz, iso_local, iso_local_h, iso_local_h_nz, iso_local_m, iso_local_m_nz, iso_local_ms, iso_local_ms_nz, iso_local_nz, iso_m, iso_m_nz, iso_ms, iso_ms_nz, iso_nz, iso_utc, iso_utc_fz, iso_utc_h, iso_utc_h_nz, iso_utc_m, iso_utc_m_nz, iso_utc_ms, iso_utc_ms_nz, iso_utc_nz, item_cycle, item_parity, item_parity_cap,   
  13. j_string, join, js_string, json_string,   
  14. keep_after, keep_after_last, keep_before, keep_before_last, keys,   
  15. last, last_index_of, left_pad, length, long, lower_abc, lower_case,   
  16. markup_string, matches,   
  17. namespace, new, next_sibling, no_esc, node_name, node_namespace, node_type, number, number_to_date, number_to_datetime, number_to_time,   
  18. parent, previous_sibling,   
  19. remove_beginning, remove_ending, replace, reverse, right_pad, root, round, rtf,   
  20. seq_contains, seq_index_of, seq_last_index_of, short, size, sort, sort_by, split, starts_with, string, substring, switch,   
  21. then, time, time_if_unknown, trim,   
  22. uncap_first, upper_abc, upper_case, url, url_path,   
  23. values,   
  24. web_safe, word_list,   
  25. xhtml, xml  
函数调用 语法为 ${变量?函数名(参数)}

  ${‘  aaa  ’?trim}  
以下是字符串串函数的用法

[html]  view plain  copy
  1. ${'aaa_bbb'?index_of('_')}  
  2. ${'  aaa_bbb  '?trim?length}  
  3. ${'  aaa_bbb  '?upper_case?lower_case}  
  4. ${'aaa_bbb'?split('_')?size}  
  5. ${'aaa_bbb'?replace('_','*')}  
  6. <#if '_aaa'?starts_with('_')>  
  7.   _开头  
  8. </#if>  

二 。freeemarker在javase和javaee使用

 1.javase环境下 可以将模板+数据的结果生成html 输出到指定位置

maven中添加freemarker依赖

[html]  view plain  copy
  1. <dependency>  
  2.   <groupId>org.freemarker</groupId>  
  3.   <artifactId>freemarker</artifactId>  
  4.   <version>2.3.26-incubating</version>  
  5. </dependency>  
添加测试类 main方法中添加:

[html]  view plain  copy
  1. Configuration cfg = new Configuration(Configuration.VERSION_2_3_26);  
  2. cfg.setDirectoryForTemplateLoading(new File("src/main/resources"));  
  3. cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.VERSION_2_3_26));  
  4. Map root = new HashMap();  
  5. root.put("user", "Big Joe");  
  6. Template temp = cfg.getTemplate("test.ftl");  
  7. Writer out = new OutputStreamWriter(System.out);  
  8. temp.process(root, out);  
  9. out.flush();  

src/main/resources仙剑test.ftl

[html]  view plain  copy
  1. <html>  
  2. <head>  
  3.   <title>Welcome!</title>  
  4. </head>  
  5. <body>  
  6.   <h1>Welcome ${user?default('')}!</h1>  
  7. </body>  
运行main方法发现输出了 对应的网页

 2.javaee环境下 使用freemarkerservlet寻找ftl文件并输出 

javaee下部署访问页面的结构图 (MVC)


freemarker也支持上述模型

maven 添加依赖包  同上

添加一个servlet   映射路径 /t  web.xml添加:

[html]  view plain  copy
  1. <servlet>  
  2.     <description></description>  
  3.     <display-name>TestSErvlet</display-name>  
  4.     <servlet-name>TestSErvlet</servlet-name>  
  5.     <servlet-class>webtest.TestSErvlet</servlet-class>  
  6.   </servlet>  
  7.   <servlet-mapping>  
  8.     <servlet-name>TestSErvlet</servlet-name>  
  9.     <url-pattern>/t</url-pattern>  
  10.   </servlet-mapping>  
配置freemarkerservlet web.xml添加

[html]  view plain  copy
  1. <servlet>  
  2.     <servlet-name>freemarker</servlet-name>  
  3.     <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>  
  4.     <init-param>      
  5.       <param-name>TemplatePath</param-name>      
  6.       <param-value>/</param-value>    <!--表示从上下文路径根目录寻找模板文件-->  
  7.   </init-param>     
  8.   <init-param>      
  9.       <param-name>NoCache</param-name>      
  10.       <param-value>true</param-value> <!--不使用缓存-->     
  11.   </init-param>      
  12.     <init-param>    
  13.         <param-name>ContentType</param-name>    
  14.         <param-value>text/html;charset=UTF-8</param-value>  <!--响应的数据类型-->  
  15.     </init-param>    
  16.     <init-param>    
  17.         <param-name>template_update_delay</param-name>    
  18.         <param-value>0</param-value>    
  19.     </init-param>    
  20.     <init-param>    
  21.         <param-name>default_encoding</param-name>    
  22.         <param-value>UTF-8</param-value>    
  23.     </init-param>    
  24.   <init-param>      
  25.       <param-name>number_format</param-name>      
  26.       <param-value>0.##########</param-value>      
  27.   </init-param>      
  28.     <load-on-startup>1</load-on-startup>  
  29.   </servlet>  
  30.   <servlet-mapping>  
  31.     <servlet-name>freemarker</servlet-name>  
  32.     <url-pattern>*.ftl</url-pattern><!--所有ftl都经过该servlet-->  
  33.   </servlet-mapping>  
maven项目 /src/main/java/webapps随便添加一个模板 test.ftl

[html]  view plain  copy
  1. <html>  
  2. <head>  
  3.   <title>Welcome!</title>  
  4. </head>  
  5. <body>  
  6.   <h1>Welcome ${user?default('')}!</h1>  
  7.   <p>Our latest product:  
  8.   <a href="${latestProduct.url?default('')}">${latestProduct.name?default('')}</a>  
  9.   ${user}  
  10.   <#if sex='0'>  
  11.     body  
  12.   </#if>  
  13.     <#assign id=1><br/>  
  14.   ${id}  
  15.     
  16.   <#macro users name>  
  17.      这是用户:${name}  
  18.   </#macro>  
  19.     
  20.   <@users name='zs'></@users>  
  21.   <@users name='ls'></@users>  
  22. </body>  
  23. </html>    
自定义的servlet类 /t doGet中添加

[html]  view plain  copy
  1. package webtest;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. /**  
  13.  * Servlet implementation class TestSErvlet  
  14.  */  
  15. public class TestSErvlet extends HttpServlet {  
  16.     private static final long serialVersionUID = 1L;  
  17.          
  18.     /**  
  19.      * @see HttpServlet#HttpServlet()  
  20.      */  
  21.     public TestSErvlet() {  
  22.         super();  
  23.         // TODO Auto-generated constructor stub  
  24.     }  
  25.   
  26.     /**  
  27.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)  
  28.      */  
  29.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  30.   
  31.         Map latest = new HashMap();  
  32.         latest.put("url", "products/greenmouse.html");  
  33.         latest.put("name", "green mouse");  
  34.         request.setAttribute("user", "Big Joe");  
  35.         request.setAttribute("latestProduct", latest);  
  36.         request.setAttribute("sex", "1");  
  37.         request.getRequestDispatcher("/test.ftl").forward(request, response);    
  38.     }  
  39.   
  40.     /**  
  41.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)  
  42.      */  
  43.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  44.         // TODO Auto-generated method stub  
  45.         doGet(request, response);  
  46.     }  
  47.   
  48. }  

浏览器访问 http://localhost:端口/上下文路径/t  发现模板内容输出

可以使用java代码自定义方法和宏 具体参考官方文档

定义方法 过程:

添加方法java类MyMethod

[html]  view plain  copy
  1. package webtest;  
  2.   
  3.   
  4. import java.util.List;  
  5.   
  6.   
  7. import freemarker.template.SimpleNumber;  
  8. import freemarker.template.TemplateMethodModelEx;  
  9. import freemarker.template.TemplateModelException;  
  10.   
  11.   
  12. public class MyMethod implements TemplateMethodModelEx {  
  13.   
  14.   
  15. <span style="white-space:pre">  </span>public Object exec(List arguments) throws TemplateModelException {  
  16. <span style="white-space:pre">      </span>if (arguments.size() != 2) {  
  17.             throw new TemplateModelException("Wrong arguments");  
  18.         }  
  19. <span style="white-space:pre">      </span>SimpleNumber p1=(SimpleNumber)arguments.get(0);  
  20. <span style="white-space:pre">      </span>SimpleNumber p2=(SimpleNumber)arguments.get(1);  
  21. <span style="white-space:pre">      </span>return p1.getAsNumber().intValue()+p2.getAsNumber().intValue();  
  22. <span style="white-space:pre">  </span>}  
  23.   
  24.   
  25. }  

在 request设置值时 添加

[html]  view plain  copy
  1. request.setAttribute("myAdd", new MyMethod());  

ftl文件中 可以

[html]  view plain  copy
  1. ${myAdd(1,2)}  

三。 freemarker插件安装

  freemarkder插件的下载地址为 :https://sourceforge.net/projects/freemarker-ide/files/freemarker-ide/

 下载freemarker-ide-0.9.14.zip (909.6 kB)

  解压后目录 植入 eclipse/plugsin目录即可 



编辑ftl文件后 会出现提示  



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeMarker在Eclipse安装 1.将插件hudson.freemarker_ide_0.9.14文件夹放到eclipse下的plugins文件夹下 按理,这样的话,重启eclipse就应该解决了 但是不成 因为hudson.freemarker_ide_0.9.14文 件夹下的freemarker-2.3.6.jar是比较早的版本 ,需要下载新的版本替换它 2.将freemarker-2.3.6.jar删掉,用freemarker-2.3.15.jar替换 3.把MANIFEST.MF里的Bundle-ClassPath也改为freemarker-2.3.15.jar 4.重启eclipse 打开window --> Preferences ,就会找到FreeMarker Editor。 在General --> Editors --> File Associations下,为*.html和*.htm文件添加FreeMarker Editor 作他们关联的编辑器 , *.ftl文件的默认编辑器就是FreeMarker Editor。这样在编辑混合有HTML和FreeMarker标记的文件时, 可以选择右击文件 --> Open with HTML Editor 或者 Open with FreeMarker Editor FreeMarker允许Java servlet保持图形设计同应用程序逻辑的分离,这是通过在模板中密封HTML完成的。 模板用servlet提供的数据动态地生成 HTML。模板语言是强大的直观的,编译器速度快,输出接近静态HTML页面的速度。   FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写   FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序   虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据   FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件   FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境   FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库   FreeMarker是免费的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值