在模板中除了可以通过对象来调用方法如:${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