|
Struts 2.0 <s:select> 出現(xiàn)問題的解決方法 今天在使用Struts 2.0 <s:select>標(biāo)簽的時(shí)候碰到了錯(cuò)誤: tag 'select', field 'list', name 'university': The requested list key 'universities' could not be resolved as a collection/array/map/enumeration/iterator type. google,baidu找了很多方法,都無法解決,后來終于發(fā)現(xiàn)了問題所在,其實(shí)是小問題,在這里總結(jié)一下,以便大家以后會(huì)出現(xiàn)同類錯(cuò)誤。 <s:select>是下拉列表的標(biāo)簽,有很多種用法,例如直接指定一個(gè)列表,為其賦值: <s:select name="university" headerKey="-1" headerValue="請(qǐng)選擇" list="{'華南理工大學(xué)', '華中科技大學(xué)', '福州大學(xué)'}"/> 有時(shí)候,我們需要從數(shù)據(jù)庫里面取得所謂的“數(shù)據(jù)字典”,填充到下拉列表中, 先來看看具體的代碼吧: register.jsp的部分代碼片段: CODE: <form id="form1" action="register.action" method="POST"> <s:select name="university" headerKey="-1" headerValue="請(qǐng)選擇" list="universities" listKey="uniId" listValue="uniName"/> </form> list屬性指定了一個(gè)變量universities,這個(gè)變量是register這個(gè)action的一個(gè)成員屬性,其類型是List<University>: CODE: ………… public class Register extends ActionSupport { private List<University> universities; public List<University> getUniversities() { return universities; } public void setUniversity(String university) { this.university = university; } @Override public String execute() throws Exception { universities = uniService.getUniversityList(); ………… } } 這里省略了很多東西,只是為了說明select標(biāo)簽的用法,uniService.getUniversityList()可以從數(shù)據(jù)庫中獲取一個(gè)University的列表,這里省略了uniService的聲明和AutoWire。當(dāng)然,除了用List以外,還可以用Map。 struts.xml和Spring的配置文件把register這個(gè)action映射到Register.java。具體如何整合Struts 2.0,Spring和Hibernate,網(wǎng)上很多教程,也可以參考Netbeans下的: http://developers.sun.com.cn/blog/functionalca/category/JavaEE 這里省略具體細(xì)節(jié)。 如果我們直接運(yùn)行register.jsp,將會(huì)得到我們開頭所描述的錯(cuò)誤,其實(shí)原因很簡單,因?yàn)榈谝淮芜\(yùn)行這個(gè)頁面的時(shí)候,Register這個(gè)action根本沒有被實(shí)例化,因此也就沒有universities這個(gè)變量。那怎么辦呢?很簡單,首先,在register.jsp前面加一個(gè)頁面,例如index.jsp: CODE: <s:url id="regForm" action="register"> <s:param name="type">getForm</s:param> </s:url> <s:a href="%{regForm}">注冊(cè)</s:a> 這個(gè)頁面里面很簡單,定義了一個(gè)url,這個(gè)url會(huì)提交register這個(gè)action,然后再定義一個(gè)超鏈接指向這個(gè)url。這樣,當(dāng)用戶點(diǎn)擊超鏈接的時(shí)候,action就會(huì)被實(shí)例化,universities這個(gè)變量也就可以得到了。type這個(gè)屬性有什么用呢?先來看看我們需要在action的execute方法做一些改動(dòng): CODE: public String execute() throws Exception { if (type != null && type.equals("getForm")) { universities = uniService.getUniversityList(); return INPUT; } if (type != null && type.equals("submit")) { ………… } } 由于我們的表單可能會(huì)再一次提交(例如注冊(cè)),因此必須區(qū)分是初始化頁面,還是要提交頁面。用一個(gè)屬性來區(qū)別就可以了。當(dāng)然,我們還需要在register.jsp里面聲明一個(gè)這樣的屬性,否則再一次提交表單的時(shí)候這個(gè)變量就取不到了: CODE: <input type="hidden" name="type" value="submit"/> 最后,運(yùn)行index.jsp,點(diǎn)擊超鏈接,頁面就能正常顯示了。 |
聯(lián)系客服