在下面关于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配置。
如何使
答案 0 :(得分:2)
可以通过以下方式实现不同的方法:
将@Action
注释从方法级别移动到类级别:
@Action(value="test",results={@Result(name="success",location="Test.jsp")})
public final class TestAction extends ActionSupport implements Serializable {
将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
在某些情况下需要这样,就像使用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和上述方法,要么不使用它,在这种情况下,您应该将操作映射到方法,不要使用属性method
或submit
tag's {上述问题{1}}和method
限制使用特殊参数。如果您遵循该限制,如果您有多个提交按钮,则必须使用JavaScript action
事件动态更改form
代码的操作属性。