在Struts 1中,我使用 map-backed action form来获取动态字段值. public MyForm extends ActionForm { private final Map values = new HashMap(); public void setValue(String key, Object value) { values.put(key, value); } public Object g
          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中实现相同的功能?
您应该将表单的字段映射到这样的操作<s:textfield name="myForm.values['%{dynamicNames}']"/> 
 它不清楚dynamicNames的值是什么,实际上它应该是迭代map时在值栈上推送的对象的关键,一旦你运行模型驱动,代码看起来就像
<s:iterator value="values">
  <s:textfield name="myForm.values['%{key}']"/>
</s:iterator> 
 当您提交表单时,OGNL将负责映射此类名称并在表单和操作中填充文件的值.
此外,如果您需要将用户输入的值放在另一个对象上,例如myForm2,那么您可以使用文本字段的value attribute value =“%{value}”来填充第一个模型中的表单.
请参阅参考指南如何使用model driven接口和model driven interceptor.此外,还有一个参考,可以让您了解从converted by type表单到操作对象的对象.
