Freemarker使用--备忘录

1   Freemarker

1.1  什么是freemarker

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

 

1.2  Freemarker的使用方法

第一步:把freemarker的jar包添加到工程中

第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

第三步:创建一个Configration对象

第四步:告诉config对象模板文件存放的路径。

第五步:设置config的默认字符集。一般是utf-8

第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。

第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。

第十步:关闭writer对象。

 

1.3  代码实现

public class FreeMarkerTest {

 

      @Test

      public void testFreeMarker() throws Exception {

           // 第一步:把freemarker的jar包添加到工程中

           // 第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

           // 第三步:创建一个Configuration对象

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

           // 第四步:告诉config对象模板文件存放的路径。

           configuration.setDirectoryForTemplateLoading(new File("D:\\workspaces-itcast\\JaveEE18\\taotao-portal\\src\\main\\webapp\\WEB-INF\\ftl"));

           // 第五步:设置config的默认字符集。一般是utf-8

           configuration.setDefaultEncoding("utf-8");

           // 第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。

           Template template = configuration.getTemplate("first.ftl");

           // 第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

           Map root = new HashMap<>();

           root.put("hello", "hello freemarker");

           // 第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

           Writer out = new FileWriter(new File("D:\\temp\\html\\hello.html"));

           // 第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。

           template.process(root, out);

           // 第十步:关闭writer对象。

           out.flush();

           out.close();

      }

}

 

模板:

${hello}

 

1.4  Freemarker模板的写法

1.4.1   取简单数据类型数据

使用EL表达式。

${hello}

 

1.4.2   包装数据类型

模板:

<html>

<head>

      <title>${title}</title>

</head>

<body>

      <label>学号:</label>${student.id}<br>

      <label>姓名:</label>${student.name}<br>

      <label>住址:</label>${student.address}<br>

</body>

</html>

 

1.4.3   历遍集合/数组

List<Person> persons = newArrayList<Person>();

省略….

 

页面中内容

 

<#list persons as p>

${p.id}/${p.name}

</#list>

 

1.4.4   获得当前迭代的索引

List<Person> list = newArrayList<Person>();

 

获取当前选代的索引:<br/>

<#list persons as p>

       ${p_index}

</#list>

 

1.4.5   模板中判断条件

<#if 判断条件>

<#else>

</#if>

 

逻辑运算符(==   !=  ||   &&)

 

1.4.6   日期类型格式化

默认格式

1:date

${cur_time?date}

2:datetime

${cur_time?datetime}

3:time

${cur_time?time}

 

自定义格式

${cur_time?string("yyyy-MM-ddHH:mm:ss")} 

 

1.4.7   处理null值

root.put(“val”,null);

 

解决办法

1:null 变空串

${val!}    ${val!"这里是空"}

2:为Null时给默认值

${val!“我是默认值"}

3、<#if curdate ??>

       当前日期:${curdate?string("yyyy/MM/ddHH:mm:ss")}

       <#else>

       curdate属性为null

       </#if>

1.4.8   Include

将另一个页面引入本页面时可用以下命令完成

 

<#include"/include/head.html">

 

1.5  项目中使用freemarker

使用freemarker整合spring。把Configuration交给spring容器管理。

依赖的jar包:

<dependency>

       <groupId>org.springframework</groupId>

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

       <version>4.1.3.RELEASE</version>

</dependency>

<dependency>

       <groupId>org.freemarker</groupId>

       <artifactId>freemarker</artifactId>

       <version>2.3.23</version>

</dependency>

 

1.5.1   Spring配置文件

<bean id="freemarkerConfig"

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

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

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

      </bean>

 

1.5.2   静态文件生成的时机

1、当用户第一次访问时生成静态文件。不推荐使用。

2、当后台添加、编辑商品时生成静态网页。

此时,需要taotao-portal发布服务,供后台系统调用,当后台添加或者修改商品时调用此服务。此时taotao-portal的功能就是生成静态页面。

 

1.5.3   发布生成页面的服务

1、获得数据的方式还是通过调用rest发布的服务获得数据。

2、生成静态页面。

3、响应生成成功。

 

1.5.4   Service

获得参数:商品id,根据商品id调用rest发布的服务,获得商品数据(商品基本信息、商品描述、商品规格参数),生成静态页面。返回成功。

参数:商品id

返回值:TaotaoResult

@Service

public class StaticPageServiceImpl implements StaticPageService {

     

      @Autowired

      private ItemService itemService;

      @Autowired

      private FreeMarkerConfigurer freeMarkerConfigurer;

     

      @Value("${STATIC_PAGE_PATH}")

      private String STATIC_PAGE_PATH;

 

      @Override

      public TaotaoResult genItemHtml(Long itemId) throws Exception {

           //商品基本信息

           TbItem tbItem = itemService.getItemById(itemId);

           //商品描述

           String itemDesc = itemService.getItemDescById(itemId);

           //规格参数

           String itemParam = itemService.getItemParamById(itemId);

           //生成静态页面

           Configuration configuration = freeMarkerConfigurer.getConfiguration();

           Template template = configuration.getTemplate("item.ftl");

           //创建一个数据集

           Map root = new HashMap<>();

           //向数据集中添加属性

           root.put("item", tbItem);

           root.put("itemDesc", itemDesc);

           root.put("itemParam", itemParam);

           //创建一个Writer对象

           Writer out = new FileWriter(new File(STATIC_PAGE_PATH + itemId + ".html"));

           //生成静态文件

           template.process(root, out);

           out.flush();

           out.close();

          

           return TaotaoResult.ok();

      }

     

     

 

}

 

1.5.5   Freemarker模板

 

1.5.6   Controller

接收商品id,调用Service生成静态页面。返回json数据。

参数:商品id

返回值:TaotaoResult

@Controller

public class StaticPageController {

 

      @Autowired

      private StaticPageService staticPageService;

     

      @RequestMapping("/gen/item/{itemId}")

      @ResponseBody

      public TaotaoResult genItemPage(@PathVariable Long itemId) {

           try {

                 TaotaoResult result = staticPageService.genItemHtml(itemId);

                 returnresult;

           } catch (Exception e) {

                 e.printStackTrace();

                 return TaotaoResult.build(500, ExceptionUtil.getStackTrace(e));

           }

      }

}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值