freeMarker使用心得(一)

  首先,曾經天真的覺得freemarker跟jstl和el同樣,只是顯示數據用的標籤。可是實際上freemarker數據jsp級別的,能夠用來生成靜態頁面。html

  先來看看freemarker在頁面上是如何被調用的。java

   

public class FreeMarkHander {

   private Configuration cfg; // 模版配置對象

   public void init(String templatePath) throws Exception {
      // 初始化FreeMarker配置
      // 建立一個Configuration實例
      cfg = new Configuration(Configuration.VERSION_2_3_21);
      // 設置FreeMarker的模版文件夾位置   
      //String templatePath = request.getSession().getServletContext().getRealPath("/template");
      cfg.setDirectoryForTemplateLoading(new File(templatePath));
      // 設置異常處理器
      cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
      cfg.setDefaultEncoding("utf-8");
   }

   public String process(Map<String, Object>  map, String ftl) throws Exception {
      String rtn = "";
      Template tpl = cfg.getTemplate(ftl);
      ByteOutputStream stream = new ByteOutputStream();
      Writer out = new OutputStreamWriter(stream);
      tpl.process(map, out);
      out.flush();
      rtn = stream.toString();
      return rtn;

   }
   
   /****
    * 數據渲染html片斷
    * @param map            填充數據
    * @param templatePath   模板路徑
    * @param ftlName        模板名稱       
    * @return html片斷字符串
    * @throws Exception
    */
   public static String createPage(Map<String, Object>  map,String templatePath,String ftlName)throws Exception {
      String html = "";
      FreeMarkHander fh = new FreeMarkHander();
      fh.init(templatePath);
      html = fh.process(map,ftlName);
      return html;
   }

   第一個方法,初始化模板的配置,包括模板所在文件夾的位置,規定編碼方式等等。jsp

   最下面createPage方法是在jsp上調用的,傳入的map即爲傳入的數據集合,templatePath是模板文件夾在項目的絕對路徑,ftlName則是具體模板的名稱。中間調用的process本身體會了(沒有異常抓取等等,湊合用)編碼


  模板的所在的文件夾能夠本身設立,本項目中在WebRoot下的template中。spa

  模板的具體長相:code

<#if newList?size gt 0>
<div class="list">
    <ul>
<#list newList as news>
    <li id="${news.news_id}" name="news_list"><a href="${news.news_id?default('')}" target="_blank" title="${news.title?default('')}"><i class="icon icon-arrow"></i><span>${news.title?default('')}</span></a></li>
</#list>
    </ul>
</div>
<div class="more"><a id="the_more_news">更多 <i class="icon icon-arrow-double"> </i></a></div>
<#else >
<div class="list empty">
    <div class="page-message-empty">
        <div class="mascot cry"><i class="icon icon-none-cry"></i>
            <div class="message">沒有相關資訊</div>
        </div>
    </div>
</div>
</#if>

  在jsp中的寫法:htm

NewsService newService = new NewsServiceImpl();
List<News> newList = newService.newsList(org_id, dataSource);//獲取須要渲染的數據
map.put("newList",newList);//裝進map
String str = FreeMarkHander.createPage(map, templatePath, "news.ftl");//將數據扔進模板渲染

  最後,在頁面上須要的位置對象

<%=str%>

就OK了。utf-8

  

  ps:freemarker上沒法寫java代碼,能夠實現真正的v_c層的分離。字符串

相關文章
相關標籤/搜索