之前有2種方案:
第一種是修改struts2 tag的源代碼.
比如http://jolestar.javaeye.com/blog/160360
第二種就是徹底妥協(xié),在action里面把list bean轉(zhuǎn)成數(shù)組,賦給checkboxlist的value屬性.
這兩種solution都不是那么優(yōu)雅,作為一個(gè)有房貸沒希望的IT民工我不禁問自己:
怎么能對自己的要求這么低呢? 怎么能應(yīng)付了事呢?
翻文檔,研究了下ognl的語法,終于讓我找到了一種方便的寫法.
JavaBean
- public class Operate extends BaseBean {
- private long id;
- private String name;
- }
Action中初始化allOpList和myOpList.
- private List<Operate> myOpList;
- private List<Operate> allOpList;
前臺jsp用strtus2標(biāo)簽生成checkboxlist
- <s:checkboxlist name="myOpList.id" list="allOpList" listValue="name" listKey="id"
- value="myOpList.{#this.id}"/>
checkboxlist標(biāo)簽用allOpList的內(nèi)容生成checkbox, 并且用myOpList的值選中默認(rèn).
并且當(dāng)頁面提交的時(shí)候,又能自動把checkbox的選中情況,賦給myOpList.Operate.id屬性.
這樣從后到前到再到后,全都是用list bean去完成,用法統(tǒng)一,不要轉(zhuǎn)換,全部操作的是bean而不是數(shù)組.
精華在于myOpList.{#this.id}這個(gè)ognl表達(dá)式,自動生成[4, 11]這種格式的數(shù)組.
引申一下,ognl的語法強(qiáng)大到可以myOpList.{?#this.enable > 0}來做過濾,看著有點(diǎn)Jquery的味道,非常好用.
有同志會說,這種過濾沒有什么意義,不如在后臺sql里面做.
假設(shè)一個(gè)應(yīng)用場景:
全部用戶信息是放在cache里面的list,根據(jù)前一個(gè)頁面來過濾男女,然后顯示.
這時(shí)候這個(gè)過濾表達(dá)式就發(fā)揮作用了,不用您在后臺一個(gè)一個(gè)過濾重新組裝list了.
userInfoist.{?#this.sex > 0}
簡潔而優(yōu)雅,這下能過自己這關(guān)了.