用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());
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; }