【发布时间】:2014-03-30 19:50:00
【问题描述】:
我正在使用 Struts 2 框架,我想将对象列表从 Java 传输到 JSP 并返回到 Java。使用<s:iterator> 标记传输到JSP 可以正常工作。转移回 Java 没有,我的列表永远不会填充。
我已经检查了这些问题:
- Repopulate ArrayList from JSP with Struts 2
- a list of list value populated in struts2 iterator
- Populate Collection from Struts2 Form Submission
- Populate List<String> in struts2 from form data
并听从了他们的建议。
这是我的“项目”类(它的属性不仅仅是名称,但我只显示相关的):
类项目:
private String name;
public Item(){}
public String getName(){ ... };
public void setName(String newName){ ... };
在我的 JSP 上我有:
<s:iterator value="items" status="key">
<s:hidden name="items[%{#key.index}].name" value="%{name}" />
</s:iterator>
下面是动作类的相关部分:
private List<Item> items = new ArrayList<Item>();
public List<Item> getItems()
{
System.out.println("now getting Items");
if(Items == null)
{
System.out.println("Items is null");
}
else
{
System.out.println("Items is not null. size: " + Items.size());
}
return Items;
}
public void setItems(List<Item> Items)
{
System.out.println("now setting Items");
Items = Items;
}
我 100% 确定它具有所有必要的 getter 和 setter,因为 JSP 已正确填充,当我提交表单时,我实际上可以看到(使用日志语句)我的 getItems() 方法被调用一次我列表中的每个项目(对于表单中的每个输入字段)。奇怪的是,Struts2 为表单中的每个隐藏输入字段获取一次列表,但随后拒绝创建 Item 对象并将其名称设置为给定值。问题不可能是缺少无参数构造函数。
我还添加了一个名为 ActionName-conversion.properties 的转换文件(其中 ActionName 是我的操作类的名称),它与我的 ActionName.java 类位于同一文件夹中。
Element_items = Item
CreateIfNull_items = true
可能出了什么问题?
【问题讨论】:
-
你的代码很好,你也清除了我的第一个想法(
The problem cannot be the lack of a no-args constructor)。剩下什么 ?拦截器堆栈。请出示一下,我敢打赌问题出在啤酒上 -
我使用默认堆栈(具有参数拦截器)。我刚刚测试了是否可以从我的 JSP(而不是 List
- )中填充一个 list
,这很好用。我真的认为struts2试图创建一个新项目有问题(或者不知何故不知道列表是Item类型,因此不知道它必须创建一个项目对象?)。 - )中填充一个 list
-
尝试删除您的 ActionName-conversion.properties(此处不需要),如果它不起作用,请在您的 Action 类中发布 List
- 的声明和初始化。
-
删除属性文件并没有改变任何东西。我在问题中添加了动作类中的相关部分(制作、获取和设置项目列表)。你会看到 get 方法有 system.outs。实际上,我在控制台中打印了 4 次这些打印语句,并且我的项目列表有 4 个值。项目列表不为空。但是列表中元素的数量始终保持为 0。它不是只读列表或类似的东西。
-
我猜
Items总是items,不是吗?
标签: java jsp struts2 type-conversion ognl