在JSP中将列表重新填充到Struts 2中的操作

时间:2014-02-27 11:46:27

标签: java jsp struts2 type-conversion ognl

我正在使用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

可能出现什么问题?

1 个答案:

答案 0 :(得分:0)

如果您使用ListMap作为项目集合,则可以按索引引用其元素,而不使用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   解释如何发现MapCollection支持   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表达式对字段名称使用正确的语法,该表达式使用对象引用的索引,而不是通过集合索引引用。这种索引完美适用于列表。它也可以使用高级类型转换。

为什么它的工作超出了这个问题的主题。当然,您可以修复您的属性并使用高级类型转换,或删除它并使用索引集合,如列表。