且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-01-07 19:55:58

设置

<常量名="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.