我在jsp中有一个表格。有两个提交按钮:“搜索”和“添加新”按钮。我已经为每个按钮设置了自己的method属性。
<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() 方法。我上面的代码有什么问题?
我正在使用Struts v2.3。
组
<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:如果您要进行第二次练习,我建议,作为最佳实践,对您必须执行的每个逻辑操作都使用一个“操作”。
如果您有同时由“搜索”和“ addNew”这两个动作加载/管理的通用数据,则可以定义一个由employeeSearchAction和employeeAddNewAction扩展的employeeBaseAction。
现在是2014年,并且 不鼓励使用DMI (今天比以往任何时候都更多),除了非常没用之外,因此我 强烈 建议您使用解决方案n.2。