FreeMarker基本使用
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写
l FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序
l 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图)
模板 + 数据模型 = 输出
l FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件
l FreeMarker与容器无关,因为它并不知道HTTP或Servlet;FreeMarker同样可以应用于非Web应用程序环境
l FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库
l FreeMarker是免费的
(1)实例代码:
1 package freemaker; 2 3 import java.io.File; 4 import java.io.FileWriter; 5 import java.io.Writer; 6 import java.util.HashMap; 7 import java.util.Map; 8 9 import freemarker.template.Configuration; 10 import freemarker.template.Template; 11 12 public class FreeMarkerDemo { 13 14 public static void main(String[] args) { 15 // 配置对象 .html 16 Configuration conf = new Configuration(); 17 // 模板路径 18 String dir = "D:\\workspace2\\freemaker\\ftl\\"; 19 try { 20 // 导入模板目录 21 conf.setDirectoryForTemplateLoading(new File(dir)); 22 // 获取模板 23 Template template = conf.getTemplate("freemaker.html"); 24 // 数据 25 Map root = new HashMap(); 26 root.put("world", "世界"); 27 // 输出流 28 Writer out = new FileWriter(new File(dir + "hello.html")); 29 // 生成开始 30 template.process(root, out); 31 out.flush(); 32 out.close(); 33 } catch (Exception e) { 34 e.printStackTrace(); 35 } 36 37 System.out.println("生成完毕"); 38 39 } 40 }
(2)返回对象
1 Person p = new Person(); 2 p.setId(9527); 3 p.setName("华安"); 4 root.put("per", p); 5 6 编号:${per.id}<br/> 7 姓名:${per.name}<br/>
(3)遍历List
1 List<Person> list = new ArrayList<Person>(); 2 3 for(int i =0;i<10;i++){ 4 Person p = new Person(); 5 p.setId(9527+i); 6 p.setName("华安"+i); 7 list.add(p); 8 } 9 root.put("list", list); 10 11 <#list list as p> 12 ${p.id} -- ${p.name} 13 </#list>
(4)遍历Map
Map map = new HashMap(); map.put("id", "1001"); map.put("name", "秋香"); root.put("map", map); <#list map?keys as key> ${map[key]} </#list>
(5)遍历List<Map>
1 Map map = new HashMap(); 2 map.put("id", "1001"); 3 map.put("name", "秋香"); 4 Map map2 = new HashMap(); 5 map2.put("id", "1002"); 6 map2.put("name", "石榴姐"); 7 8 List<Map> maplist = new ArrayList<Map>(); 9 maplist.add(map); 10 maplist.add(map2); 11 root.put("maplist", maplist); 12 13 <#list maplist as map> 14 <#list map?keys as key> 15 ${map[key]} 16 </#list> 17 </#list>
(6)遍历if else
1 <#list ["星期一","星期二","星期三"] as n> 2 <#if n!="星期一"> 3 ${n} 4 <#else> 5 您好今天是星期一 6 </#if> 7 </#list>
(7)时间处理
1 root.put("dt", new Date()); 2 年月时间:${dt?datetime}<br/> 3 时间:${dt?time}
Freemarker 静态化加入项目中
1 接口;StaticPageService 2 public void staitcPage(); 3 实现类: 4 5 /** 6 * 生成静态页实现类 7 */ 8 public class StaticPageServiceImpl implements StaticPageService,ServletContextAware{ 9 10 private Configuration conf; 11 12 public void setFreeMarkerConfigurer(FreeMarkerConfigurer freeMarkerConfigurer) { 13 this.conf = freeMarkerConfigurer.getConfiguration(); 14 } 15 16 17 //静态化方法 18 public void productIndex(Map<String,Object> root,Integer id){ 19 //String dir = "C:\Users\lx\workspace\babasport12\"; 20 //设置模板的目录 21 //conf.setDirectoryForTemplateLoading(dir); 22 23 //输出流 从内存写出去 磁盘上 24 Writer out = null; 25 try { 26 //读进来 UTF-8 内存中 27 Template template = conf.getTemplate("productDetail.html"); 28 //获取Html的路径 29 String path = getPath("/html/product/" + id + ".html");//278.html 30 31 File f = new File(path); 32 File parentFile = f.getParentFile(); 33 if(!parentFile.exists()){ 34 parentFile.mkdirs(); 35 } 36 //输出流 37 out = new OutputStreamWriter(new FileOutputStream(f), "UTF-8"); 38 //处理模板 39 template.process(root, out); 40 } catch (Exception e) { 41 // TODO Auto-generated catch block 42 e.printStackTrace(); 43 }finally{ 44 if(out != null){ 45 try { 46 out.close(); 47 } catch (IOException e) { 48 // TODO Auto-generated catch block 49 e.printStackTrace(); 50 } 51 } 52 } 53 } 54 //获取路径 55 public String getPath(String name){ 56 return servletContext.getRealPath(name); 57 } 58 59 private ServletContext servletContext; 60 61 @Override 62 public void setServletContext(ServletContext servletContext) { 63 this.servletContext = servletContext; 64 } 65 } 66 67 <!-- 配置Freemarker --> 68 <bean id="staticPageService" class="cn.itcast.core.service.staticpage.StaticPageServiceImpl"> 69 <property name="freeMarkerConfigurer"> 70 <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 71 <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> 72 <property name="defaultEncoding" value="UTF-8"/> 73 </bean> 74 </property> 75 </bean>