struts2无故执行execute()方法

cwjbeyond 2010-12-17 03:02:06
用struts2+hibernate建网,包含对数据库的增删查改的操作,测试时发现按钮明明指定method为add或edit方法,但“有时”实际执行却是execute方法,后退再点击时大多又正常执行add或edit方法。
暂时通过在struts2中设置不同的action name执行同一action.java不同的方法来解决。
请问原因和其他解决方法?
PS:新人没多少分。
...全文
385 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
steven_huowei 2010-12-17
  • 打赏
  • 举报
回复
大哥,如果没有在action中指定方法,那么默认值执行的方法就是execute()。祝你好运。
cwjbeyond 2010-12-17
  • 打赏
  • 举报
回复
似乎找到导致这个问题的直接原因:
当用户编辑完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,只有在struts.xml中指定action的method(通配符实质)时,struts2才会将检测不到调用的方法名时默认调用的execute()改变为默认调用action中指定调用的method。
还望测试指正。

9L:
<INPUT id=serviceDLaction_edit value=编辑 type=submit name=method:edit>
<!--
<input type="submit" id="serviceDLaction_edit" name="method:editpage" value="编辑"/>
-->
<INPUT id=serviceDLaction_delete onclick="return confirm('删除后将无法恢复,是否继续?')" value=删除 type=submit name=method:delete></TD>
wzchong007 2010-12-17
  • 打赏
  • 举报
回复
你在页面上查看一下源码,看你的<s:submit标签在页面生成对应的HTML标签是什么样的。
cwjbeyond 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yingying0406 的回复:]
<action name="serviceDLaction"
class="com.ykse.tms.autoupgrade.action.ServiceDLAction" method={1}>
[/Quote]
通配符的方法漏了*号啦--
7L
我用的是submit不是a。submit的话应该是这样
<s:submit action="customeraction" name="editall" value="编辑" method="editpage"/>
<s:submit action="downloadaction" name="download" value="下载" ></s:submit>
先试试。
gongyi0929 2010-12-17
  • 打赏
  • 举报
回复
感觉最好还是在路径里就写名你要执行的方法,直接用serviceDLaction!edit.action
cwjbeyond 2010-12-17
  • 打赏
  • 举报
回复
wzchong007
请看jsp:<s:submit name="edit" method="edit" value="编辑"/>
已经在submit中指定调用的方法,遇到的问题是有时会调用submit对应的方法,有时调用execute= =
yingying0406 2010-12-17
  • 打赏
  • 举报
回复
<action name="serviceDLaction"
class="com.ykse.tms.autoupgrade.action.ServiceDLAction" method={1}>
wzchong007 2010-12-17
  • 打赏
  • 举报
回复
LZ没明白我的意思,看你的action_xml配置
<action name="serviceDLaction"
class="com.ykse.tms.autoupgrade.action.ServiceDLAction">
是这么写的对吧。
在这里你没有指定这个action到ServiceDLAction中具体执行哪个方法。
既然你没有指定那就会到execute方法。

应该写成
<action name="serviceDLaction"
class="com.ykse.tms.autoupgrade.action.ServiceDLAction" method="action方法名">
cwjbeyond 2010-12-17
  • 打赏
  • 举报
回复
struts.xml

<action name="serviceDLaction"
class="com.ykse.tms.autoupgrade.action.ServiceDLAction">
<result name="success">/ServiceDL.jsp</result>
<result name="addpage">/ServiceDLAdd.jsp</result>
<result name="add_s">/ServiceDL.jsp</result>
<result name="add_e">/ServiceDL.jsp</result>
<result name="editpage">/ServiceDLEdit.jsp</result>
<result name="edit_s">/ServiceDL.jsp</result>
<result name="edit_e">/ServiceDL.jsp</result>
<result name="delete_s">/ServiceDL.jsp</result>
<result name="delete_e">/ServiceDL.jsp</result>
<result name="input">/test.jsp</result>
<result name="error">/test.jsp</result>
</action>


jsp 中间表单元素省略

<s:form action="serviceDLaction" theme="simple">
<s:submit name="edit" method="edit" value="编辑"/>
<s:submit name="delete" method="delete" value="删除"
onclick="return confirm('删除后将无法恢复,是否继续?')"/>
</s:form>


action中有对应的edit()、delete()方法,不存在未指定方法。
wzchong007 2010-12-17
  • 打赏
  • 举报
回复
struts2中。如果你在action.xml配置文件对于一个action配置,如果你没有指定这个action对应类的方法,那么这个action就会自动执行execute方法。
jiankewuming 2010-12-17
  • 打赏
  • 举报
回复
把代码贴出来看看啊

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧