在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中实现相同的功能?
答案 0 :(得分: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>
答案 1 :(得分:2)
您应该将表单的字段映射到此操作
<s:textfield name="myForm.values['%{dynamicNames}']"/>
它不清楚dynamicNames
的值是什么,实际上它应该是在迭代地图时推送到值堆栈上的对象的关键,并且一旦运行模型驱动,代码将看起来像< / p>
<s:iterator value="values">
<s:textfield name="myForm.values['%{key}']"/>
</s:iterator>
OGNL将负责映射此类名称,并在您提交表单时在表单和操作中填充文件的值。
此外,如果您需要将用户输入的值放在另一个对象myForm2
上,那么您可以使用文本字段的值属性value="%{value}"
来填充第一个模型中的表单。
请参阅参考指南如何使用model driven界面和model driven interceptor。另外还有一个参考,可以让您了解从converted by type形式到操作对象的对象。