Struts2+;Freemarker+;DisplayTag:如何使其工作

Struts2+;Freemarker+;DisplayTag:如何使其工作,struts2,freemarker,displaytag,Struts2,Freemarker,Displaytag,我目前正在将我们的应用程序从Webwork升级到Struts2。今天我遇到了一个奇怪的错误:displayTag在升级后停止工作 这是从我的FTL文件中截取的: <#assign display=JspTaglibs["http://displaytag.sf.net"]> <@s.set name="entries" value="historyEntries" scope="page"/> <@display.table class="data" name="pageS

我目前正在将我们的应用程序从Webwork升级到Struts2。今天我遇到了一个奇怪的错误:displayTag在升级后停止工作

这是从我的FTL文件中截取的:

<#assign display=JspTaglibs["http://displaytag.sf.net"]> <@s.set name="entries" value="historyEntries" scope="page"/> <@display.table class="data" name="pageScope.entries" sort="list" pagesize=30 id="entry" defaultsort=5 defaultorder="descending"> <@display.column property="folderName" title="Folder" sortable=true/> </@display.table> 我得到的错误是:

freemarker.template.TemplateModelException: javax.servlet.jsp.JspException: Exception: [.LookupUtil] Error looking up property "folderName" in object type "freemarker.template.SimpleSequence". Cause: Unknown property 'folderName' freemarker.template.TemplateModelException: javax.servlet.jsp.JspException:异常: [.LookupUtil]查找属性“folderName”时出错 在对象类型“freemarker.template.SimpleSequence”中。 原因:未知属性“folderName”
标准struts标记工作正常,我在配置中添加了
JspSupportServlet
。我找到了解决这个问题的方法(不确定这是唯一的方法还是最好的方法,但对我来说是有效的)

问题的根源在于
freemarker.template.SimpleSequence
没有现成的实现任何标准集合API,它不是集合、可枚举等

为了解决这个问题,我创建了自定义
FreemarkerManager
,并提供了自定义
BeansWrapper

@Override protected BeansWrapper getObjectWrapper() { BeansWrapper wrapper = super.getObjectWrapper(); class CustomBeansWrapper extends BeansWrapper { private BeansWrapper internalWrapper; public Xp2BeansWrapper(BeansWrapper wrapper) { this.internalWrapper = wrapper; } //delegate methods public TemplateModel wrap(Object object) throws TemplateModelException { TemplateModel model = internalWrapper.wrap(object); if (model instanceof SimpleSequence) { class SimpleSequenceWithIterator extends SimpleSequence { private SimpleSequence internalSequence; public SimpleSequenceWithIterator(SimpleSequence sequence) { this.internalSequence = sequence; } //delegate methods //IteratorUtils from Apache Commons is used internally //by DisplayTag library, it can use public iterator() method public Iterator iterator() throws TemplateModelException { return toList().iterator(); } } return new SimpleSequenceWithIterator((SimpleSequence) model); } return model; } } return new CustomBeansWrapper(wrapper); }
您还可以证明部署是否将所有依赖项复制到WEB-INF/lib。TaglibFactory搜索/META-INF/jar中的每个TLD


看看

设置参数object_wrapper的值可以设置为freemarker.ext.beans.BeansWrapper,以确保不使用简单包装
struts.freemarker.manager.classname=xyz.CustomFreemarkerManager