【问题标题】:Map-backed Actionform alternative in Struts 2Struts 2 中的 Map-backed Actionform 替代方案
【发布时间】:2013-07-17 11:20:34
【问题描述】:

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

【问题讨论】:

  • 是什么阻止您将此表单专门返回到ModelDriven 接口?
  • 这个表单没有在 Struts 2 中填充,我总是得到空表单。
  • 显示您的 JSP 和操作。

标签: jsp struts2 ognl


【解决方案1】:

您可以将您的地图直接放到动作类中,并在 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>

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    请参阅参考指南如何使用model driven 接口和model driven interceptor。还有一个参考可以让您了解从converted by type 形式的对象到操作对象的方式。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多