如何使用约定插件调用Struts 2中的提交按钮上的方法?

时间:2013-12-23 14:35:17

标签: jsp struts2 struts2-convention-plugin dmi

在下面关于Struts动作类的代码中,

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")  // Default.

public final class TestAction extends ActionSupport implements Serializable
{
    private static final long serialVersionUID = 1L;
    private static final String SUCCESS = "success";

    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    @Action(value="test",results={@Result(name="success",location="Test.jsp")})
    public String execute() throws Exception
    {
        System.out.println("name = "+name);
        System.out.println("email = "+email);
        return SUCCESS;
    }

    // Some annotations to map this method to <s:submit>
    public String postAction()
    {
        System.out.println("postAction() invoked.");
        System.out.println("name = "+name);
        System.out.println("email = "+email);
        return SUCCESS;
    }
}

我想在给定的提交按钮上调用postAction()方法,如此,

<s:form action="test">
    <s:textfield id="name" name="name" label="Enter your name"/>
    <s:textfield id="email" name="email" label="Enter your email"/>

    <s:submit value="Submit" method="postAction"/>
</s:form>

我见过一些像this one这样的问题,但所有问题都使用struts.xml中的XML配置。

如何使使用常规插件?

2 个答案:

答案 0 :(得分:2)

可以通过以下方式实现不同的方法:

  1. @Action注释从方法级别移动到类级别:

    @Action(value="test",results={@Result(name="success",location="Test.jsp")})
    public final class TestAction extends ActionSupport implements Serializable {
    
  2. execute()方法重命名为其他方法,例如。 test()

    public String test() throws Exception {
        System.out.println("name = "+name);
        System.out.println("email = "+email);
        return SUCCESS;
    }
    
    public String postAction() {
        System.out.println("postAction() invoked.");
        System.out.println("name = "+name);
        System.out.println("email = "+email);
        return SUCCESS;
    }
    
  3. 来自the documentation

      

    在班级应用@Action和@Actions

         

    在某些情况下需要这样,就像使用Dynamic时一样   方法调用。如果在类中定义了execute方法,那么   它将用于动作映射,否则将用于该方法   使用将在请求时确定(通过动态方法   例如调用)

    ,显然是在Struts.xml中启用动态方法调用。

    但应该避免这种情况;阅读本文以了解原因: Making Struts2 app more secure: disable DMI 请注意,Struts2 Maven原型已将DMI设置为false,因为不鼓励。

    然后,您应该关闭DMI,并开始使用多个Actions而不是多个方法,只需简单地注释其他Action的方法,并在action按钮中使用不同的<s:submit/>属性:

    @Action(value="test",results={@Result(name="success",location="Test.jsp")})
    public String test() throws Exception {
        System.out.println("name = "+name);
        System.out.println("email = "+email);
        return SUCCESS;
    }
    
    @Action(value="postAction",results={@Result(name="success",location="Test.jsp")})
    public String postAction() {
        System.out.println("postAction() invoked.");
        System.out.println("name = "+name);
        System.out.println("email = "+email);
        return SUCCESS;
    }
    

    并在JSP中:

    <s:form namespace="/admin_side">
        <s:textfield id="name"  name="name"  label="Enter your name"  />
        <s:textfield id="email" name="email" label="Enter your email" />
    
        <s:submit value="Submit to test()"       action="test"       />
        <s:submit value="Submit to postAction()" action="postAction" />
    </s:form>
    

    编辑:自Struts 2.3.15.3起,您需要明确启用action:后缀:

    <constant name="struts.mapper.action.prefix.enabled" value="true"/>
    

    因为它默认不起作用。

答案 1 :(得分:1)

您需要使用namespace属性,因为您的操作已映射为@Namespace

<s:form namespace="/admin_side" action="test">
    <s:textfield id="name" name="name" label="Enter your name"/>
    <s:textfield id="email" name="email" label="Enter your email"/>

    <s:submit value="Submit" method="postAction"/>
</s:form>

如果根据WW-4023在最新版本中不起作用,那么您可以直接调用方法

<s:url var="myUrl" namespace="/admin_side" action="test" method="postAction"/> 
<s:form action="%{#myUrl}">
    <s:textfield id="name" name="name" label="Enter your name"/>
    <s:textfield id="email" name="email" label="Enter your email"/>

    <s:submit value="Submit"/>
</s:form>

或配置params拦截器参数excludeParams以从排除的参数中删除method参数。

注意,要么使用DMI和上述方法,要么不使用它,在这种情况下,您应该将操作映射到方法,不要使用属性methodsubmit tag's {上述问题{1}}和method限制使用特殊参数。如果您遵循该限制,如果您有多个提交按钮,则必须使用JavaScript action事件动态更改form代码的操作属性。