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.   
  7. import freemarker.core.Environment;   
  8. import freemarker.ext.beans.ArrayModel;   
  9. import freemarker.template.ObjectWrapper;   
  10. import freemarker.template.SimpleCollection;   
  11. import freemarker.template.SimpleNumber;   
  12. import freemarker.template.SimpleSequence;   
  13. import freemarker.template.TemplateBooleanModel;   
  14. import freemarker.template.TemplateDirectiveBody;   
  15. import freemarker.template.TemplateDirectiveModel;   
  16. import freemarker.template.TemplateException;   
  17. import freemarker.template.TemplateModel;   
  18. import freemarker.template.TemplateModelException;   
  19. import freemarker.template.TemplateNumberModel;   
  20.   
  21. public class GetNextDirective implements TemplateDirectiveModel {   
  22.   
  23.     private static final String PARAM_SOURCELIST = "sourceList";   
  24.     private static final String PARAM_INDEX = "index";   
  25.   
  26.     /* (non-Javadoc)  
  27.      * @see freemarker.template.TemplateDirectiveModel#execute(freemarker.core.Environment, java.util.Map, freemarker.template.TemplateModel[], freemarker.template.TemplateDirectiveBody)  
  28.      */  
  29.     public void execute(Environment env, Map params, TemplateModel[] loopVars,   
  30.             TemplateDirectiveBody body) throws TemplateException, IOException {   
  31.   
  32.         // ---------------------------------------------------------------------   
  33.         // 处理参数   
  34.   
  35.         List sourceListParam = null;   
  36.         int indexParam = 0;   
  37.   
  38.         Iterator paramIter = params.entrySet().iterator();   
  39.         while (paramIter.hasNext()) {   
  40.             Map.Entry ent = (Map.Entry) paramIter.next();   
  41.   
  42.             String paramName = (String) ent.getKey();   
  43.             TemplateModel paramValue = (TemplateModel) ent.getValue();   
  44.   
  45.             if (paramName.equals(PARAM_SOURCELIST)) {   
  46. //              if (!(paramValue instanceof TemplateNumberModel)) {   
  47. //                  throw new TemplateModelException("The \"" + PARAM_NAME_HR   
  48. //                          + "\" parameter " + "must be a number.");   
  49. //              }   
  50.                 sourceListParam = (List) ((SimpleSequence) paramValue).toList();   
  51. //              if (countParam < 0) {   
  52. //                  throw new TemplateModelException("The \"" + PARAM_NAME_HR   
  53. //                          + "\" parameter " + "can't be negative.");   
  54. //              }   
  55.             } else if (paramName.equals(PARAM_INDEX)) {   
  56. //              if (!(paramValue instanceof TemplateBooleanModel)) {   
  57. //                  throw new TemplateModelException("The \"" + PARAM_NAME_HR   
  58. //                          + "\" parameter " + "must be a boolean.");   
  59. //              }   
  60.                 indexParam = ((TemplateNumberModel) paramValue).getAsNumber().intValue();   
  61.             } else {   
  62.                 throw new TemplateModelException("Unsupported parameter: "  
  63.                         + paramName);   
  64.             }   
  65.         }   
  66.   
  67.         if (loopVars.length > 1) {   
  68.             throw new TemplateModelException(   
  69.                     "At most one loop variable is allowed.");   
  70.         }   
  71.   
  72.         // Yeah, it was long and boring...   
  73.   
  74.         // ---------------------------------------------------------------------   
  75.         // 真正开始处理输出内容   
  76.   
  77.         Writer out = env.getOut();   
  78. //      if (body != null) {   
  79.                
  80.             Object  data = sourceListParam.get(indexParam);   
  81. //          out.write(data.toString());   
  82.                
  83.              env.setVariable("obj", ObjectWrapper.DEFAULT_WRAPPER.wrap(data));      
  84.              if (body != null) {       
  85.                  body.render(env.getOut());     
  86.                  }   
  87.                
  88. //          for (int i = 0; i < countParam; i++) {   
  89. //              // 输出 <hr> 如果 参数hr 设置为true   
  90. //              if (hrParam && i != 0) {   
  91. //                  out.write("<hr>");   
  92. //              }   
  93. //   
  94. //              // 设置循环变量   
  95. //              if (loopVars.length > 0) {   
  96. //                  loopVars[0] = new SimpleNumber(i + 1);   
  97. //              }   
  98. //   
  99. //              // 执行标签内容(same as <#nested> in FTL).   
  100. //              body.render(env.getOut());   
  101. //          }   
  102. //      }   
  103.     }   
  104.   
  105. }  
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.  二个参数:      
  9.  <@repeat count=3 hr=true>      
  10.    Test      
  11.  </@repeat>      
  12.       
  13.  循环变量:      
  14.  <@repeat count=3; cnt>      
  15.    ${cnt}. Test      
  16.  </@repeat>     
  17.     
  18.  <#assign tt = ['1','2','3']/>   
  19. <#list sslist as x>   
  20.     <#if x_has_next>   
  21.     <@getNext sourceList=sslist index=x_index+1>   
  22.     id=${obj.id}   
  23.     name=${obj.name}   
  24.     </@getNext>   
  25.     </#if>   
  26. </#list>   
  27. <#--   
  28. <@getNext sourceList=sslist index=1>   
  29.     id=${obj.id}   
  30.     name=${obj.name}   
  31. </@getNext>   
  32. -->  
<#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>
-->

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中使用 Freemarker 自定义标签,可以通过以下步骤实现: 1. 创建一个自定义标签类,继承 `freemarker.template.TemplateDirectiveModel` 接口,并实现其中的 `execute` 方法,该方法用于处理自定义标签的逻辑。 ```java @Component public class CustomTagDirective implements TemplateDirectiveModel { @Autowired private UserService userService; // 举例注入一个服务类 @Override public void execute(Environment environment, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { // 处理自定义标签逻辑,可以使用 environment、params、body 等参数 String userId = params.get("userId").toString(); User user = userService.getUserById(userId); environment.getOut().write(user.getName()); } } ``` 2. 在 Spring Boot 的配置文件中注册自定义标签类。 ```java @Configuration public class FreemarkerConfig { @Autowired private CustomTagDirective customTagDirective; @Bean public FreeMarkerConfigurer freeMarkerConfigurer() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("classpath:/templates"); Map<String, Object> variables = new HashMap<>(); variables.put("customTag", customTagDirective); configurer.setFreemarkerVariables(variables); return configurer; } } ``` 3. 在 Freemarker 模板中使用自定义标签。 ```html <#assign userId = "1" /> <@customTag userId=userId /> ``` 在以上代码中,我们首先通过 `<#assign>` 定义了一个变量 `userId`,然后通过 `<@customTag>` 调用自定义标签,并将 `userId` 作为参数传入。 这样就可以在 Spring Boot 中使用自定义Freemarker 标签了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值