解决s:iterator嵌套s:radio的传值问题

时间:2022-09-08 12:12:29

问题描述:

    使用SSH开发留言板的审核功能时,因为要做批量审核,在action中获取了所有未审核的信息,前台需要对应每一个信息生成一个单选框,即通过,删除,不处理.其中遇到了三个问题:
    1.迭代器中的s:radio 的name命名问题,name必要根据索引动态改变,否则迭代器中的单选框都在一个组里面只能选一个.
    2.获取到所有的值如何传回来,网上大多数都是说用js拼接成字符串传入再拆分,或者通过requset来传值拆分.
    3.获取到值之后,处理每个实体对象时报空指针异常.

解决方案:

private ArrayList<Integer>oplist;
private List<MessageBoard>messageList;
messageList为未处理的留言集合.
对于问题二,我们生成一个长度为messageList大小的集合oplist,并置初值为0;
this.oplist = new ArrayList<Integer>();
for(int i=0;i<this.messageList.size();++i)
    oplist.add(0);
对于第一个问题,我们使用ognl表达式动态的对s:radio 的name赋值
<s:radio name="oplist[%{#L.index}]" list="#{'1':'通过','2':'删除','3':'不处理'}" value="3"/>
赋值完成后通过浏览器查看源代码发现name变成了oplist[0],oplist[1]..... 

之后在action中对循环获取messageList中的元素,根据oplist.get(i)的值对实体进行操作就好了.
for(int i=0;i<oplist.size();++i){
    int opint = oplist.get(i);
    if(opint==1){
        MessageBoard mb = this.messageList.get(i);
        mb.setReplyId(1);
        mdao.update(mb);
    }else if(opint==2){
        MessageBoard mb = this.messageList.get(i);
        mdao.delete(mb);
    }
}

至此,传值问题完美解决.
问题三:
但在这里获取mb对象时回报空指针异常,原因为action并不是一个单例模式,而是用一次申请一次,而提交表单之后messageList的值为null,此时对messageList的值进行操作,就会报空指针异常了.
所以,我们在for循环前重新获取一下messageList的值.

this.messageList = mdao.getNotAuditMessage();

最后返回审核页面的时候别忘了重置messageList和oplist的值

this.messageList = mdao.getNotAuditMessage();
oplist.clear();
for(int i=0;i<this.messageList.size();++i)
    oplist.add(0);
return SUCCESS;