Struts2:<s:submit> 按钮中的方法属性不起作用
Posted
技术标签:
【中文标题】Struts2:<s:submit> 按钮中的方法属性不起作用【英文标题】:Struts2: method attribute in <s:submit> button doesn't work 【发布时间】:2012-10-31 06:08:27 【问题描述】:我在 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";
问题是当我点击 "Search" 或 "Add New" 按钮时,方法 doSearch() 或 doAddNew () 从未被调用,而是调用方法 execute()。我上面的代码有什么问题?
我正在使用 struts v2.3。
【问题讨论】:
method
不应该表示POST or GET
?
s:form的方法是http方法,s:submit的方法是Struts2 Action方法
【参考方案1】:
设置
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
到
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
另一种方式是为同一个Action定义多个映射,比如
在 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>
第三种方法是使用Wildcard Mappings。
P.S:如果您选择第二个,作为最佳实践,我建议您对必须执行的每个逻辑操作使用一个操作...
如果您的操作“搜索”和“添加新”都加载/管理了公共数据, 然后您可以定义一个由employeeSearchAction 和employeeAddNewAction 扩展的employeeBaseAction。
编辑
现在是 2014 年,一致不鼓励使用 DMI(今天比以往任何时候都更),除了非常没用,所以我强烈建议您使用解决方案 n.2 .
【讨论】:
以上是关于Struts2:<s:submit> 按钮中的方法属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章