一个问题引发的思考——跨层调用的坏处

    今天遇到一个问题,花了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的方法。并且,要调用的方法必须经过合格的异常处理。

        如此这般,问题解决。

你可能感兴趣的:(跨层调用的坏处,jsp无错误提示)