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> 按钮中的方法属性不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Struts2

Struts2框架之-Struts2的标签

Struts2 全局结果集

struts2常用库

Struts2基础

struts2在web.xml中的配置