Struts2:<s:submit> 中的方法属性按钮不起作用 [英] Struts2: method attribute in <s:submit> button doesn't work

查看:30
本文介绍了Struts2:<s:submit> 中的方法属性按钮不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

<s:textfield name="id" label="员工 ID"/><s:textfield name="name" label="员工姓名"/><s:submit value="Search" method="doSearch"/><s:submit value="Add New" method="doAddNew"/></s:form>

在 struts.xml 中

<支柱><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"/><全局结果><result name="error">/error.jsp</result></global-results><全局异常映射><exception-mapping exception="java.lang.Exception" result="error"/></global-exception-mappings></包><package name="example" namespace="/example" extends="default"><action name="employeeAction" class="example.EmployeeAction"><结果名称="搜索">/example/search.jsp</result><result name="add">/example/add.jsp</result></动作></包></支柱>

在 EmployeeAction 类中

public class EmployeeAction extends ActionSupport {私有静态最终记录器记录器 = Logger.getLogger(EmployeeAction.class);@覆盖公共字符串执行()抛出异常{logger.info("调用执行!");返回成功;}公共字符串 doSearch() 抛出异常 {logger.info("调用doSearch!");返回搜索";}公共字符串 doAddNew() 抛出异常 {logger.info("调用doAddNew!");返回添加";}}

问题是当我点击搜索"添加新"按钮时,方法doSearch()doAddNew() 从未被调用,而是调用了方法 execute().我上面的代码有什么问题?

我使用的是 struts v2.3.

解决方案

设置

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

在 JSP 中:

在 Struts.xml 中

<result>/example/search.jsp</result></动作><action name="employeeAddNewAction";class =example.EmployeeAction"方法=doAddNew"><result>/example/add.jsp</result></动作>

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

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

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


编辑

现在是 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.

这篇关于Struts2:&lt;s:submit&gt; 中的方法属性按钮不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆