Как вызвать метод для кнопки отправки в 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>
Я видел некоторые вопросы, подобные этому, но все они используют конфигурации XML в struts.xml
,
Как сделать это возможным, используя плагин конвенции?
2 ответа
Вам нужно использовать 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
как проблема выше ограничить использование специальных параметров. Если у вас есть несколько кнопок отправки, если вы соблюдаете это ограничение, вы должны динамически менять form
атрибут действия тега с использованием JavaScript onclick
событие.
Различные методы достижимы:
перемещая
@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 на уровне класса
Есть обстоятельства, когда это желательно, например, при использовании динамического вызова метода. Если в классе определен метод execute, то он будет использоваться для сопоставления действий, в противном случае используемый метод будет определен при выполнении запроса (например, с помощью динамического вызова метода)
и, очевидно, путем включения динамического вызова метода в Struts.xml.
Но этого следует избегать; Прочтите эту статью, чтобы понять, почему: Повышение безопасности приложения Struts2: отключение 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"/>
Потому что это не будет работать по умолчанию.