`
qq123zhz
  • 浏览: 524413 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

freemarker 自定义freeMarker标签

    博客分类:
  • java
阅读更多
import java.io.IOException;
import java.io.Writer;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import freemarker.core.Environment;
import freemarker.ext.beans.ArrayModel;
import freemarker.template.ObjectWrapper;
import freemarker.template.SimpleCollection;
import freemarker.template.SimpleNumber;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateBooleanModel;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;

public class GetNextDirective implements TemplateDirectiveModel {

	private static final String PARAM_SOURCELIST = "sourceList";
	private static final String PARAM_INDEX = "index";

	/* (non-Javadoc)
	 * @see freemarker.template.TemplateDirectiveModel#execute(freemarker.core.Environment, java.util.Map, freemarker.template.TemplateModel[], freemarker.template.TemplateDirectiveBody)
	 */
	public void execute(Environment env, Map params, TemplateModel[] loopVars,
			TemplateDirectiveBody body) throws TemplateException, IOException {

		// ---------------------------------------------------------------------
		// 处理参数

		List sourceListParam = null;
		int indexParam = 0;

		Iterator paramIter = params.entrySet().iterator();
		while (paramIter.hasNext()) {
			Map.Entry ent = (Map.Entry) paramIter.next();

			String paramName = (String) ent.getKey();
			TemplateModel paramValue = (TemplateModel) ent.getValue();

			if (paramName.equals(PARAM_SOURCELIST)) {
//				if (!(paramValue instanceof TemplateNumberModel)) {
//					throw new TemplateModelException("The \"" + PARAM_NAME_HR
//							+ "\" parameter " + "must be a number.");
//				}
				sourceListParam = (List) ((SimpleSequence) paramValue).toList();
//				if (countParam < 0) {
//					throw new TemplateModelException("The \"" + PARAM_NAME_HR
//							+ "\" parameter " + "can't be negative.");
//				}
			} else if (paramName.equals(PARAM_INDEX)) {
//				if (!(paramValue instanceof TemplateBooleanModel)) {
//					throw new TemplateModelException("The \"" + PARAM_NAME_HR
//							+ "\" parameter " + "must be a boolean.");
//				}
				indexParam = ((TemplateNumberModel) paramValue).getAsNumber().intValue();
			} else {
				throw new TemplateModelException("Unsupported parameter: "
						+ paramName);
			}
		}

		if (loopVars.length > 1) {
			throw new TemplateModelException(
					"At most one loop variable is allowed.");
		}

		// Yeah, it was long and boring...

		// ---------------------------------------------------------------------
		// 真正开始处理输出内容

		Writer out = env.getOut();
//		if (body != null) {
			
			Object  data = sourceListParam.get(indexParam);
//			out.write(data.toString());
			
			 env.setVariable("obj", ObjectWrapper.DEFAULT_WRAPPER.wrap(data));   
			 if (body != null) {    
				 body.render(env.getOut());  
				 }
			
//			for (int i = 0; i < countParam; i++) {
//				// 输出 <hr> 如果 参数hr 设置为true
//				if (hrParam && i != 0) {
//					out.write("<hr>");
//				}
//
//				// 设置循环变量
//				if (loopVars.length > 0) {
//					loopVars[0] = new SimpleNumber(i + 1);
//				}
//
//				// 执行标签内容(same as <#nested> in FTL).
//				body.render(env.getOut());
//			}
//		}
	}

}

 

<#assign x = 1>   
 一个参数:   
 <@repeat count=4>   
   Test ${x}   
   <#assign x = x + 1>   
 </@repeat>   
   
 二个参数:   
 <@repeat count=3 hr=true>   
   Test   
 </@repeat>   
   
 循环变量:   
 <@repeat count=3; cnt>   
   ${cnt}. Test   
 </@repeat>  
 
 <#assign tt = ['1','2','3']/>
<#list sslist as x>
	<#if x_has_next>
	<@getNext sourceList=sslist index=x_index+1>
	id=${obj.id}
	name=${obj.name}
	</@getNext>
	</#if>
</#list>
<#--
<@getNext sourceList=sslist index=1>
	id=${obj.id}
	name=${obj.name}
</@getNext>
-->

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics