小编典典

Struts 2中支持地图的Actionform替代方案

jsp

在Struts
1中,我使用了支持地图的操作表单来获取动态字段值。

public MyForm extends ActionForm {
    private final Map values = new HashMap();
    public void setValue(String key, Object value) {
       values.put(key, value);
    }
    public Object getValue(String key) {
      return values.get(key);
    }
}

以下是我使用的代码。

JSP

<form action="/SaveAction.do">
<input type="text" name="value(dynamicNames)" value="some value">
</form>

行动

public class SaveAction extends ActionSupport implements ModelDriven<MyForm> {
    private MyForm myForm = new MyForm(); 
    @Override
    public MyForm getModel() {
            return myForm;
    }
    public void setMyForm(MyForm myForm){
            this.myForm = myForm;
    }
    public MyForm getMyForm(){
            return myForm;
    }
    public String execute(){
            MyForm formData = getMyForm();//Here I am getting empty object.
            return "SUCCESS";
    }
}

形成

public MyForm {
    private final Map values = new HashMap();
    public void setValue(String key, Object value) {
       values.put(key, value);
    }
    public Object getValue(String key) {
      return values.get(key);
    }
}

如何在Struts 2中实现相同的功能?


阅读 262

收藏
2020-06-08

共1个答案

小编典典

您应该将表单的字段映射到这样的动作

<s:textfield name="myForm.values['%{dynamicNames}']"/>

目前尚不清楚值是什么dynamicNames,实际上它应该是在迭代映射时将对象推入值堆栈的键,并且在运行模型驱动后,代码将看起来像

<s:iterator value="values">
  <s:textfield name="myForm.values['%{key}']"/>
</s:iterator>

当您提交表单时,OGNL将负责此类名称的映射并在表单和操作中填充字段的值。

另外,如果您需要将用户输入的值放置到另一个对象中,myForm2则可以使用value="%{value}"文本字段的value属性从第一个模型填充表单。

请参阅参考指南,了解如何使用模型驱动的接口和模型驱动的拦截器。还有一个参考,可让您了解表单中的对象如何按类型转换为操作对象。

2020-06-08