用struts1.x 向后台传值,普通的单个值的向后传,通过html标签传值,对应form的属性值,然后在后台获得form,从而得到界面submit的值。
下面说说用nested标签向后台传对象,以及向后台传送对象的集合list。
往后台传送对象的时候,form不能为动态的form,必须为实例。也就是说这个时候需要自己写一个form。
用这个(nested)标签显示对象的值,或者数据封装成对象传值的时候要注意:nested的顶层为form,然后层层扒皮,不多说都懂得。
下面说说 如何传list对象
其实用nested传list对象,只需要多做一点特殊处理即可,例如from中有如下的变量
private List<State> states = new AutoScaleList<State>(new State());
在定义list的时候不能直接用java.util.ArrayList,需要改写list中的get方法,AutoScaleList为继承ArrayList的子类
public class AutoScaleList<E> extends ArrayList<E>{
private static final long serialVersionUID = -8991377776604456691L;
private Object object;
@SuppressWarnings("unchecked")
public E get(int index){
if(this.size() <= index){
for(int i = this.size();i <= index; i++){
try {
this.add((E)object.getClass().newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return super.get(index);
}
public AutoScaleList(Object sample){
this.object = sample;
}
}
这样框架就可以把界面列表的值封装成对象list放到form对象中,在后台直接get就能用了。
处对象的方法一个好处就是不比用数组,然后在后台循环了,方便。
不用nested 能不能传对象呢?也可以的,需要用到indexed="true"。这个我没有做过实验的。
<logic:iterate id="userAccess" name="frm_AUSRS02" property="listUserAccess">
<html:hidden name="userAccess" property="idModule"indexed="true"/>
<html:radio name="userAccess" property="accessType"indexed="true" value="0"/>
</logic:iterate>
就想上面这样,在循环的里面每个值的显示都必须加上index,这样在生成html的时候,name值是userAccess.idModule这种形式的。和用nested的生成的效果是一样的。
这样实现的时候 注意的是form需要加上一个关于list的方法。
private List<UserAccess> listUserAccess = new ArrayList<UserAccess>();
/**
* special getter
*/
public UserAccess getUserAccess(int index) {
if(index >= listUserAccess.size()) {
for(int i = listUserAccess.size(); i <= index; i++) {
listUserAccess.add(new UserAccess());
}
}
return listUserAccess.get(index);
}
get set 方法
public List<UserAccess> getListUserAccess() {
return listUserAccess;
}
public void setListUserAccess(List<UserAccess> listUserAccess) {
this.listUserAccess = listUserAccess;
}
用数组实现的方法,比较麻烦,也可以实现的。有时间在写