今天遇到一个问题,花了2小时左右,才把问题搞定。经过总结,感觉这个问题有普适性,故记录之。
我们经常在jsp页面使用struts标签和ognl表达式。ognl比el强大的地方之一是,它可以调用对象的方法。处于偷懒的想法,我并没有像往常一样,把查出来的数据列表放在作用域或值栈中,而是直接调用Action中的dao成员变量中的方法——这里不讨论Action中使用dao是否合适,不是要说的重点。
这是jsp中的代码:
<select id="sel1">
<s:iterator value="residentDao.getBuild()" >
<option value="<s:property value='id'/>"><s:property value="buildname"/> </option>
</s:iterator>
</select>
问题现象:
结果,页面并没有出现我想要的数据。
一般而言,我们会通过错误提示来定位及判断错误,但是!浏览器和控制台也没有出现任何错误提示信息。
最后,忍着恶心的感觉看了好久,才找到问题所在——数据库配置出了点小错误。
数据库配置没什么好说的。最让我感觉不解的是,为什么没有错误提示?
问题原因:
一般在后台,我们会对“residentDao.getBuild()”这类代码进行trycatch,可在jsp页面中,大概是从友好界面的角度考虑,ognl似乎并未有异常处理(比方说:取不到值,也不会报空指针异常)。而且,jsp页面本来就不好调错,jsp中调用这类方法压根就是找死的行为。
解决办法:
问题找到了,接下来要想的是:如何杜绝这种特别能恶心人的情况?
我的解决办法是:杜绝跨层调用,加上完善的异常处理。
像我这次的例子,jsp页面中,绝对不应该跨过Action调用dao的方法。并且,要调用的方法必须经过合格的异常处理。
如此这般,问题解决。