FreeMarker 自定义方法

来源:互联网 发布:android 网络抓包工具 编辑:程序博客网 时间:2024/04/29 16:58
在FreeMarker中自定义方法

 

在模板中除了可以通过对象来调用方法如:${object.methed(args)},也可以直接调用java实现的方法。

该java类必须实现于接口TemplateMethodModel。

下面是一个结合struts2 的例子:
package com.safetys.commerce.youqi.web.tag;

import java.util.List;

import com.safetys.commerce.core.domain.model.cms.CmsNews;
import com.safetys.commerce.youqi.facade.iface.NewsFacadeIface;

import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;

 

public class NewsListMethod implements TemplateMethodModel {
 private NewsFacadeIface newsFacadeIface;


 public NewsListMethod(NewsFacadeIface newsFacadeIface){
  this.newsFacadeIface=newsFacadeIface;
 }


 public List<CmsNews> exec(List parameter) throws TemplateModelException {
  List<CmsNews> newss=null;
  if(parameter.size()>=3){
   String channelCode=parameter.get(0).toString();
   int begin=0;
   int end=0;
   try {
    begin=Integer.parseInt(parameter.get(1).toString());
    end=Integer.parseInt(parameter.get(2).toString());
    newss=newsFacadeIface.loadNewss(channelCode,begin,end);
   } catch (Exception e) {
    e.printStackTrace();
    return null;
   }
   
  }
  return newss;
 }

}

以上这个类是实现了TemplateMethodModel 的一个自定义方法类

在Action类上加上此属性如例:


package com.safetys.commerce.youqi.web.action;

import java.util.List;


import com.safetys.commerce.core.domain.model.cms.CmsNews;
import com.safetys.commerce.youqi.facade.iface.NewsFacadeIface;
import com.safetys.commerce.youqi.web.action.base.YouQiAppAction;
import com.safetys.commerce.youqi.web.tag.NewsListMethod;
import com.safetys.framework.domain.model.pagination.Pagination;
import com.safetys.framework.exception.ApplicationAccessException;


public class NewsAction extends YouQiAppAction{
 
 private static final long serialVersionUID = 1L;

 private NewsFacadeIface newsFacadeIface;
 private Pagination pagination;
 private CmsNews news;
 private List<CmsNews> chieflyNewss;
 private NewsListMethod newsList;
 
 public String index(){
  try {
   if(pagination==null){
    pagination=new Pagination();
    pagination.setPageSize(20);
   }
   chieflyNewss=newsFacadeIface.loadNews(null, pagination);
   news=newsFacadeIface.loadNewForChiefly();
   
  } catch (ApplicationAccessException ae){
   applicationAccessExceptionEvent(ae);
   ae.printStackTrace();
   return ERROR;
  } catch (Exception e) {
   e.printStackTrace();
   return ERROR;
  }
  
  return SUCCESS;
 }
 
 
 public void setNewsFacadeIface(NewsFacadeIface newsFacadeIface) {
  this.newsFacadeIface = newsFacadeIface;
 }
 public List<CmsNews> getChieflyNewss() {
  return chieflyNewss;
 }
 public void setChieflyNewss(List<CmsNews> chieflyNewss) {
  this.chieflyNewss = chieflyNewss;
 }
 public CmsNews getNews() {
  return news;
 }
 public void setNews(CmsNews news) {
  this.news = news;
 }
 public Pagination getPagination() {
  return pagination;
 }
 public void setPagination(Pagination pagination) {
  this.pagination = pagination;
 }


 public NewsListMethod getNewsList() {
  if(newsList==null)
   newsList=new NewsListMethod(newsFacadeIface);
  return newsList;
 }


 public void setNewsList(NewsListMethod newsList) {
  this.newsList = newsList;
 }

}

在freemarker模版上取值:

      <#assign chNewsList=newsList("anquanzixun",1,5)>
      <#list chNewsList as news>
            <li><a href="#">· ${news.newsTitle}}  (02-06)</a></li>
      </#list>

 

 

再一个简单的例子:

将LongToDate对象放入到数据模型中
root.put("timer", new IndexOfMethod());
ftl模板里使用
<#assign x = "123112455445">
${timer("yyyy-MM-dd H:mm:ss", x)}
${timer("yyyy-MM-dd ", x)}

输出
2001-10-12 5:21:12
2001-10-12

原创粉丝点击