`

Struts2 Freemarker 自定义标签

 
阅读更多

1:FreemarkerManager:

package com.fangtoon.appcenterui.framework.struts2;

import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletContext;

import org.apache.struts2.views.freemarker.FreemarkerManager;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;

public class StrutsFreemarkerManager extends FreemarkerManager {

	@Override
	protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException {
		Configuration configuration = super.createConfiguration(servletContext);
		
		configuration.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX); // 设置标签类型([]、<>),[]这种标记解析要快些

		ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); // 取出上下文 

		Map<String, TemplateModel> beans = applicationContext.getBeansOfType(TemplateModel.class); // SpringContextHolder.getApplicationContext().getBeansOfType(TemplateDirectiveModel.class); // 获取实现TemplateDirectiveModel的bean 

		for (Entry<String, TemplateModel> entry : beans.entrySet()) {
			if (entry.getValue() != null && entry.getValue() instanceof TemplateModel) {
				configuration.setSharedVariable(entry.getKey(), entry.getValue());
			}
		}
		return configuration;
	}

}

 

2:struts.properties

struts.freemarker.manager.classname=com.fangtoon.appcenterui.framework.struts2.StrutsFreemarkerManager

 

3:具体的自定义标签实现:

package com.fangtoon.appcenterui.framework.struts2.tag.method;

import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;

@Component("dictItemName")
public class DictItemNameTemplate implements TemplateMethodModel {
	private Logger logger = LoggerFactory.getLogger(getClass());

	@Override
	@SuppressWarnings({ "rawtypes" })
	public Object exec(List args) throws TemplateModelException {
		String dictCode = (String) args.get(0);
		String dictItemCode = (String) args.get(1);
		return dictCode + " - " + dictItemCode;
	}

}

 

4:页面使用:

${dictItemName("APP_AUDIT_STATE","SUB_DICT_CODE")}

 

输出:

APP_AUDIT_STATE - SUB_DICT_CODE

 

 5: 自定义有方法体标签:

 

package com.fangtoon.appcenterui.framework.struts2.tag;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Component;

import freemarker.core.Environment;
import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;

@Component("forloop")
public class LoopsTemplateDirectiveModel implements TemplateDirectiveModel {

	@SuppressWarnings("rawtypes")
	public void execute(Environment environment, Map map, TemplateModel[] atemplatemodel, TemplateDirectiveBody templatedirectivebody) throws TemplateException, IOException {
		environment.setVariable("loops", ObjectWrapper.DEFAULT_WRAPPER.wrap(getLoops()));
		templatedirectivebody.render(environment.getOut());
	}

	private List<String> getLoops() {
		List<String> list = new ArrayList<String>();

		list.add("one");
		list.add("two");
		list.add("three")

		return list;
	}

}
 页面使用:

 

[@forloop]

[#list loops as loop] 

${loop

[/#list]

[/@forloop]

输出: one two three

分享到:
评论

相关推荐

    Struts2、Spring、Freemarker自定义标签

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

    Struts2_自定义标签的方法

    ### Struts2自定义标签详解 #### 一、引言 在Web开发中,Struts2框架因其灵活性和强大的功能而被广泛采用。其中,自定义标签是提高代码复用性和增强页面展示效果的重要手段。本文将深入探讨如何在Struts2中创建...

    Struts2 与Freemarker 的配置方法

    - Struts2允许自定义拦截器和结果类型,可以进一步定制Freemarker的渲染逻辑。此外,还可以使用Struts2的国际化和主题特性来实现多语言和不同样式表的支持。 总结来说,Struts2与Freemarker的配置主要是围绕工程的...

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

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

    freemark 自定义标签 总结

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

    struts2+freemarker

    5. **自定义标签库**:Struts2支持自定义标签,结合Freemarker的模板,可以创建出易于理解和维护的视图层代码。 6. **错误和异常处理**:Struts2提供了一套完善的异常处理机制,可以在发生错误时跳转到特定的错误...

    使用freemarker扩展struts标签

    5. **配置TLD**: 在`struts.xml`或单独的TLD文件中声明你的自定义标签,这样Struts2就知道如何解析和处理它们。 6. **在模板中使用标签**: 最后,在你的FreeMarker模板文件中,你可以像使用其他内置标签一样使用你的...

    在struts2的freemarker模板中扩展struts标签

    众所周知,struts2宣称freemarker模板中不再支持自定义标签,但如果工程UI仅用freemarker模板可以通过扩展struts标签简单实现,不是采用官方不推荐的配置JspSupportServlet实现的!内付详细说明及范例,此方法仅为团队...

    struts2自定义结果类型demo

    在Struts2中,结果类型(Result Type)是动作执行后处理结果的关键部分,它决定了如何将控制权转移给下一个资源,如JSP、FreeMarker模板或者重定向到其他URL。自定义结果类型允许开发者根据项目需求定制化结果处理...

    freemarker项目(从入门到与struts2结合)

    3. **结果拦截器**:Struts2允许使用拦截器来处理Action的执行前后,可以自定义拦截器来实现数据预处理或后处理,以适应FreeMarker模板的需求。 4. **动态方法调用**:FreeMarker支持Struts2的动态方法调用,这意味...

    Struts2与FreeMarker模板

    通过将Struts2的模型数据传递给FreeMarker模板,前端开发人员可以使用FreeMarker提供的丰富的模板标签和函数来渲染页面。 #### 配置Struts2与FreeMarker 在Struts2中使用FreeMarker之前,首先需要进行相应的配置。...

    Struts 2 自定义MVC 框架

    Struts 2支持多种视图技术,如JSP、FreeMarker、Velocity等。开发者可以通过使用模板语言和标签库来自定义视图。 3. **控制器(Controller)**:控制器接收用户的请求,解析这些请求,调用模型进行处理,并决定返回...

    自定义struts2标签

    **定义标签接口**:Struts2标签库基于OGNL(Object-Graph Navigation Language)表达式,因此我们需要继承`org.apache.struts2.views.jsp.TagSupport`或`org.apache.struts2.views.jsp.ui.Tag`类来创建自定义标签。...

    Struts2 标签使用简介

    除了预定义的标签外,Struts2还允许开发者自定义标签,这需要创建一个继承自`org.apache.struts2.views.jsp.TagSupport`的Java类,并在JSP页面中使用`&lt;s:tag&gt;`进行调用。 五、标签库的扩展性 Struts2的标签库不仅...

    hibernate3+struts2+spring2+freemarker 主流技术架构 实例

    • 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...

    struts2.0整合freemarker

    2. **配置Struts2**:在struts.xml文件中配置Struts2的核心过滤器,并设置Freemarker为默认的视图解析器。例如: ```xml &lt;filter-name&gt;struts2 &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter....

    Struts2常用标签总结

    \n- **跨技术使用**:Struts2的标签库不依赖特定的表现层技术,可以应用于JSP、Velocity、FreeMarker等多种模板引擎。\n\n2. Struts2标签分类\n\nStruts2的标签分为两类:UI标签和非UI标签。\n\n- **UI标签**:用于...

    struts2标签+校验+SSH

    此外,Struts2支持多种视图技术,如JSP、FreeMarker和Velocity,这使得开发者可以根据项目需求选择最适合的表现层技术,提高了开发效率和代码可维护性。 对于数据校验,Struts2允许对特定方法进行校验,而不是局限...

    Struts2标签库详解

    Struts2允许开发者自定义标签来扩展其功能。这通过创建一个实现ognl表达式解析、标签处理等功能的标签库动态代理类(Tag Library Descriptor,TLD)来实现。 四、Struts2标签库的国际化与主题 Struts2支持多语言...

    自定义分页标签源代码

    这里提到的分页标签可能是基于JSTL (JavaServer Pages Standard Tag Library) 或 Struts1 的自定义标签实现。开发者可以通过在JSP页面中使用这些自定义标签,轻松地集成分页功能。 2. **不操作数据库**: 这意味着...

Global site tag (gtag.js) - Google Analytics