1

在以下有关 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>

我见过一些类似这样的问题,但它们都使用 .xml 文件中的 XML 配置struts.xml

如何使用 约定插件使其成为可能?

4

2 回答 2

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

文档中

在类级别应用@Action 和@Actions

在某些情况下需要这样做,例如使用动态方法调用时。如果在类中定义了执行方法,那么它将用于动作映射,否则将在发出请求时确定要使用的方法(例如通过动态方法调用)

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

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

然后,您应该关闭 DMI,并开始使用多个动作而不是多个方法,只需简单地注释其他动作的方法,并在按钮中使用不同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"/>

因为默认情况下它不会工作。

于 2013-12-23T15:43:47.480 回答
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拦截器参数excludeParamsmethod从排除参数中删除参数。

请注意,您要么使用DMI和上述方法,要么不使用它,在这种情况下,您应该将操作映射到方法,并且不要使用属性methodsubmit标签method,并且action由于上述问题限制使用特殊参数。如果您有多个提交按钮,并且遵循该限制,则必须form使用 JavaScriptonclick事件动态更改标签的操作属性。

于 2013-12-23T15:24:19.973 回答