在以下关于 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 配置。
如何使用约定插件实现?
不同的方法可以通过以下方式实现:
-
将
@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
在某些情况下需要这样做,例如使用动态 方法调用。如果在类中定义了执行方法,则 它将用于操作映射,否则方法是 将在发出请求时确定使用(通过动态方法 例如调用)
,显然通过在 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 和上述方法,要么不使用它,在这种情况下,您应该将操作映射到该方法,并且不要使用属性method
或submit
标记的method
和action
因为上述问题限制使用特殊参数。如果您有多个提交按钮,如果您遵循该限制,则必须使用 JavaScriptonclick
事件动态更改form
标签的操作属性。