解決s:iterator巢狀s:radio的傳值問題
阿新 • • 發佈:2019-01-09
問題描述:
使用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;