java-freemarker-實現layout佈局框架的一些思路
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 方法,檢視效果
3.需要四個頁面的程式碼如下:
3.1 tmpLayout.ftl //佈局頁
3.2 tmpBody.ftl //主業務頁
3.3 tmpFooter.ftl //頁尾
3.4 tmpHeader.ftl //頁頭
在 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>
相關文章
- layout佈局
- UIColletionView瀑布流佈局實現思路以及封裝的實現UIView封裝
- 談談實現瀑布流佈局的幾種思路
- Android Layout 之 RelativeLayout,程式碼實現相對佈局Android
- Thymeleaf利用layout.html檔案生成頁面佈局框架HTML框架
- 進擊的佈局之Grid Layout
- 佈局方案的思路整理
- Xamarin 學習筆記 - Layout(佈局)筆記
- 佈局總結-水平居中佈局的實現
- ASP.NET Core MVC 之佈局(Layout)ASP.NETMVC
- easyui-layout佈局高度自適應UI
- Android View 佈局流程(Layout)完全解析AndroidView
- 從 Auto Layout 的佈局演算法談效能演算法
- SAP Spartacus Page Layout - 頁面佈局設計
- Element原始碼分析系列1一Layout(佈局)原始碼
- SAP UI5 SimpleForm 的 two-column layout 佈局UIORM
- css佈局-實現左中右佈局的5種方式CSS
- 聖盃佈局進階版-flex佈局實現Flex
- CSS佈局–聖盃佈局和雙飛翼佈局以及使用Flex實現聖盃佈局CSSFlex
- 原始碼解析Android中View的layout佈局過程原始碼AndroidView
- CSS多種佈局方式自我實現-水平佈局(二)CSS
- 2024,該放棄框架來實現 Web 佈局了框架Web
- jQuery實現瀑布流佈局jQuery
- Grid 拖拽佈局實現
- 原生 js 實現瀑布流佈局、React 版本的瀑布流佈局元件JSReact元件
- 5 種常用佈局的 flex 實現Flex
- 三欄佈局的n種實現
- 效能優化-FSL(Force Synchronous Layout)強制同步佈局優化
- 從 Chrome 原始碼看瀏覽器如何 layout 佈局Chrome原始碼瀏覽器
- 使用 CSS columns 佈局來實現自動分組佈局CSS
- 使用第三方框架 Masonry 實現自動佈局框架
- Flutter框架分析(六)-- 佈局Flutter框架
- 實現三欄佈局的幾種方法
- 一種子圖佈局方法的實現
- div 實現田字格佈局
- 使用flex 實現聖盃佈局Flex
- GridView實現方塊佈局View
- 用flex佈局實現Sticky FootersFlex