如何检测在单个 Action 类中的多个提交按钮场景中单击的提交按钮? [复制]
Posted
技术标签:
【中文标题】如何检测在单个 Action 类中的多个提交按钮场景中单击的提交按钮? [复制]【英文标题】:How to detect submit button clicked in multiple submit buttons scenario in single Action class? [duplicate] 【发布时间】:2012-10-31 21:22:53 【问题描述】:我在 jsp 中有一个表单。有两个提交按钮:“搜索”和“添加新”按钮。
<s:form name="searchForm" action="employeeAction" method="post">
<s:textfield name="id" label="Employee ID"/>
<s:textfield name="name" label="Employee Name"/>
<s:submit value="Search"/>
<s:submit value="Add New"/>
</s:form>
在struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
</package>
<package name="example" namespace="/example" extends="default">
<action name="employeeAction" class="example.EmployeeAction">
<result name="search">/example/search.jsp</result>
<result name="add" type="redirect">/example/add.jsp</result>
</action>
</package>
</struts>
在Struts Action类中,我们知道处理http请求的方法只有一种,那就是execute()
方法。
在我的预期情况下,当我点击 Search 按钮时,它会执行搜索数据并将数据渲染到/example/search.jsp
,当我点击 Add New 按钮时,它会执行重定向页面到/example/add.jsp
。但是,单击时两个按钮都将进入 execute() 方法。所以我需要知道如何检测execute()
方法中点击了哪个按钮。
场景是这样的
public class EmployeeAction extends ActionSupport
public String execute() throws Exception
//PSEUDOCODE
//IF (submitButton is searchButton)
// return doSearch();
//ELSE IF (submitButton is addNewButton)
// return doAddNew();
return SUCCESS;
public String doSearch() throws Exception
//perform search logic here
return "search";
public String doAddNew() throws Exception
return "add";
【问题讨论】:
【参考方案1】:您可以在struts.xml
文件中定义两个动作,并使用<s:submit>
标签的action
属性来提交不同的动作http://struts.apache.org/docs/submit.html。
在 JSP 中:
<s:submit value="Search" action="searchEmployeeAction"/>
<s:submit value="Add New" action="addEmployeeAction"/>
在struts.xml中:
<action name="addEmployeeAction" method="add" class="example.EmployeeAction">
<result>/example/add.jsp</result>
</action>
<action name="searchEmployeeAction" method="search" class="example.EmployeeAction">
<result>/example/search.jsp</result>
</action>
然后在您的操作中创建两个public String
方法add
和search
。
了解多个提交按钮http://struts.apache.org/docs/multiple-submit-buttons.html。
更新
从 Struts2 版本 2.3.15.3 开始,您需要将 struts.mapper.action.prefix.enabled
常量设置为 true 以启用对 action:
前缀的支持。
把它放在你的struts.xml
文件中:
<constant name="struts.mapper.action.prefix.enabled" value="true" />
【讨论】:
@AleksandrM:你能给出更详细的答案吗?就像 struts.xml 映射的样子。关于多个提交按钮的文章,我实际上已经阅读了:)。第一个(使用布尔道具)很有希望,但它没有以某种方式工作,似乎按钮的字符串标签无法通过struts控制器转换为布尔值,可能它曾经在旧版本中工作(我使用的是struts 2.3) .第二个不好,因为与按钮标签的紧密耦合。 @AleksandrM:谢谢。 jsp中 把你的动作之一。将此视为您表单的默认设置。例如。如果您将使用 javascript 提交将使用该操作的表单。 @AleksandrM:好的,它正在工作,谢谢。顺便说一句,不要忘记在search()
和 add()
方法中使用 return SUCCESS;
,因为您的 在您的模型层中,定义一个名为“按钮”的String
属性。现在,对于您的两个提交按钮,将name
或property
属性指定为“按钮”。因此,在您的execute()
方法中,在属性“按钮”中,您将获得相应的值。
【讨论】:
以上是关于如何检测在单个 Action 类中的多个提交按钮场景中单击的提交按钮? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 检测测试类中运行单个测试方法以及如何为此更改编辑配置