2012-11-12 11 views
6

Mam formularz w jsp. Dostępne są dwa przyciski przesyłania: przycisk "Szukaj" i "Dodaj nowy".Jak wykrywać przycisk przesyłania kliknięty w scenariuszu z kilkoma przyciskami przesyłania w pojedynczej klasie działania?

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

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

w klasie Struts działania, wiemy, że istnieje tylko jeden sposób, który przetwarza żądania http, czyli execute() metoda.

W moim przypadku spodziewanej, kiedy kliknąłem Szukaj przycisk, wykona wyszukiwania danych i renderować dane /example/search.jsp, kiedy kliknąłem Dodaj nowy przycisk, wykona przekierowanie stronę /example/add.jsp. Jednak oba przyciski po kliknięciu przejdą do metody execute(). Muszę wiedzieć, jak wykryć, który przycisk kliknął w metodzie execute().

scenariusz wygląda tak

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

Odpowiedz

17

Można zdefiniować dwa działania w struts.xml pliku i użyć action atrybut <s:submit> tag w celu przedłożenia do różnych działań http://struts.apache.org/docs/submit.html.

W JSP:

<s:submit value="Search" action="searchEmployeeAction"/> 
<s:submit value="Add New" action="addEmployeeAction"/> 

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

I w swoim działaniu utworzyć dwa public String metod add i search.

Przeczytaj o wielu przyciskach przesyłania http://struts.apache.org/docs/multiple-submit-buttons.html.

Aktualizacja

Począwszy od wersji 2.3.15.3 Struts2 trzeba ustawić struts.mapper.action.prefix.enabled stałą wartość true, aby umożliwić obsługę action: prefiksu.

Put, że w pliku struts.xml:

<constant name="struts.mapper.action.prefix.enabled" value="true" /> 
+2

Zobacz http://struts.apache.org/2.x/docs/multiple-submit-buttons.html. –

+0

tak .... mam to ... –

+0

@AleksandrM: czy mógłbyś podać bardziej szczegółowe odpowiedzi? Podobnie jak wygląda mapowanie struts.xml . O artykule z wieloma przyciskami przesyłania przeczytałem, że faktycznie :). Pierwsza (przy użyciu boolowskich rekwizytów) jest obiecująca, ale jakoś nie zadziałała, wygląda na to, że etykieta łańcuchowa przycisku nie może zostać zamieniona na boolowskie za pomocą kontrolera podpórek, prawdopodobnie jest używana do pracy w starszych wersjach (używam rozpórek 2.3) . Drugi nie jest dobry, ze względu na ścisłe połączenie z etykietą przycisków. – null

6

W swojej warstwie modelu zdefiniować String właściwość o nazwie 'przycisk'. Teraz, dla obu przycisków przesyłania, określ atrybut name lub property jako "przycisk". Tak więc w metodzie execute() w "przycisku" właściwości otrzymasz odpowiednią wartość.

Powiązane problemy