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



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

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

如何使用约定插件实现

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

  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 中启用动态方法调用。

但应该避免这种情况;阅读本文以了解原因:使Struts2应用程序更安全:禁用DMI请注意,Struts2 Maven 原型已经将 DMI 设置为 false,因为不鼓励这样做。

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

@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"/>

因为它默认情况下不起作用。

您需要使用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标记的methodaction因为上述问题限制使用特殊参数。如果您有多个提交按钮,如果您遵循该限制,则必须使用 JavaScriptonclick事件动态更改form标签的操作属性。

相关内容

  • 没有找到相关文章

最新更新