`
qq123zhz
  • 浏览: 530602 次
  • 性别: 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>
-->

 

分享到:
评论

相关推荐

    Freemarker 自定义标签 简单案例

    在这个"Freemarker自定义标签简单案例"中,我们将深入探讨如何利用Freemarker进行模板设计,并结合自定义标签来增强模板的功能。 首先,让我们理解Freemarker的基础知识。Freemarker是一个与语言无关的模板引擎,它...

    spring mvc freemarker 自定义标签

    下面将详细介绍Spring MVC与Freemarker自定义标签的使用。 首先,我们需要了解Freemarker的基础。Freemarker是一个基于模板的语言,它的主要任务是根据数据模型生成输出。在Spring MVC中,Freemarker模板通常用于...

    freemarker自定义的通用分页指令(标签)源码和使用示例

    一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx

    freemarker自定义分页标签宏

    在这个主题“freemarker自定义分页标签宏”中,我们将深入探讨如何在FreeMarker中创建自定义的分页标签宏,以便更有效地管理和展示大量数据。 首先,分页是一种常见的网页设计技术,用于将大量数据分割成小块,使...

    实现通过jfinal框架自动扫描freemarker的自定义标签.zip

    本资源包的核心内容是教你如何在JFinal项目中实现FreeMarker自定义标签的自动扫描和注册,从而提升模板引擎的功能和灵活性。 首先,我们需要理解自定义标签的概念。在FreeMarker中,自定义标签允许开发者扩展其内置...

    Struts2、Spring、Freemarker自定义标签

    Freemarker支持条件判断、循环结构、内置函数,以及自定义标签,增强了模板的灵活性。与JSP相比,Freemarker通常被认为更简洁、易读且更易于维护。 将这三个框架结合使用,可以构建出高效、灵活的Java Web应用。...

    freemark 自定义标签 总结

    本篇文章将对Freemarker自定义标签进行深入的总结。 1. **自定义标签基础** 自定义标签在Freemarker中被称为`Custom Tags`,它们通过`&lt;@...&gt;`语法来调用。这些标签通常是由Java代码实现的,它们可以处理复杂的逻辑...

    Freemarker通用select下拉框

    首先,理解`select`下拉框在HTML中的基本结构,它由`&lt;select&gt;`标签定义,内部包含一系列`&lt;option&gt;`标签,每个`&lt;option&gt;`代表一个可选的值和显示文本: ```html &lt;option value="value1"&gt;Text1 ...

    使用freemarker扩展struts标签

    要扩展Struts2的FreeMarker标签库,你需要遵循以下步骤: 1. **创建模型类**: 定义模型类来封装业务逻辑和数据,如`AmHtmlModel`。 2. **实现标签类**: 创建一个Java类来实现自定义标签,例如`AmHtml`,并继承自...

    spring boot 集成 shiro 自定义密码验证 自定义freemarker标签根据权限渲染不同页面(推荐

    在这个示例中,我们将介绍如何将 Shiro 集成到 Spring Boot 项目中,并实现自定义密码验证和 Freemarker 标签根据权限渲染不同页面。 首先,需要在 pom.xml 文件中添加 Shiro 的依赖项: ```xml &lt;groupId&gt;org....

    springMVC3.2+Hibernate4+freemarker

    springMVC3.2+Hibernate4+freemarker 代码框架采用springMVC3.2.4+hibernate4.2.8+freemarker2.3.16 功能方面只是一个简单的注册登录,前台使用freemarker渲染,使用了freemarker自定义标签。

    freemarker及jeecms标签使用学习文档

    Freemarker是一个强大的模板...通过这些文档的学习,你将能够熟练地运用Freemarker来编写模板,以及在Jeecms中利用其自定义标签来构建高效、灵活的网站内容管理。不断实践和探索,将使你在Web开发领域更加游刃有余。

    freemarker的shiro标签

    8. **自定义标签**:除了内置的Shiro标签,开发者还可以根据项目需求自定义FreeMarker标签,扩展Shiro的功能,实现更具体的权限控制逻辑。 9. **错误处理**:在模板中使用Shiro标签时,要注意异常处理。当用户权限...

    非常好用的自定义分页标签

    4. **兼容性**:作为一个好用的自定义标签,它应该与各种视图技术(如JSP、FreeMarker、Thymeleaf等)兼容,并且适应不同的前端样式。 5. **易用性**:使用简单是这个组件的一大优点,意味着只需将`kevinb.jar`引入...

    FreeMarker标签、指令

    本文将深入探讨FreeMarker的标签、指令、插值规则以及表达式。 首先,FreeMarker 模板文件由四个主要部分组成: 1. 文本:这部分内容会被直接输出。 2. 注释:以`&lt;#-- ... --&gt;`形式存在,不会被输出到最终文档中。...

    freemarker语法完整版

    - 尽量使用Freemarker自带的标签以提高性能。 **10. 特殊指令** - `r` 原样输出。 - `?` 引出内置指令。 - `@` 用户自定义标签。 **11. 特殊操作符** - `!`: 默认值操作符。 - `??`: 缺失值测试操作符。 **...

    springboot集成freemarker和shiro框架

    1. 在FreeMarker模板中使用Shiro标签库:在.ftl文件顶部引入Shiro标签库: ```html ${'@org.apache.shiro.web.tags.ShiroTagLibHandler@getTagLibUri()'}"&gt; ${shiro}" as shiro/&gt; ``` 2. 使用Shiro标签:在模板中...

    freemarker格式化缩进文本或include指令

    "源码"标签表明我们可能需要查看FreeMarker的源代码来理解其内部工作原理,或者创建自定义扩展。FreeMarker是开源的,它的源代码可以在GitHub上找到。通过阅读源代码,开发者可以学习如何实现类似的特性,或者针对...

Global site tag (gtag.js) - Google Analytics