2013-07-17 2 views
4

В Struts 1 я использовал map-backed action form для получения значений динамических полей.Альтернативный вариант Actionform в Struts 2

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?

+0

Что мешает вам вернуть эту форму специализирующуюся на 'интерфейс ModelDriven'? –

+0

Эта форма не заполняется в Struts 2, я всегда получаю пустую форму. – john

+0

Показать JSP и действия. –

ответ

2

Вы должны отобразить поля формы к действию, как этот

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

Это не ясно, какое значение для dynamicNames, на самом деле это должно быть ключом для объекта толкаются на значение стек в то время как итерация карты и как только вы используете модель управляемым код будет выглядеть

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

OGNL будет заботиться о отображении таких имен и заполнение значений fileds в форме и в действии, когда вы отправляете форму.

Кроме того, если вам нужно поместить значения, введенные пользователем другому объекту, скажите myForm2, то вы можете использовать атрибут value value="%{value}" текстового поля для заполнения формы из первой модели.

См. Справочное руководство по использованию интерфейса model driven и model driven interceptor. Также есть ссылка, чтобы узнать, как объекты из формы converted by type относятся к объектам действия.

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> 
+0

Это точный дубликат принятого ответа. –

+0

Нет, это не так. И у него больше оборотов. –

Смежные вопросы