I have a form in a jsp. There are two submit buttons: "Search" and "Add New" button.
<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>
In 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>
In Struts Action class, we know that there is only one method that processing http request, that is execute()
method.
In my expected case, when I clicked Search button, it will perform searching data and render data to /example/search.jsp
, when I clicked Add New button, it will perform redirecting page to /example/add.jsp
. However, both buttons when clicked will go into execute() method. So I need to know how to detect which button clicked in the execute()
method.
The scenario looks like this
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";
}
}
You can define two actions in struts.xml
file and use action
attribute of <s:submit>
tag in order to submit to different actions http://struts.apache.org/docs/submit.html.
In JSP:
<s:submit value="Search" action="searchEmployeeAction"/>
<s:submit value="Add New" action="addEmployeeAction"/>
In 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>
And in your action create two public String
methods add
and search
.
Read about Multiple Submit Buttons http://struts.apache.org/docs/multiple-submit-buttons.html.
Update
Starting from Struts2 version 2.3.15.3 you need to set struts.mapper.action.prefix.enabled
constant to true in order to enable support for action:
prefix.
Put that in your struts.xml
file:
<constant name="struts.mapper.action.prefix.enabled" value="true" />
In your model layer, define a String
property named 'button'. Now, for both your submit buttons, specify name
or property
attribute as 'button'. So, in your execute()
method, in property 'button', you will get the corresponding value.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With