<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 2.7 自定義資源加載器 如果模板資源來自其他地方,如數據庫,或者混合了數據庫和物理文件,或者模板是加密的,則需要自定義一個資源加載器。資源加載器需要實現ResourceLoader類。如下: ```java public interface ResourceLoader{ /** * 根據key獲取Resource * * @param key * @return */ public Resource getResource(String key); /** 檢測模板是否更改,每次渲染模板前,都需要調用此方法,所以此方法不能占用太多時間,否則會影響渲染功能 * @param key * @return */ public boolean isModified(Resource key); /** * 關閉ResouceLoader,通常是GroupTemplate關閉的時候也關閉對應的ResourceLoader */ public void close(); /** 一些初始化方法 * @param gt */ public void init(GroupTemplate gt); /** 用于include,layout等根據相對路徑計算資源實際的位置. * @param resource 當前資源 * @param key * @return */ public String getResourceId(Resource resource, String key); } ``` 如下是一個簡單的內存ResourceLoader ```java public class MapResourceLoader implements ResourceLoader{ Map data; public MapResourceLoader(Map data){ this.data = data; } @Override public Resource getResource(String key){ String content = (String) data.get(key); if (content == null) return null; return new StringTemplateResource(content, this); } @Override public boolean isModified(Resource key){ return false; } @Override public boolean exist(String key){ return data.contain(key); } @Override public void close(){ } @Override public void init(GroupTemplate gt){ } @Override public String getResourceId(Resource resource, String id){ //不需要計算相對路徑 return id; } } ``` init方法可以初始化GroupTemplate,比如讀取配置文件的root屬性,autoCheck屬性,字符集屬性,以及加載functions目錄下的所有模板方法 如FileResourceLoader 的 init方法 ```java @Override public void init(GroupTemplate gt){ Map<String, String> resourceMap = gt.getConf().getResourceMap(); if (this.root == null){ this.root = resourceMap.get("root"); } if (this.charset == null){ this.charset = resourceMap.get("charset"); } if (this.functionSuffix == null){ this.functionSuffix = resourceMap.get("functionSuffix"); } this.autoCheck = Boolean.parseBoolean(resourceMap.get("autoCheck")); File root = new File(this.root, this.functionRoot); this.gt = gt; if (root.exists()){ readFuntionFile(root, "", "/".concat(functionRoot).concat("/")); } } ``` readFuntionFile 方法將讀取functions下的所有模板,并注冊為方法 ```java protected void readFuntionFile(File funtionRoot, String ns, String path){ String expected = ".".concat(this.functionSuffix); File[] files = funtionRoot.listFiles(); for (File f : files){ if (f.isDirectory()){ //讀取子目錄 readFuntionFile(f, f.getName().concat("."), path.concat(f.getName()).concat("/")); } else if (f.getName().endsWith(functionSuffix)){ String resourceId = path + f.getName(); String fileName = f.getName(); fileName = fileName.substring(0, (fileName.length() - functionSuffix.length() - 1)); String functionName = ns.concat(fileName); FileFunctionWrapper fun = new FileFunctionWrapper(resourceId); gt.registerFunction(functionName, fun); } } } ``` Resource類需要實現OpenReader方法,以及isModified方法。對于模板內容存儲在數據庫中,openReader返回一個Clob,isModified 則需要根據改模板內容對應的lastUpdate(通常數據庫應該這么設計)來判斷模板是否更改 ```java public abstract class Resource{ /** * 打開一個新的Reader * * @return */ public abstract Reader openReader(); /** * 檢測資源是否改變 * * @return */ public abstract boolean isModified(); ``` 參考例子可以參考beetl自帶的ResourceLoader
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看