Как вызвать метод для кнопки отправки в 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 событие.

Различные методы достижимы:

  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 на уровне класса

Есть обстоятельства, когда это желательно, например, при использовании динамического вызова метода. Если в классе определен метод 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"/>

Потому что это не будет работать по умолчанию.

Другие вопросы по тегам