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="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”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
标准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