java-freemarker-實現layout佈局框架的一些思路

草青工作室發表於2017-03-31
java-freemarker-實現layout佈局框架的一些思路


在 web 開發中經常會用到母版頁、佈局頁的概念,將頁面公共部分提煉出來,
有兩種思路可以服用公共頁,這裡使用 使用 body.html、header.html、footer.html 舉例
方法一:在當 body.html 使用 include 方式引用 header.html、footer.html,這需要在專案中的所有頁面中都需要 include 這兩個頁面
方法二:提煉出一個 全域性公共的 佈局頁 layout.html ,裡面引用固定的 header.html、footer.html,動態引用 body.html 頁


兩種方案比較:
假如現在專案有 100 個頁面,現在當需要在所有頁面的底部新增一個 version.html 頁;
使用“方法一”需要在所有的頁面中修改一次(當然也可以把 version.html 寫到 footer.html 中實現);
使用“方法二”只需要修改 layout.html 即可;


下面就使用 freemarker 完成 “方法二” 的功能。
邏輯大概是:每次返回模板地址時,都返回 layout.html 的地址,兒 body.html 地址則通過動態引數形式下發到 layout.html 中;


注:按照 freemarker 的習慣,模板檔案都改用 .ftl 命名,思想可以用於 web 專案,但這裡只用變成方式實現,沒有引用web框架;


1.需要四個頁面:
tmpLayout.ftl //佈局頁
tmpBody.ftl //主業務頁
tmpFooter.ftl //頁尾
tmpHeader.ftl //頁頭


2.測試類,執行 testLayout 方法,檢視效果

package freemarker.razor;


import java.io.*;
import java.util.*;


import org.junit.Before;
import org.junit.Test;


import freemarker.core.ParseException;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;


/** 
*
* @author xxj 
*/
public class testRazor {
	@Before
	public void init(){
		cfg = new Configuration(Configuration.VERSION_2_3_23);		
		//載入模板
		cfg.setClassForTemplateLoading(this.getClass(), "");
		cfg.setDefaultEncoding("utf-8");
	}
	Configuration cfg = null;
	
	@Test 
	public void testLayout(){
		//引數
		Map<String,Object> pars = new HashMap<String,Object>();
		pars.put("name", "張三");
		pars.put("date", new Date());
		layoutViewer("tmpBody.ftl",pars);
	}
	/**
	 * 使用 佈局頁
	 * @param pagePath 必須:當前頁面地址
	 */
	public void layoutViewer(String pagePath
			,Map<String, Object> pars){
		//定義 body 頁路徑引數
		pars.put("body_file_path", pagePath);
		try{
			String layoutPath="tmpLayout.ftl";//佈局頁地址固定
			//模板(預設載入佈局頁)
			Template tmp = cfg.getTemplate(layoutPath);				
			//合併模板和資料模型
			Writer out = new OutputStreamWriter(System.out);//建立一個輸出流,這裡指列印到控制檯
			tmp.process(pars, out);
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
}




3.需要四個頁面的程式碼如下:
3.1 tmpLayout.ftl //佈局頁

<!doctype html>
<html lang="en">
 <head>
<#attempt>
  <title>${title_name}</title>
<#recover>
  <title>標題</title>
</#attempt>
 </head>
 <body>
<!--頁頭 begin -->
<#include "tmpHeader.ftl">
<!--body begin -->
<#include "${body_file_path}"><#--body頁內容動態輸出-->
<!--頁尾 begin -->
<#include "tmpFooter.ftl">
 </body>
</html>

3.2 tmpBody.ftl //主業務頁

<!--body內容-->
<div>
 name:${name}
 date:${date?string("yyyy-MM-dd HH:mm:ss zzzz")}
</div>

3.3 tmpFooter.ftl //頁尾

<div>頁頭部分</div>

3.4 tmpHeader.ftl //頁頭
<div>頁尾部分</div>


相關文章