我想在一个页面上呈现复杂对象的列表:表格,图像,图表等。每个元素将驻留在它自己的块中(例如<div>
)。有几种类型的这种复杂对象,所以我不想在一个地方实现渲染逻辑,而是以某种方式对其进行模块化(对于每种类型的对象单独的JSP以及单独的代码,为JSP准备数据)。我能做到这一点的最佳方式是什么?
我自己打算使用<s:action>
标签。所以我可以迭代我的列表并根据某些条件调用操作:
<s:iterator value="objectList" var="element">
<s:if test="#element.type == 'TABLE'">
<s:action name="renderTable"><s:param name="elementValue" value="#element.value"/></s:action>
</s:if>
...
</s:iterator>
显然,为了渲染表格或绘图或我需要将数据传递给渲染操作的任何其他元素,您可以看到我正在尝试将entries
传递给我的renderTable
操作。问题就出现了 - Struts将此参数强制转换为字符串数组,并尝试在我的操作中查找setElementValue(String[])
。所以我得到例外:
java.lang.NoSuchMethodException: edu.stackoverflow.RenderTable.setElementValue([Ljava.lang.String;)
我不知道为什么org.apache.struts2.components.ActionComponent
的实现以这种方式处理参数,这是来自类的代码:
for (Iterator i = parameters.entrySet().iterator(); i.hasNext(); ) {
Map.Entry entry = (Map.Entry) i.next();
String key = (String) entry.getKey();
Object val = entry.getValue();
if (val.getClass().isArray() && String.class == val.getClass().getComponentType()) {
params.put(key, (String[])val);
} else {
params.put(key, new String[]{val.toString()});
}
}
所以这种方法变得不可能。
任何替代方案?
答案 0 :(得分:2)
为什么不使用普通的基于JSP的自定义标记?
或者,您可以创建基于模板的组件。
答案 1 :(得分:1)