freeMarker使用心得(一)

  首先,曾经天真的以为freemarker跟jstl和el一样,只是显示数据用的标签。但是实际上freemarker数据jsp级别的,可以用来生成静态页面。

  先来看看freemarker在页面上是如何被调用的。

   

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;
   }

   第一个方法,初始化模板的配置,包括模板所在文件夹的位置,规定编码方式等等。

   最下面createPage方法是在jsp上调用的,传入的map即为传入的数据集合,templatePath是模板文件夹在项目的绝对路径,ftlName则是具体模板的名称。中间调用的process自己体会了(没有异常抓取等等,凑合用)


  模板的所在的文件夹可以自己设立,本项目中在WebRoot下的template中。

  模板的具体长相:

<#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中的写法:

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了。

  

  ps:freemarker上无法写java代码,可以实现真正的v_c层的分离。

转载于:https://my.oschina.net/u/2357858/blog/534727

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值