struts2无故执行execute()方法

来源:互联网 发布:手写速记知乎 编辑:程序博客网 时间:2024/06/11 13:59

      用struts2+hibernate建网,包含对数据库的增删查改的操作,测试时发现按钮明明指定method为add或edit方法,但“有时”实际执行却是execute方法,后退再点击时大多又正常执行add或edit方法。

 

似乎找到导致这个问题的直接原因:
      当用户编辑完textfield、select等控件后,焦点仍然在最后选择的控件上而不是submit按钮,如果通过回车键直接提交form,则会造成struts2调用execute();如果使用tab或鼠标更改控件焦点到sumbit按钮上,那么再回车或鼠标点击,struts2则会正常调用sumbit中指定的方法。

 

实验证明,使用:
1、<s:submit name="edit" method="edit" value="编辑"/>
对应html:<INPUT id=serviceDLaction_edit value=编辑 type=submit name=method:edit>
2、<s:submit action="customeraction" name="editall" value="编辑" method="editpage"/>
对应html:<INPUT id=_edit value=编辑 type=submit name=action:serviceDLaction!edit>

      以上两个方法都存在此情况……私估计这是struts2的BUG,当页面的焦点不在submit上而回车提交form时,虽然form中的第一个submit为蓝色(获得焦点时的颜色——伪),但焦点不会真正移动到该submit上再提交form,而是直接就提交了,于是struts2将监测不到用户选择的submit中指定的method,所以就只有执行默认调用,即execute()。对于要调用execute()的submit,实际执行方法都是execute(),所以并无影响。

      只有当在struts.xml中指定action的method(通配符实质)时,struts2才会将检测不到调用的方法名时默认调用的execute()改变为默认调用action中指定调用的method。所以此问题的在struts2改正此BUG前,解决办法之一是在struts.xml中指定action的method。

      还望测试指正。

 

—————————————————————————2010.12.20更新线————————————————————————————

      一上班继续搜索解决方法,发现以下两篇博文

      struts里只有一个input的text型元素,回车报错解析

      由IE浏览器引发的Struts2的Bug之submit无法传至服务器

 

      终于得知是ie的问题,在不影响一个form中多个submit的功能正常的情况下,最简单的方法就是添加一个隐藏的输入框。例如:

      <div style="display: none;"><s:textfield name="iebug"/></div>

原创粉丝点击