4

在 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 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 中实现相同的功能?

4

2 回答 2

3

您可以将您的地图直接放到操作类中,并在 JSP 中使用 Struts2 标记来提交/获取值。

行动

public class SaveAction extends ActionSupport {
    private Map<String, Object> map; 

    public String execute(){
      // do something with map
      return SUCCESS;
    }

    // getter/setter for map
}

JSP

<s:form action="saveAction">
  <s:textfield name="map['somekey']" />
  <s:submit />
</s:form>
于 2013-07-17T12:30:23.277 回答
2

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

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

不清楚值是什么dynamicNames,实际上它应该是在迭代地图时推送到值堆栈上的对象的键,一旦你运行模型驱动,代码就会看起来像

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

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

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

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

于 2013-07-17T12:18:10.927 回答