我正在使用Struts2框架,我想将一个对象列表从Java传输到JSP并返回到Java。使用<s:iterator>
标记可以正常传输到JSP。转回Java不会,我的列表从未填充。
我已经检查了这些问题:
并遵循他们的建议。
这是我的“item”类(它的属性不仅仅是名称,但我只显示相关的属性):
班级项目:
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对象并将其名称设置为给定值中的任何值。问题不在于缺少no-args构造函数。
我还添加了一个名为ActionName-conversion.properties
的转换文件(其中ActionName
是我的操作类的名称),它与我的ActionName.java
类位于同一文件夹中。
Element_items = Item
CreateIfNull_items = true
可能出现什么问题?
答案 0 :(得分:0)
如果您使用List
或Map
作为项目集合,则可以按索引引用其元素,而不使用ObjectTypeDeterminer
。见
Built in Type Conversion Support
类型转换由XWork实现。
XWork将自动处理最常见的类型转换 您。这包括支持每个字符串转换为字符串 以下内容:
- 字符串
- boolean / Boolean
- char / Character
- int / Integer,float / Float,long / Long,double / Double
- 日期 - 使用与当前请求关联的区域设置的SHORT格式
- 数组 - 假设各个字符串可以转换为单个项目
- 集合 - 如果不能确定对象类型,则假定它是一个String并且创建一个新的ArrayList
请注意,对于数组,类型转换将遵循类型 数组元素并尝试单独转换每个项目。和。一样 任何其他类型转换,如果无法执行转换 标准类型转换错误报告用于指示问题 处理类型转换时发生。
- 枚举
- BigDecimal和BigInteger
如果要使用ObjectTypeDeterminer
使用高级类型转换来确定在填充集合时实例化的对象类型,或者通过OGNL表达式中元素的键属性从集合中检索的对象,则应该见
Collection and Map Support
Collection和Map支持提供智能空值处理和类型 转换为Java集合。
框架支持发现元素的对象类型的方法 在一个集合中。发现是通过
ObjectTypeDeterminer
进行的。一个 框架提供了默认实现。 Javadocs 解释如何发现Map
和Collection
支持DefaultObjectTypeDeterminer
。此
ObjectTypeDeterminer
查看Class-conversion.properties
指示地图中包含哪些对象的条目 集合。对于集合(例如Lists),指定元素 使用模式Element_xxx
,其中xxx
是字段名称 动作或对象中的集合属性。对于地图,这两个关键 并且可以使用模式Key_xxx
和指定值 分别为Element_xxx
。从WebWork 2.1.x开始,仍然支持
Collection_xxx
格式 很荣幸,虽然已弃用,但最终会被删除。此外,您可以创建自己的自定义
ObjectTypeDeterminer
实现ObjectTypeDeterminer
接口。还有一个 使用Java 5泛型的可选ObjectTypeDeterminer
。见 Annotations页面了解更多信息。
您可以使用ActionClass-conversion.properties
并指定类型转换所需的所有属性。如果您没有指定某些属性,则会应用默认值。
在您的情况下,您没有指定关键属性,即KeyProperty_items
,在这种情况下,使用id
的{{1}}属性。如果您没有此类财产,转换可能会失败。
还可以使用注释进行类型转换。见例子
还要注意使用OGNL表达式对字段名称使用正确的语法,该表达式使用对象引用的索引,而不是通过集合索引引用。这种索引完美适用于列表。它也可以使用高级类型转换。
为什么它的工作超出了这个问题的主题。当然,您可以修复您的属性并使用高级类型转换,或删除它并使用索引集合,如列表。