1. 程式人生 > >freemarker 自定義freeMarker標籤

freemarker 自定義freeMarker標籤

Java程式碼 複製程式碼 收藏程式碼
  1. import java.io.IOException;   
  2. import java.io.Writer;   
  3. import java.util.Iterator;   
  4. import java.util.List;   
  5. import java.util.Map;   
  6. import freemarker.core.Environment;   
  7. import freemarker.ext.beans.ArrayModel;   
  8. import freemarker.template.ObjectWrapper;   
  9. import freemarker.template.SimpleCollection;   
  10. import freemarker.template.SimpleNumber;   
  11. import freemarker.template.SimpleSequence;   
  12. import freemarker.template.TemplateBooleanModel;   
  13. import freemarker.template.TemplateDirectiveBody;   
  14. import freemarker.template.TemplateDirectiveModel;   
  15. import freemarker.template.TemplateException;   
  16. import freemarker.template.TemplateModel;   
  17. import freemarker.template.TemplateModelException;   
  18. import freemarker.template.TemplateNumberModel;   
  19. public class GetNextDirective implements TemplateDirectiveModel {   
  20.     private static final String PARAM_SOURCELIST = "sourceList";   
  21.     private static final String PARAM_INDEX = "index";   
  22.     /* (non-Javadoc)
     
  23.      * @see freemarker.template.TemplateDirectiveModel#execute(freemarker.core.Environment, java.util.Map, freemarker.template.TemplateModel[], freemarker.template.TemplateDirectiveBody)  
  24.      */  
  25.     public void execute(Environment env, Map params, TemplateModel[] loopVars,   
  26.             TemplateDirectiveBody body) throws TemplateException, IOException {   
  27.         // ---------------------------------------------------------------------   
  28.         // 處理引數   
  29.         List sourceListParam = null;   
  30.         int indexParam = 0;   
  31.         Iterator paramIter = params.entrySet().iterator();   
  32.         while (paramIter.hasNext()) {   
  33.             Map.Entry ent = (Map.Entry) paramIter.next();   
  34.             String paramName = (String) ent.getKey();   
  35.             TemplateModel paramValue = (TemplateModel) ent.getValue();   
  36.             if (paramName.equals(PARAM_SOURCELIST)) {   
  37. //              if (!(paramValue instanceof TemplateNumberModel)) {   
  38. //                  throw new TemplateModelException("The \"" + PARAM_NAME_HR   
  39. //                          + "\" parameter " + "must be a number.");   
  40. //              }   
  41.                 sourceListParam = (List) ((SimpleSequence) paramValue).toList();   
  42. //              if (countParam < 0) {   
  43. //                  throw new TemplateModelException("The \"" + PARAM_NAME_HR   
  44. //                          + "\" parameter " + "can't be negative.");   
  45. //              }   
  46.             } else if (paramName.equals(PARAM_INDEX)) {   
  47. //              if (!(paramValue instanceof TemplateBooleanModel)) {   
  48. //                  throw new TemplateModelException("The \"" + PARAM_NAME_HR   
  49. //                          + "\" parameter " + "must be a boolean.");   
  50. //              }   
  51.                 indexParam = ((TemplateNumberModel) paramValue).getAsNumber().intValue();   
  52.             } else {   
  53.                 throw new TemplateModelException("Unsupported parameter: "  
  54.                         + paramName);   
  55.             }   
  56.         }   
  57.         if (loopVars.length > 1) {   
  58.             throw new TemplateModelException(   
  59.                     "At most one loop variable is allowed.");   
  60.         }   
  61.         // Yeah, it was long and boring...   
  62.         // ---------------------------------------------------------------------   
  63.         // 真正開始處理輸出內容   
  64.         Writer out = env.getOut();   
  65. //      if (body != null) {   
  66.             Object  data = sourceListParam.get(indexParam);   
  67. //          out.write(data.toString());   
  68.              env.setVariable("obj", ObjectWrapper.DEFAULT_WRAPPER.wrap(data));      
  69.              if (body != null) {       
  70.                  body.render(env.getOut());     
  71.                  }   
  72. //          for (int i = 0; i < countParam; i++) {   
  73. //              // 輸出 <hr> 如果 引數hr 設定為true   
  74. //              if (hrParam && i != 0) {   
  75. //                  out.write("<hr>");   
  76. //              }   
  77. //   
  78. //              // 設定迴圈變數   
  79. //              if (loopVars.length > 0) {   
  80. //                  loopVars[0] = new SimpleNumber(i + 1);   
  81. //              }   
  82. //   
  83. //              // 執行標籤內容(same as <#nested> in FTL).   
  84. //              body.render(env.getOut());   
  85. //          }   
  86. //      }   
  87.     }   
  88. }  
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());
//			}
//		}
	}

}
Java程式碼 複製程式碼 收藏程式碼
  1. <#assign x = 1>      
  2.  一個引數:      
  3.  <@repeat count=4>      
  4.    Test ${x}      
  5.    <#assign x = x + 1>      
  6.  </@repeat>      
  7.  二個引數:      
  8.  <@repeat count=3 hr=true>      
  9.    Test      
  10.  </@repeat>      
  11.  迴圈變數:      
  12.  <@repeat count=3; cnt>      
  13.    ${cnt}. Test      
  14.  </@repeat>     
  15.  <#assign tt = ['1','2','3']/>   
  16. <#list sslist as x>   
  17.     <#if x_has_next>   
  18.     <@getNext sourceList=sslist index=x_index+1>   
  19.     id=${obj.id}   
  20.     name=${obj.name}   
  21.     </@getNext>   
  22.     </#if>   
  23. </#list>   
  24. <#--   
  25. <@getNext sourceList=sslist index=1>   
  26.     id=${obj.id}   
  27.     name=${obj.name}   
  28. </@getNext>   
  29. -->  
<#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>
-->