公司官网后台中有一个功能点:单击单选按钮,提交form表单,查看某条信息的明细资料。在Chrome,FF浏览器下都运行正常,但是在IE8下,运行报错,跟踪后台日志,发送提示如下大概内容:
No result defined for action and result input……
接下来,就开始一系列的问题排查:
1、可以肯定,不是服务端java代码的问题,因为chrome,FF可以正常运行。
2、也不是stuts-xxx.xml配置文件的问题,理由同上。
3、也非javascript脚本的问题,因为,提交该表单没有什么多余的动作,无非就是一句submit()
4、那问题多半是在html代码了。这个报错问题多半是因为表单数据,比如数据类型不一致,被struts默认的校验拦截器拦住,并返回值为“input"的result等。
但是日志内容不够明确,没法定位到具体错误信息。那么可以在struts的xml配置文件中,加入
<result name="input">your_page.jsp</result>
并在本jsp页面中,加入如下代码:
<div style=”color:#F00;”>
<s:fielderror />
</div>
注:你的jsp页面中,可能有一些其它struts标签,导致报错。所以建议是新建一个jsp页面,然后,复制以上代码。
通过以上方法,定位到了具体出错的表单元素select。
那么,到底该select表单元素提交到后台后,不同的浏览器,其值又有何差异呢?只有找到答案,才能最终修改此bug.
接下来,通过在action的prepare()方法里设置断点(如果该action方法没有实现prepabe接口,那就无法直接这样调试。如果有实现该接口,而没有prepare方法,可以自己编写一下prepare方法),并查看提交的表单数据,发现下面的代码段,导致在不同的浏览器下,表单数据有差异:
<form>
……
<select name="busiType">
<option value>全部</option>
</select>
……
</form>
在IE下提交的表单,busiType的value的值是"全部";
而在Chrome,FF下,busiType的value的值是“”。
而后台定义busiType的类型是Integer,所以在IE浏览器下,value="全部"显然会被struts的校验拦截器拦住
(在此,也不得不感慨struts框架的成熟)
解决方法,将
<option value>全部</option>
改成
<option value="">全部</option>
从以上问题,也提醒了自己,写html代码应该尽可能规范,以免导致在不同浏览器上的差异。而具体的html代码规范,对于本人,有待再学习整理!