How to detect submit button clicked in multiple submit buttons scenario in single Action class?

18,800

Solution 1

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" />

Solution 2

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.

Share:
18,800
null
Author by

null

null

Updated on June 27, 2022

Comments

  • null
    null almost 2 years

    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";
        }
    }