| |
| Struts 2.0 <s:select> 出現問(wèn)題的解決方法 今天在使用Struts 2.0 <s:select>標簽的時(shí)候碰到了錯誤: 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找了很多方法,都無(wú)法解決,后來(lái)終于發(fā)現了問(wèn)題所在,其實(shí)是小問(wèn)題,在這里總結一下,以便大家以后會(huì )出現同類(lèi)錯誤。 <s:select>是下拉列表的標簽,有很多種用法,例如直接指定一個(gè)列表,為其賦值: <s:select name="university" headerKey="-1" headerValue="請選擇" list="{'華南理工大學(xué)', '華中科技大學(xué)', '福州大學(xué)'}"/> 有時(shí)候,我們需要從數據庫里面取得所謂的“數據字典”,填充到下拉列表中, 先來(lái)看看具體的代碼吧: register.jsp的部分代碼片段: CODE: <form id="form1" action="register.action" method="POST"> <s:select name="university" headerKey="-1" headerValue="請選擇" list="universities" listKey="uniId" listValue="uniName"/> </form> list屬性指定了一個(gè)變量universities,這個(gè)變量是register這個(gè)action的一個(gè)成員屬性,其類(lèi)型是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(); ………… } } 這里省略了很多東西,只是為了說(shuō)明select標簽的用法,uniService.getUniversityList()可以從數據庫中獲取一個(gè)University的列表,這里省略了uniService的聲明和AutoWire。當然,除了用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 這里省略具體細節。 如果我們直接運行register.jsp,將會(huì )得到我們開(kāi)頭所描述的錯誤,其實(shí)原因很簡(jiǎn)單,因為第一次運行這個(gè)頁(yè)面的時(shí)候,Register這個(gè)action根本沒(méi)有被實(shí)例化,因此也就沒(méi)有universities這個(gè)變量。那怎么辦呢?很簡(jiǎn)單,首先,在register.jsp前面加一個(gè)頁(yè)面,例如index.jsp: CODE: <s:url id="regForm" action="register"> <s:param name="type">getForm</s:param> </s:url> <s:a href="%{regForm}">注冊</s:a> 這個(gè)頁(yè)面里面很簡(jiǎn)單,定義了一個(gè)url,這個(gè)url會(huì )提交register這個(gè)action,然后再定義一個(gè)超鏈接指向這個(gè)url。這樣,當用戶(hù)點(diǎn)擊超鏈接的時(shí)候,action就會(huì )被實(shí)例化,universities這個(gè)變量也就可以得到了。type這個(gè)屬性有什么用呢?先來(lái)看看我們需要在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ì )再一次提交(例如注冊),因此必須區分是初始化頁(yè)面,還是要提交頁(yè)面。用一個(gè)屬性來(lái)區別就可以了。當然,我們還需要在register.jsp里面聲明一個(gè)這樣的屬性,否則再一次提交表單的時(shí)候這個(gè)變量就取不到了: CODE: <input type="hidden" name="type" value="submit"/> 最后,運行index.jsp,點(diǎn)擊超鏈接,頁(yè)面就能正常顯示了。 |
聯(lián)系客服