当前位置: 首页 > 知识库问答 >
问题:

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

岑俊明
2023-03-14

我正在使用Struts 2框架,我想将对象列表从Java传输到JSP,然后再传输回Java。转移到JSP工作正常与

我已经检查了这些问题:

  • 使用Struts 2从JSP重新填充ArrayList
  • 在struts2迭代器中填充的列表值列表
  • 从Struts2表单提交填充集合
  • 填充列表

并遵循了他们的建议。

这是我的“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>

以下是action类的相关部分:

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转换的转换文件。属性(其中ActionName是我的操作类的名称),它与我的ActionName位于同一文件夹中。java类。

Element_items = Item
CreateIfNull_items = true

可能有什么问题?


共有1个答案

乜钱明
2023-03-14

如果使用列表映射作为项目集合,则可以按索引引用其元素,而无需使用对象类型确定器。看见

内置类型转换支持

类型转换由XWork实现。

XWork将自动为您处理最常见的类型转换。这包括对以下每个字符串的转换和转换的支持:

  • 字符串
  • 布尔值/布尔值
  • 字符
  • int/整数,浮点/浮点,长/长,双/双
  • 日期-使用与当前请求关联的区域设置的SHORT格式
  • 数组-假设单个字符串可以转换为单个项
  • 集合-如果不能确定对象类型,则假定它是一个String,并创建一个新的ArrayList

请注意,对于数组,类型转换将遵循数组元素的类型,并尝试单独转换每个项。与任何其他类型转换一样,如果不能执行转换,则使用标准类型转换错误报告来指示在处理类型转换时发生的问题。

  • 枚举
  • 大十进制和大整数

如果您想使用高级类型转换(使用ObjectTypeDetminer)来确定在填充集合时实例化的对象类型,或者通过OGNL表达式中元素的键属性从集合中检索的对象,您应该会看到

收集和地图支持

集合和映射支持为Java集合提供智能的空处理和类型转换。

该框架支持发现集合中元素的对象类型的方法。通过objecttypedeterminator进行发现。框架提供了一个默认实现。Javadocs解释了如何在defaultobjecttypedeterminator中发现MapCollection支持。

这个ObjectTypeDecminer查看用于指示映射和集合中包含哪些对象的条目的Class-conversion.properties。对于集合,如列表,使用模式Element_xxx指定元素,其中xxx是操作或对象中集合属性的字段名。对于Maps,键和值可以分别通过使用模式Key_xxxElement_xxx来指定。

来自WebWork2.1。x、 集合\u xxx格式仍然受到支持和尊重,尽管它已被弃用,最终将被删除。

此外,通过实现objecttypedeterminator接口,您可以创建自己的自定义objecttypedeterminator。还有一个可选的objecttypedeterminator,它利用Java5泛型。有关更多信息,请参见“注释”页面。

您可以使用ActionClass转换。属性,并指定类型转换所需的所有属性。如果未指定某些属性,将应用默认值。

在您的情况下,您没有指定键属性,即KeyProperty\u items,在这种情况下,使用项的id属性。如果您没有这样的属性,转换可能会失败。

还可以使用注释进行类型转换。参见示例

  • 从列表中检索值的执行()方法
  • 将值从jsp传递到Action forjava.util.Set
  • 如何在我的操作中从JSP获得更新的列表值
  • 如何使用ModelDriven将值插入Set Collection

还要注意使用OGNL表达式对字段名使用正确的语法,OGNL表达式使用对象引用索引,而不是集合索引引用。这种索引非常适用于列表。它还可以使用高级类型转换。

为什么它起作用不在这个问题的主题之内。当然,你可以修复你的属性并使用高级类型转换,或者删除它并像列表一样使用索引集合。

 类似资料:
  • 我正在检索数据库值并将其放入数组列表(al)。该数组列表以表的形式显示在JSP页面中。我想修改JSP页面中的值,并使用Struts2更新数据库中的新值。我该怎么做? 主要行动类 这是POJO班 这是显示数组列表的JSP页面

  • 如何在Android中重新填充ListView 那是我的样本代码。我想重新填充的listview上的公共无效onTextChanged(CharSequence s, int start, int int count)function.ononTextChanged函数,我想填补listview与一个新的字符串数组。

  • 问题内容: 我正在尝试从表单填充bean列表: 因此,在我的Struts2表单中,填充Foo的最佳方法是什么?凭直觉,我想做: 但这不起作用,并且会导致碰撞。我敢肯定答案很简单,而且我忽略了它。 问题答案: 如果我正确理解,您只是想为每个隐藏字段使用不同的名称? 这应该给你相当于 如果您有适当的getter / setter,则应在提交表单时设置所有值。

  • 我有这个jsp代码。 UserList由数据类型为“Car”的名为“car”的属性组成 用户的Pojo类: 我使用的是Spring MVC框架。在页面加载时,我的应用程序应该显示一个包含用户列表的表格。在controller中,我查询用户列表,并将其添加到ModelAndView对象中 控制器代码: 当我尝试不使用car(tabledata标记)时,JSP正在毫无例外地运行,并在表中显示用户列表。

  • 2. 另外,我还面临一个问题,当我在Websphere application server上部署应用程序并以ServerName/ProjectName访问链接时,它会给出一个错误,说明 因此我被迫以ServerName/ProjectName/index.jsp的身份访问应用程序--它运行良好!我不能理解这个问题,因为它不显示在我的本地机器上,只有当我部署它在服务器上。请在我的web.xml下

  • 问题内容: 当我尝试将Servlet中的列表值设置为会话变量并像JSP一样访问它时, 做得到 JSP 我在JSP中遇到错误,因为“列表无法解析为类型” 那我该怎么做呢?我想将列表从Servlet传递到JSP并填充一个下拉列表。 问题答案: 您要导入列表和演员表吗?