Problem
How to get the first and the last item in ftl?
How-To
A simple ftl example:
<#list rows as row>
<#if row?is_first>
表頭:${row.name}
<#elseif row?is_last>
表尾:${row.name}
<#else>
${row.name}
</#if>
</#list>
Test case:
package com.test.tool.filegenerator.ftl;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Builder;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@Slf4j
public class FreemarkerRowTest {
private Configuration cfg;
@Before
public void init() {
cfg = new Configuration(Configuration.VERSION_2_3_23);
cfg.setClassForTemplateLoading(this.getClass(), "/");
}
@Test
public void test() throws IOException, TemplateException {
try (Writer file = new FileWriter(new File("C:/row_test.txt"));) {
Template template = cfg.getTemplate("ftl/row_test.ftl");
Map<String, Object> data = new HashMap<>();
List<TestData> rows = createDummyData();
rows.stream().forEach(r -> log.debug(r.getName()));
data.put("rows", rows);
template.process(data, file);
} catch (IOException | TemplateException e) {
throw e;
}
}
private List<TestData> createDummyData() {
List<TestData> data = new ArrayList<>();
data.add(TestData.builder().name("apple").build());
data.add(TestData.builder().name("avocado").build());
data.add(TestData.builder().name("banana").build());
data.add(TestData.builder().name("cherry").build());
data.add(TestData.builder().name("coconut").build());
data.add(TestData.builder().name("durian").build());
return data;
}
@Builder
@Getter
public static class TestData {
private String name;
}
}