struts2无故执行execute()方法

探讨Struts2框架中,特定情况下submit按钮无法正确调用指定方法的问题。文章指出,当焦点不在submit按钮上且用户通过回车键提交表单时,Struts2可能会忽略指定方法并执行默认的execute方法。提供了解决方案,并分享了可能的原因。
部署运行你感兴趣的模型镜像

      用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>

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

### Struts2 中 `execute` 方法的使用与实现细节 在 Struts2 框架中,`execute` 方法是一个关键的部分,主要用于处理用户的请求并返回相应的视图结果。以下是关于 `execute` 方法的详细说明: #### 1. `execute` 方法的作用 `execute` 方法Struts2 框架中默认调用的方法。当用户访问某个 URL 时,框架会根据配置文件(如 `struts.xml`)中的映射关系找到对应的 Action 类,并调用其 `execute` 方法[^2]。 #### 2. `execute` 方法的返回值 `execute` 方法的返回值通常是一个字符串,表示视图的逻辑名称(如 `"success"` 或 `"error"`)。Struts2 框架会根据返回值匹配配置文件中的 `<result>` 标签,从而跳转到指定的视图页面[^3]。 ```java public class LoginAction { public String execute() { // 执行业务逻辑 return "success"; // 返回视图逻辑名称 } } ``` #### 3. `execute` 方法的实现要求 - 如果 Action 类继承自 `ActionSupport`,则默认实现了 `execute` 方法,并返回 `"success"`。因此在这种情况下,可以不重写 `execute` 方法,只需确保 `struts.xml` 中有与 `"success"` 对应的 `<result>` 配置即可。 - 如果 Action 类没有继承 `ActionSupport`,并且未通过 `method` 属性指定其他方法,则必须显式实现 `execute` 方法,否则框架会抛出找不到方法的错误。 #### 4. 动态方法调用(DMI) 除了默认的 `execute` 方法Struts2 还支持动态方法调用(Dynamic Method Invocation, DMI)。通过在 URL 中指定方法名,可以直接调用 Action 类中的其他方法,而无需依赖 `execute` 方法[^1]。 例如: ```xml <action name="Demo1Action_*" class="cn.itheima.b_dynamic.Demo1Action" method="{1}"> <result name="success">/hello.jsp</result> </action> ``` 在这个例子中,`{1}` 表示从 URL 中提取的第一个通配符参数,作为要调用的方法名。 #### 5. 参数传递与绑定 Struts2 提供了强大的参数绑定功能,能够将请求参数自动注入到 Action 类的属性中。这使得开发者可以在 `execute` 方法中直接访问和处理这些参数[^3]。 ```java public class LoginAction { private String username; private String password; // Getter 和 Setter 方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String execute() { if ("admin".equals(username) && "123456".equals(password)) { return "success"; } else { return "error"; } } } ``` #### 6. 异常处理 Struts2 提供了全局异常处理机制,可以通过配置文件定义异常映射规则。如果 `execute` 方法中抛出异常,框架会根据映射规则跳转到指定的错误页面[^4]。 ```xml <global-results> <result name="exception">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="exception"/> </global-exception-mappings> ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值