今天遇到一個問題,花了2小時左右,才把問題搞定。通過總結,感受這個問題有普適性,故記錄之。
數據庫
咱們常常在jsp頁面使用struts標籤和ognl表達式。ognl比el強大的地方之一是,它能夠調用對象的方法。處於偷懶的想法,我並無像往常同樣,把查出來的數據列表放在做用域或值棧中,而是直接調用Action中的dao成員變量中的方法——這裏不討論Action中使用dao是否合適,不是要說的重點。
瀏覽器
這是jsp中的代碼:
jsp
<select id="sel1">ide
<s:iterator value="residentDao.getBuild()" >ui
<option value="<s:property value='id'/>"><s:property value="buildname"/> </option>spa
</s:iterator>指針
</select>對象
問題現象:作用域
結果,頁面並無出現我想要的數據。get
通常而言,咱們會經過錯誤提示來定位及判斷錯誤,可是!瀏覽器和控制檯也沒有出現任何錯誤提示信息。
最後,忍着噁心的感受看了很久,才找到問題所在——數據庫配置出了點小錯誤。
數據庫配置沒什麼好說的。最讓我感受不解的是,爲何沒有錯誤提示?
問題緣由:
通常在後臺,咱們會對「residentDao.getBuild()」這類代碼進行trycatch,可在jsp頁面中,大概是從友好界面的角度考慮,ognl彷佛並未有異常處理(比方說:取不到值,也不會報空指針異常)。並且,jsp頁面原本就很差調錯,jsp中調用這類方法壓根就是找死的行爲。
解決辦法:
問題找到了,接下來要想的是:如何杜絕這種特別能噁心人的狀況?
個人解決辦法是:杜絕跨層調用,加上完善的異常處理。
像我此次的例子,jsp頁面中,絕對不該該跨過Action調用dao的方法。而且,要調用的方法必須通過合格的異常處理。
如此這般,問題解決。