Struts2: атрибут метода в кнопке <s: submit> не работает
У меня есть форма в 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" method="doSearch"/>
<s:submit value="Add New" method="doAddNew"/>
</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">/example/add.jsp</result>
</action>
</package>
</struts>
В классе EmployeeAction
public class EmployeeAction extends ActionSupport {
private static final Logger logger = Logger.getLogger(EmployeeAction.class);
@Override
public String execute() throws Exception {
logger.info("Calling execute!");
return SUCCESS;
}
public String doSearch() throws Exception {
logger.info("Calling doSearch!");
return "search";
}
public String doAddNew() throws Exception {
logger.info("Calling doAddNew!");
return "add";
}
}
Проблема в том, что когда я нажимал кнопку "Поиск" или "Добавить новый", метод doSearch() или doAddNew() никогда не вызывался, вместо этого он вызывал метод execute (). Что не так с моим кодом выше?
Я использую распорки v2.3.
1 ответ
Задавать
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
в
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
Другой способ - определить несколько отображений для одного и того же действия, например
в JSP:
<s:submit value="Search" action="employeeSearchAction" />
<s:submit value="Add New" action="employeeAddNewAction"/>
в Struts.xml
<action name="employeeSearchAction" class="example.EmployeeAction" method="doSearch">
<result>/example/search.jsp</result>
</action>
<action name="employeeAddNewAction" class="example.EmployeeAction" method="doAddNew">
<result>/example/add.jsp</result>
</action>
Третий способ - использовать сопоставления с подстановочными знаками.
PS: Если вы выберете второй вариант, я рекомендую использовать одно действие для каждого логического действия, которое вам нужно выполнить...
Если у вас есть общие данные, загруженные / управляемые обоими вашими действиями, "search" и "addNew", то вы можете определить employeeBaseAction, расширенный как employeeSearchAction, и employeeAddNewAction.
РЕДАКТИРОВАТЬ
Сейчас 2014 год, и использование DMI единодушно не рекомендуется (сегодня больше, чем когда-либо), кроме довольно бесполезного, поэтому я настоятельно рекомендую вам использовать решение № 2.