一:freemarker是什么?
freemarker是一個模板引擎,基於定義的模板和數據生成對應的文本(HTML,xml,java等),是一個生成文本的工具。
二:freemarker的使用方法
(1)在工程中引入freemarker相關的依賴
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
(2)使用的步驟
第一步:創建一個Configuration對象,直接new一個即可,構造參數是freemarker的版本號
第二步:設置模板文件所在的路徑,需要給出在磁盤上儲存的全路徑
第三步:設置生成的文件的編碼格式,一般為utf-8格式
第四步:加載模板,創建模板對象
第五步:創建模板使用的數據集,可以使pojo也可以是map類型的
第六步:創建Write流對象,將文件文件輸出,需要指定生成的文件的名稱
第七步:調用模板的process方法,生成相應的文本
第八步:關閉流
@Test public void genFile() throws Exception { // 第一步:創建一個Configuration對象,直接new一個對象。構造方法的參數就是freemarker對於的版本號。 Configuration configuration = new Configuration(Configuration.getVersion()); // 第二步:設置模板文件所在的路徑。 configuration.setDirectoryForTemplateLoading(new File("D:/workspace/item-web/src/main/webapp/WEB-INF/ftl")); // 第三步:設置模板文件使用的字符集。一般就是utf-8. configuration.setDefaultEncoding("utf-8"); // 第四步:加載一個模板,創建一個模板對象。 Template template = configuration.getTemplate("hello.ftl"); // 第五步:創建一個模板使用的數據集,可以是pojo也可以是map。一般是Map。 Map dataModel = new HashMap<>(); //向數據集中添加數據 dataModel.put("hello", "this is my first freemarker test."); // 第六步:創建一個Writer對象,一般創建一FileWriter對象,指定生成的文件名。 Writer out = new FileWriter(new File("D:/temp/out/hello.html")); // 第七步:調用模板對象的process方法輸出文件。 template.process(dataModel, out); // 第八步:關閉流。 out.close(); }
(3)模板的語法
1.訪問map中的key
${key}即可獲得對應的value值
2.訪問pojo中的屬性
以student對象為例: ${student.id} ${student.name}即可取得student對象中的id值和name值
3.去集合中的元素
例如:遍歷學生對象集合,取出每一個學生的id值和name值
<#list studentList as student>
${student,id} ${student.name}
<#list>
4.取集合中的下標
<#list studentList as student>
對象+下划線+index 即可獲得下標值
${student_index}
<#list>
5.判斷
<#list sutdnetList as student>
進行奇偶數的判斷
<#if student_index % 2 ==0>
//偶數的處理過程
<#else>
//奇數的處理過程
<#if>
<#list>
6.日期類型的格式化
${date?date} 當前日期
${date?time} 當前時間
${date?datetime} 當前日期和時間
${date?string("yyyy-MM-dd hh:mm:ss")} 設置日期格式
7.NULL的處理
!對輸出的控制處理,只輸出,無返回值
${name} 如果name為空就會報錯
${name!}如果name為空,不會報錯,沒有輸出
${name!"默認值'} 如果name為空,就會輸出默認值
${name!666}如果name為空,會輸出666
${student.name}如果student或者name為空,報錯
${student.name!"默認值"}如果student為空,會報錯,name為空,輸出默認值
??測試是否為null,返回Boolean類型的值
product.color??將只測試color是否為null
(product.color)??將測試product和color是否存在null
??和?的區別
??是判斷對象是否為空,例如:<#if object??>object對象不為空(即object存在)</#if>
?后面要加內建函數名,例如:<#if object?exists>object對象不為空(即object存在)</#if>
<#if str??>${str?string}</#if><#--將str以字符串形式顯示-->
8.include標簽
<#include “模板名稱“>
三:freemarker和spring的整合
(1)將Configuration對象的創建交給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>
(2)進行測試
@Controller public class HtmlGenController { @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; @RequestMapping("/genhtml") @ResponseBody public String genHtml()throws Exception { // 1、從spring容器中獲得FreeMarkerConfigurer對象。 // 2、從FreeMarkerConfigurer對象中獲得Configuration對象。 Configuration configuration = freeMarkerConfigurer.getConfiguration(); // 3、使用Configuration對象獲得Template對象。 Template template = configuration.getTemplate("hello.ftl"); // 4、創建數據集 Map dataModel = new HashMap<>(); dataModel.put("hello", "1000"); // 5、創建輸出文件的Writer對象。 Writer out = new FileWriter(new File("D:/temp/term197/out/spring-freemarker.html")); // 6、調用模板對象的process方法,生成文件。 template.process(dataModel, out); // 7、關閉流。 out.close(); return "OK"; } }
錯誤的地方希望大家指正。
