1. 程式人生 > >解決s:iterator巢狀s:radio的傳值問題

解決s:iterator巢狀s:radio的傳值問題

問題描述:

    使用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;