Struts2:<s:submit>中的方法属性按钮不起作用

我在 jsp 中有一个表单.有两个提交按钮:搜索"和添加新"按钮.我已经为每个按钮设置了自己的方法属性.

<s:form name="searchForm" action="employeeAction" method="post"><s:textfield name="id" label="员工ID"/><s:textfield name="name" label="员工姓名"/><s:submit value="Search" method="doSearch"/><s:submit value="新增"方法="doAddNew"/></s:form>

在 struts.xml 中

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC"-//Apache 软件基金会//DTD Struts 配置 2.3//EN"http://struts.apache.org/dtds/struts-2.3.dtd"><支柱><常量名=struts.enable.DynamicMethodInvocation"值=假"/><常量名=struts.devMode"值=真"/><package name="default" namespace="/" extends="struts-default"><default-action-ref name="index"/><全局结果><result name="error">/error.jsp</result></全球结果><全局异常映射><异常映射异常="java.lang.Exception" result="error"/></全局异常映射></包><包名=示例"命名空间=/示例"扩展=默认"><action name="employeeAction" class="example.EmployeeAction"><result name="search">/example/search.jsp</result><result name="add">/example/add.jsp</result></动作></包></struts>

在 EmployeeAction 类中

公共类 EmployeeAction 扩展 ActionSupport {private static final Logger logger = Logger.getLogger(EmployeeAction.class);@覆盖公共字符串执行()抛出异常{logger.info("调用执行!");返回成功;}公共字符串 doSearch() 抛出异常 {logger.info("正在调用 doSearch!");返回搜索";}公共字符串 doAddNew() 抛出异常 {logger.info("正在调用 doAddNew!");返回添加";}}

问题是当我点击 "Search" 或 "Add New" 按钮时,方法 doSearch() 或 doAddNew() 从未被调用,而是调用方法 execute().我上面的代码有什么问题?

我正在使用 struts v2.3.

解决方案

设置

<常量名="struts.enable.DynamicMethodInvocation"值=假"/>

<常量名="struts.enable.DynamicMethodInvocation"值=真";/>

另一种方法是为同一个Action定义多个映射,比如

在 JSP 中:

<s:submit value=搜索"行动=员工搜索行动";/><s:submit value=添加新"动作=员工添加新动作"/>

在 Struts.xml 中

<action name="employeeSearchAction"类=example.EmployeeAction";方法=doSearch"><result>/example/search.jsp</result></动作><动作名称=employeeAddNewAction";类=example.EmployeeAction";方法=doAddNew"><result>/example/add.jsp</result></动作>

第三种方法是使用 通配符映射.p>

P.S:如果您选择第二个,作为最佳实践,我建议您对必须执行的每个逻辑操作使用一个操作...

如果您的两个操作都加载/管理了公共数据,则搜索";和添加新",然后您可以定义一个由employeeSearchAction 和employeeAddNewAction 扩展的employeeBaseAction.


编辑

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

I have a form in jsp. There are two submit buttons: "Search" and "Add New" button. I had set each button with their own method attribute.

<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>

In 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>

In EmployeeAction class

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";
    }
}

The problem is when I clicked "Search" or "Add New" button, the method doSearch() or doAddNew() was never called, instead it called method execute(). What is wrong with my code above?

I'm using struts v2.3.

解决方案

Set

<constant name="struts.enable.DynamicMethodInvocation" value="false" />

to

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

Another way is to define multiple mappings for the same Action, like

in JSP:

<s:submit value="Search"  action="employeeSearchAction" />
<s:submit value="Add New" action="employeeAddNewAction"/>

in 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>

A third way is to use Wildcard Mappings.

P.S: If you go for the second one, I'll suggest, as a best practice, to use one Action for every logical action you have to perform...

If you have common data loaded / managed by both your actions, "search" and "addNew", then you can define a employeeBaseAction, extended by both employeeSearchAction and employeeAddNewAction.


EDIT

It's 2014 now, and DMI usage is unanimously discouraged (today more than ever), other than pretty useless, so I strongly suggest you to use solution n.2.

相关文章