struts 绑定form数据到actionForm的机制
一般地,在jsp+servlet的开发模式中,在servelet中是通过request.parameter(key)方法来取得从jsp中传入的值。而struts中将以上的处理给封装到了
actionForm中,其实质也是通过将在formbean中已经定义好的属性,将其与在jsp中控件的name属性去一一匹配,将匹配上的属性作为key通过request.parameter设置到formbean中,从而就实现了formbean与jsp 中控件值的绑定(form需使用html:form 标签,其他标签name名称与属性一致即可映射到formbean中,如果使用普通的html标签可以传值到formbean中,却不能从formbean传值给jsp)
当绑定单个控件的值,那种简单数据类型可以通过以上方式简单绑定即可,如果需要绑定一个List而list中又存放的是对象呢
则可参考以下方式实现:
Class actionForm extends ActionForm
{
private String attr1;
private List<ClassA> lstA=new new ArrayListExt(
ClassA.class);
ClassA.class);
//省略get,set方法...
}
Class A
{
private int aid;
}
//需要扩展ArrayList,目的是为了在页面动态添加行时,数组不会越界。原因是这与struts存储表单数据的结构有关,
//struts通过键值对的方式将值存储在map中,如一般的简单数据,属性名attr1,则会map.put(attr1,value)存取,若是复杂一点的数据存储结构,如lstA,则他的存取方式为
//map.put(lstA[0].aid,value),其中lstA[0]中的0为下标,如有多条数据以此类推。
public class ArrayListExt extends ArrayList {
private Class itemClass;
public ArrayListExt(Object obj) {
this.itemClass = obj.getClass();
}
public ArrayListExt(Class clazz){
this.itemClass=clazz;
}
public Object get(int index) {
try {
while (index >= size()) {
add(itemClass.newInstance());
}
} catch (Exception e) {
//e.printStackTrace();
}
return super.get(index);
}
private Class itemClass;
public ArrayListExt(Object obj) {
this.itemClass = obj.getClass();
}
public ArrayListExt(Class clazz){
this.itemClass=clazz;
}
public Object get(int index) {
try {
while (index >= size()) {
add(itemClass.newInstance());
}
} catch (Exception e) {
//e.printStackTrace();
}
return super.get(index);
}
关于jsp的写法,其中indexed="true"一定要加上,该属性表示将使用下标解析,通过name和property标签解析成lstA[index].aid的形式
<logic:iterate id="lstA" property="lstA" name="forbeanName" indexId="ind">
<tr class="travellerInfo1">
<td><input type="text" name="lstA" property="aid" indexed="true"/></td>
</tr>
</logic:iterate>
<tr class="travellerInfo1">
<td><input type="text" name="lstA" property="aid" indexed="true"/></td>
</tr>
</logic:iterate>