Struts 2将表单提交给一个对象

时间:2012-05-05 19:39:15

标签: struts2 struts2-spring-plugin

我有类似的东西:

 class Model {
    private String field1;
    private String field2;

    //setters
 }

class Action extends ActionSupport {
    private Model model;
    public String execute() {
        //breakpoint
    }
    public void setModel(Model model){
        this.model=model;
    }
}

on jsp:

<s:form id="addCommentForm" method="POST" namespace="%{namespace}" action="addComment">
    <input type="text" name="model.field1"/>
    <input type="text" name="model.field2"/>
</s:form>

当我提交此表单时,不幸的是只设置了Model类中的1个字段。 我调试代码并发现实际的setter是为两个字段(field1和field2)调用的,但是对于Model类的不同实例。

看来,当表单提交时,它会执行后续步骤:

  1. 创建Model类的新实例(instance1),在Action类
  2. 中设置此实例
  3. 将field1设置为instance1
  4. 创建Model类的新实例(instance2),在Action类
  5. 中设置此实例
  6. 将field2设置为instance2
  7. 因此我看到instanse2替换instance1。 我需要在Model类的一个实例中使用field1和field2。 需要修改什么?

    依赖列表:

            <dependency>
                <groupId>com.vercer.engine.persist</groupId>
                <artifactId>twig-persist</artifactId>
                <version>1.0.4</version>
            </dependency>
            <dependency>
                <groupId>com.opensymphony</groupId>
                <artifactId>xwork</artifactId>
                <version>2.1.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.struts.xwork</groupId>
                <artifactId>xwork-core</artifactId>
                <version>2.2.1</version>
            </dependency>
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.19</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>3.1.1.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>opensymphony</groupId>
                <artifactId>sitemesh</artifactId>
                <version>2.4.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-core</artifactId>
                <version>2.1.6</version>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.16</version>
            </dependency>
            <dependency>
                <groupId>jetty</groupId>
                <artifactId>jsp-api</artifactId>
                <version>2.1-6.0.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-spring-plugin</artifactId>
                <version>2.1.6</version>
            </dependency>
            <dependency>
                <groupId>org.apache.struts</groupId>
                <artifactId>struts2-json-plugin</artifactId>
                <version>2.1.8</version>
            </dependency>
    

1 个答案:

答案 0 :(得分:2)

对于复杂类型,您需要getter和setter,因此Struts2可以正确操作对象,否则它将无法获取现有实例,并将被强制创建Model的新实例(new Model()。setWhatever ())而不是看模型已经存在并且正在做(getModel()。setWhatever())。