我在 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()。我上面的代码有什么问题?

我正在使用 struts v2.3。

请您参考如下方法:

设置

<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:如果您选择第二个,作为最佳实践,我建议您对必须执行的每个逻辑操作使用一个操作...

如果您有通过“搜索”和“添加新”这两个操作加载/管理的公共(public)数据, 然后您可以定义一个由 employeeSearchAction 和 employeeAddNewAction 扩展的 employeeBaseAction。


编辑

现在是 2014 年了,一致不鼓励使用 DMI(今天比以往任何时候都更不鼓励),除了毫无用处,所以我强烈建议您使用解决方案 n.2 .


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!