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; } }
相关推荐
Freemarker支持条件判断、循环结构、内置函数,以及自定义标签,增强了模板的灵活性。与JSP相比,Freemarker通常被认为更简洁、易读且更易于维护。 将这三个框架结合使用,可以构建出高效、灵活的Java Web应用。...
### Struts2自定义标签详解 #### 一、引言 在Web开发中,Struts2框架因其灵活性和强大的功能而被广泛采用。其中,自定义标签是提高代码复用性和增强页面展示效果的重要手段。本文将深入探讨如何在Struts2中创建...
- Struts2允许自定义拦截器和结果类型,可以进一步定制Freemarker的渲染逻辑。此外,还可以使用Struts2的国际化和主题特性来实现多语言和不同样式表的支持。 总结来说,Struts2与Freemarker的配置主要是围绕工程的...
一个用FTL定义的非常通用数据分页指令,有源码,有使用示例。使用效果图可以参看本人博客中的相关文章:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx
本篇文章将对Freemarker自定义标签进行深入的总结。 1. **自定义标签基础** 自定义标签在Freemarker中被称为`Custom Tags`,它们通过`<@...>`语法来调用。这些标签通常是由Java代码实现的,它们可以处理复杂的逻辑...
5. **自定义标签库**:Struts2支持自定义标签,结合Freemarker的模板,可以创建出易于理解和维护的视图层代码。 6. **错误和异常处理**:Struts2提供了一套完善的异常处理机制,可以在发生错误时跳转到特定的错误...
5. **配置TLD**: 在`struts.xml`或单独的TLD文件中声明你的自定义标签,这样Struts2就知道如何解析和处理它们。 6. **在模板中使用标签**: 最后,在你的FreeMarker模板文件中,你可以像使用其他内置标签一样使用你的...
众所周知,struts2宣称freemarker模板中不再支持自定义标签,但如果工程UI仅用freemarker模板可以通过扩展struts标签简单实现,不是采用官方不推荐的配置JspSupportServlet实现的!内付详细说明及范例,此方法仅为团队...
在Struts2中,结果类型(Result Type)是动作执行后处理结果的关键部分,它决定了如何将控制权转移给下一个资源,如JSP、FreeMarker模板或者重定向到其他URL。自定义结果类型允许开发者根据项目需求定制化结果处理...
3. **结果拦截器**:Struts2允许使用拦截器来处理Action的执行前后,可以自定义拦截器来实现数据预处理或后处理,以适应FreeMarker模板的需求。 4. **动态方法调用**:FreeMarker支持Struts2的动态方法调用,这意味...
通过将Struts2的模型数据传递给FreeMarker模板,前端开发人员可以使用FreeMarker提供的丰富的模板标签和函数来渲染页面。 #### 配置Struts2与FreeMarker 在Struts2中使用FreeMarker之前,首先需要进行相应的配置。...
Struts 2支持多种视图技术,如JSP、FreeMarker、Velocity等。开发者可以通过使用模板语言和标签库来自定义视图。 3. **控制器(Controller)**:控制器接收用户的请求,解析这些请求,调用模型进行处理,并决定返回...
**定义标签接口**:Struts2标签库基于OGNL(Object-Graph Navigation Language)表达式,因此我们需要继承`org.apache.struts2.views.jsp.TagSupport`或`org.apache.struts2.views.jsp.ui.Tag`类来创建自定义标签。...
除了预定义的标签外,Struts2还允许开发者自定义标签,这需要创建一个继承自`org.apache.struts2.views.jsp.TagSupport`的Java类,并在JSP页面中使用`<s:tag>`进行调用。 五、标签库的扩展性 Struts2的标签库不仅...
• 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...
2. **配置Struts2**:在struts.xml文件中配置Struts2的核心过滤器,并设置Freemarker为默认的视图解析器。例如: ```xml <filter-name>struts2 <filter-class>org.apache.struts2.dispatcher.ng.filter....
\n- **跨技术使用**:Struts2的标签库不依赖特定的表现层技术,可以应用于JSP、Velocity、FreeMarker等多种模板引擎。\n\n2. Struts2标签分类\n\nStruts2的标签分为两类:UI标签和非UI标签。\n\n- **UI标签**:用于...
此外,Struts2支持多种视图技术,如JSP、FreeMarker和Velocity,这使得开发者可以根据项目需求选择最适合的表现层技术,提高了开发效率和代码可维护性。 对于数据校验,Struts2允许对特定方法进行校验,而不是局限...
Struts2允许开发者自定义标签来扩展其功能。这通过创建一个实现ognl表达式解析、标签处理等功能的标签库动态代理类(Tag Library Descriptor,TLD)来实现。 四、Struts2标签库的国际化与主题 Struts2支持多语言...
这里提到的分页标签可能是基于JSTL (JavaServer Pages Standard Tag Library) 或 Struts1 的自定义标签实现。开发者可以通过在JSP页面中使用这些自定义标签,轻松地集成分页功能。 2. **不操作数据库**: 这意味着...