在 freemarker 模板中处理 struts2 标签

Posted

技术标签:

【中文标题】在 freemarker 模板中处理 struts2 标签【英文标题】:Processing struts2 tags in freemarker templates 【发布时间】:2013-04-11 08:26:37 【问题描述】:

我需要在服务器端处理 freemarker ftl 文件并将 html 返回给客户端。我想知道是否可以使用 template.process() 处理包含 struts 标签的 freemaker 模板。

动作类代码:

// Configuration created from struts2 freemarkermanager
FreemarkerManager freeMarkerManager = new FreemarkerManager();
Configuration config = freeMarkerManager.getConfiguration(context);

//Configuration without any specific settings.
Configuration config = new Configuration();
//Tried both nothing works.

Template template = config.getTemplate("TEMPLATE PATH");

Map<String, Object> inputMap = new HashMap<String, Object>();
inputMap.put("document", document);

StringWriter output = new StringWriter();
template.process(inputMap, output);

Freemarker 模板

<#assign s=JspTaglibs["/struts-tags"]>
    <table>
        <tr>
           <th><@s.text name="Document Name"/></th>
           <th><@s.text name="Description"/></th>
        </tr>
        <@s.iterator value="inspiration" status="status">
    <tr>
    <td class="nowrap"><@s.property value="properties.DOCUMENT_NAME"/></td>
    <td class="nowrap"><@s.property value="properties.DESCRIPTION"/></td>
    </tr>
        </@s.iterator>
    </table>

我还在 web-inf 文件夹下添加了 struts-tags.tld

例外

freemarker.core.InvalidReferenceException:表达式 JspTaglibs 在第 1 行未定义,

如果我删除

freemarker.core.InvalidReferenceException:表达式 s 在第 7 行未定义

【问题讨论】:

显然是可能,因为 FreeMarker 结果做到了。 JSP支持需要更多配置;查看源代码或 FM 文档。 有没有自定义FreeMarkerResult的例子。 为什么需要自定义 FreeMarker 结果?你没有使用结果。如果您将 FM 模板的结果作为操作的一部分返回,但不使用 FM 结果,我不明白您要做什么。 因此我没有返回 FM 模板。我想在 struts 动作类中处理 FM 并从中获取 HTML。 请自行回答这个问题,以便其他人受益。巧合的是,它提高了 struts2 标签的回答率;) 【参考方案1】:

定义一个自定义的变换方法,如下:

公共静态无效进程( ServletContext 上下文,字符串模板, Map values, Writer writer) 抛出 IOException, 模板异常 配置cfg =新配置(); cfg.setDirectoryForTemplateLoading(新 File(context.getRealPath("/templates"))); cfg.setObjectWrapper(new DefaultObjectWrapper()); BeansWrapper 包装器 = BeansWrapper.getDefaultInstance(); TemplateHashModel staticModels = wrapper.getStaticModels(); 模板 temp = cfg.getTemplate(template); temp.process(值,作家); writer.flush();

参考文献

FMPP Settings: Object Wrapping

Freemarker Source: BeansWrapperSingletonsTest.java

【讨论】:

以上是关于在 freemarker 模板中处理 struts2 标签的主要内容,如果未能解决你的问题,请参考以下文章

FreeMarker 模板错误!在struts2中

Struts2 freemarker 配置

struts 项目中的瓷砖 - 比 freemarker 更好?

模板引擎:Velocity&FreeMarker(转)

使用 Struts+Freemarker 更改表单的输出

struts 结果类型