【问题标题】:POST an array of custom objects to a Struts 2 action将一组自定义对象发布到 Struts 2 动作
【发布时间】:2011-09-12 21:58:57
【问题描述】:

如何将一组自定义对象发布到 Java 中的 Struts 2 操作?

例如,如果我有以下 Java 对象:

public class Person {

    private String name;
    private String lastName;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }   
}

还有以下动作:

public class SavePersons extends ActionSupport {

    private List<Person> persons;

    @Override
    public String execute() throws Exception {
            // Do something
        return SUCCESS;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }

}

我想在 HTML 表单中做这样的事情:

<html>
<body>
<form method="POST" action="http://postHere">
    <input type="text" name="persons[0].name" value="Name1"/>
    <input type="text" name="persons[0].lastName" value="LastName1"/>
    <input type="text" name="persons[1].name" value="Name2"/>
    <input type="text" name="persons[1].lastName" value="LastName2"/>
    <input type="submit" />
</form>
</body>
</html>

有什么建议吗?

【问题讨论】:

  • 四元数已经回答了你的问题。您的问题与Struts2的Tabular inputs有关

标签: java arrays post struts2 forms


【解决方案1】:

你所拥有的看起来不错。如果您发布或获取设置值,这对 struts2 没有影响。

使用相同的 SavePersons 类,除了我添加了一个public List&lt;Person&gt; getPersons() 方法。这是使解决方案发挥作用所必需的。

并且使用基本相同的表单,除了我更喜欢在有意义的地方使用 s2 标签编写表单(让一些人远离表单标签的是默认的 s2 主题,您可以将主题全局设置为简单,标签属性将不起作用,但 UI 标记将像您期望的类似 html 元素的行为一样起作用):

<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html> 
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Person Form</title>
    </head>
    <body>
        <h1>Person Form</h1>
        <s:form action="person-test" method="post">
            <s:textfield name="persons[0].name" label="fName 1"/>
            <s:textfield name="persons[0].lastName"  label="lName 1"/>
            <s:textfield name="persons[1].name" label="fName 2"/>
            <s:textfield name="persons[1].lastName" label="lName 2"/>
            <s:submit/>
        </s:form>
    </body>
</html>

请注意,method="post" 不是必需的,它是默认设置。

这里是用来显示表单数据的页面。

<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html> 
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>List of People</h1>
        <s:iterator value="persons">
            <s:property value="name"/> <s:property value="lastName"/><br/>
        </s:iterator>
    </body>
</html>

而且效果很好。

【讨论】:

  • 感谢您的回答。我的问题是,如果我不声明一个 getter“getPersons”(因为我不想稍后再阅读该列表),它就不起作用,并且人员列表永远不会在 POST 上填充。
  • 可以使用迭代器创建表单吗?
  • @Quaternion:@Mark 认为getPersons getter 是强制性的,这样您的解决方案才能正常工作。事实上,setter 不会设置 people,getter 将用于获取 people 列表,然后开始填充其所有元素。实际上,我昨天花了 4 个多小时(最后一个和我的 4 位同事)试图弄清楚为什么它不起作用,你的回答“getPersons 只是为了阅读......”误导了我们。最后添加这个getter解决了这个问题。
  • @ahmehri 我不知道我在想什么,设置集合时需要 获取器。我会删除我之前的评论,以防误导某人。
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多