Java中FreeMaker的使用详解

1.什么是freemarker

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

目前企业中:主要用Freemarker做静态页面或是页面展示

2.Freemarker的使用方法

把freemarker的jar包添加到工程中。

2.1Maven工程添加依赖

 
  1. <dependency>

  2. <groupId>org.freemarker</groupId>

  3. <artifactId>freemarker</artifactId>

  4. <version>2.3.23</version>

  5. </dependency>

2.2非maven工程加入相应jar包到build path中

2.3原理:这里写图片描述

3.使用步骤:

第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。 
第二步:设置模板文件所在的路径。 
第三步:设置模板文件使用的字符集。一般就是utf-8. 
第四步:加载一个模板,创建一个模板对象。 
第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。 
第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。 
第七步:调用模板对象的process方法输出文件。 
第八步:关闭流。

3.1模板:

放在WEN-INF/ftl/hello.ftl文件中: 
${hello}

3.2实现代码

 
  1. @org.junit.Test

  2. public void test() throws IOException, TemplateException {

  3. // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。

  4. Configuration configuration = new Configuration(Configuration.getVersion());

  5. // 第二步:设置模板文件所在的路径。

  6. configuration.setDirectoryForTemplateLoading(

  7. new File("D:\\Java\\Eclipse\\workspace_Test\\FreeMarker\\src\\main\\webapp\\WEB-INF\\ftl"));

  8. // 第三步:设置模板文件使用的字符集。一般就是utf-8.

  9. configuration.setDefaultEncoding("utf-8");

  10. // 第四步:加载一个模板,创建一个模板对象。

  11. Template template = configuration.getTemplate("hello.ftl");

  12. // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。

  13. Map dataModel = new HashMap();

  14. // 向数据集中添加数据

  15. dataModel.put("hello", "this is my first freemarker test.");

  16. // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。

  17. Writer out = new FileWriter(new File("D:\\Java\\Eclipse\\workspace_Test\\FreeMarker\\out\\hello.html"));

  18. // 第七步:调用模板对象的process方法输出文件。

  19. template.process(dataModel, out);

  20. // 第八步:关闭流。

  21. out.close();

  22. }

4.模板的语法

4.1访问map中的key

${key}

4.2访问pojo中的属性

Student对象。学号、姓名、年龄 
${key.property} 
这里写图片描述

4.3取集合中的数据

循环使用格式:

 
  1. <#list 要循环的数据 as 循环后的数据>

  2. </#list>

如:

 
  1. <#list studentList as student>

  2. ${student.id}/${studnet.name}

  3. </#list>

这里写图片描述
这里写图片描述

4.4取循环中的下标

 
  1. <#list studentList as student>

  2. ${student_index}

  3. </#list>

这里写图片描述

4.5判断

 
  1. <#if student_index % 2 == 0>

  2. <#else>

  3. </#if>

这里写图片描述

4.6日期类型格式化

直接取值:${date}(date是属性名)如果传来的是一个Date型数据会报错

 
  1. ${date?date} //2016-9-13

  2. ${date?time} //17:53:55

  3. ${date?datetime} //2016-9-13 17:53:55

4.7Null值的处理

如果直接取一个不存在的值(值为null)时会报异常 
${aaa} 
处理: aaa!”默认值”或者aaa!”默认值”或者{aaa! }代表空字符串 
这里写图片描述

4.8Include标签

<#include “模板名称”> //(相当于jstl中的包含)

这里写图片描述

5.Freemarker整合spring

5.1引入jar包:

Freemarker的jar包 
Spring web mvc 的jar包 
Sping context supportjar 包

 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  3. <modelVersion>4.0.0</modelVersion>

  4. <groupId>top.yubaojin</groupId>

  5. <artifactId>FreeMarker</artifactId>

  6. <version>0.0.1-SNAPSHOT</version>

  7. <packaging>war</packaging>

  8.  
  9. <dependencies>

  10. <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->

  11. <dependency>

  12. <groupId>org.springframework</groupId>

  13. <artifactId>spring-context-support</artifactId>

  14. <version>4.3.13.RELEASE</version>

  15. </dependency>

  16.  
  17. <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->

  18. <dependency>

  19. <groupId>org.springframework</groupId>

  20. <artifactId>spring-webmvc</artifactId>

  21. <version>4.3.13.RELEASE</version>

  22. </dependency>

  23.  
  24. <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->

  25. <dependency>

  26. <groupId>org.freemarker</groupId>

  27. <artifactId>freemarker</artifactId>

  28. <version>2.3.23</version>

  29. </dependency>

  30. </dependencies>

  31. <build>

  32. <plugins>

  33. <plugin>

  34. <groupId>org.apache.tomcat.maven</groupId>

  35. <artifactId>tomcat7-maven-plugin</artifactId>

  36. <version>2.2</version>

  37. <configuration>

  38. <path>/</path>

  39. <port>8080</port>

  40. </configuration>

  41. </plugin>

  42. </plugins>

  43. </build>

  44. </project>

5.2创建整合spring的配置文件

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <beans xmlns="http://www.springframework.org/schema/beans"

  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

  4. xmlns:context="http://www.springframework.org/schema/context"

  5. xmlns:mvc="http://www.springframework.org/schema/mvc"

  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

  7. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd

  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

  9. <!-- 配置注解驱动 -->

  10. <mvc:annotation-driven />

  11. <!-- freemarker整合spring中 -->

  12. <bean id="freemarkerConfig"

  13. class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

  14. <property name="templateLoaderPath" value="/WEB-INF/ftl/" />

  15. <property name="defaultEncoding" value="UTF-8" />

  16. </bean>

  17. <!-- 配置包扫描器,扫描@Controller注解的类 -->

  18. <context:component-scan base-package="top.yubaojin.controller" />

  19. </beans>

5.3web文件

 
  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3. xmlns="http://java.sun.com/xml/ns/javaee"

  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

  5. version="2.5">

  6. <display-name>FreeMarker</display-name>

  7. <!-- 前端控制器 -->

  8. <servlet>

  9. <servlet-name>freemarker</servlet-name>

  10. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

  11. <!-- contextConfigLocation不是必须的, 如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->

  12. <init-param>

  13. <param-name>contextConfigLocation</param-name>

  14. <param-value>classpath:springmvc.xml</param-value>

  15. </init-param>

  16. <load-on-startup>1</load-on-startup>

  17. </servlet>

  18. <servlet-mapping>

  19. <servlet-name>freemarker</servlet-name>

  20. <!-- 拦截所有请求jsp除外 -->

  21. <url-pattern>/</url-pattern>

  22. </servlet-mapping>

  23. </web-app>

5.4编写测试Controller

请求的url:/test 
参数:无 
返回值:ok (String, 需要使用@ResponseBody) 
业务逻辑: 
1、从spring容器中获得FreeMarkerConfigurer对象。 
2、从FreeMarkerConfigurer对象中获得Configuration对象。 
3、使用Configuration对象获得Template对象。 
4、创建数据集 
5、创建输出文件的Writer对象。 
6、调用模板对象的process方法,生成文件。 
7、关闭流。

 
  1. package top.yubaojin.controller;

  2.  
  3. import java.io.File;

  4. import java.io.FileWriter;

  5. import java.io.IOException;

  6. import java.io.Writer;

  7. import java.util.HashMap;

  8. import java.util.Map;

  9.  
  10. import org.springframework.beans.factory.annotation.Autowired;

  11. import org.springframework.stereotype.Controller;

  12. import org.springframework.web.bind.annotation.RequestMapping;

  13. import org.springframework.web.bind.annotation.ResponseBody;

  14. import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

  15.  
  16. import freemarker.template.Configuration;

  17. import freemarker.template.Template;

  18. import freemarker.template.TemplateException;

  19.  
  20. @Controller

  21. public class FreeMarkerController {

  22.  
  23. @Autowired

  24. private FreeMarkerConfigurer freeMarkerConfigurer;

  25.  
  26. @RequestMapping("/test")

  27. @ResponseBody

  28. public String test() throws IOException, TemplateException {

  29. // 1、从spring容器中获得FreeMarkerConfigurer对象。

  30. // 2、从FreeMarkerConfigurer对象中获得Configuration对象。

  31. Configuration configuration = freeMarkerConfigurer.getConfiguration();

  32. // 3、使用Configuration对象获得Template对象。

  33. Template template = configuration

  34. .getTemplate("hello.ftl");

  35. // 4、创建数据集

  36. Map dataModel = new HashMap();

  37. dataModel.put("hello", "1000");

  38. // 5、创建输出文件的Writer对象。

  39. //需要手动在D:/Java/Eclipse/workspace_Test/FreeMarker/下创建out目录

  40. File file = new File("D:/Java/Eclipse/workspace_Test/FreeMarker/out/spring-freemarker.html");

  41. /* if(!file.exists()) {

  42. file.createNewFile();

  43. }*/

  44. Writer out = new FileWriter(file);

  45. // 6、调用模板对象的process方法,生成文件。

  46. template.process(dataModel, out);

  47. // 7、关闭流。

  48. out.close();

  49. return "OK";

  50. }

  51. }

6.测试

6.1配置Tomcat插件运行maven build

这里写图片描述

6.2浏览器请求测试

这里写图片描述 
结果:这里写图片描述

6.3查看结果

这里写图片描述

7.网页静态化方案

输出文件的名称:商品id+“.html” 
输出文件的路径:工程外部的任意目录。 
网页访问:使用nginx访问网页。在此方案下tomcat只有一个作用就是生成静态页面。 
工程部署:可以把taotao-item-web部署到多个服务器上。 
生成静态页面的时机:商品添加后,生成静态页面。可以使用Activemq,订阅topic(商品添加) 
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值