今天遇到一个问题,花了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的方法。而且,要调用的方法必须通过合格的异常处理。
如此这般,问题解决。