Как исключить действие отправки из списка параметров в struts2?

Я пытаюсь исключить действие отправки из списка параметров. Ниже приведен класс действий.

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@InterceptorRefs({
    @InterceptorRef(value="validation", params={"excludeMethods", "test"}),
    @InterceptorRef(value="params", params={"excludeParams", "action:postAction"})})
public final class TestAction extends ActionSupport implements Serializable, ValidationAware
{
    private static final long serialVersionUID = 1L;
    private static final String SUCCESS = "success";

    private String name;

    @Action(value = "test", results = {
    @Result(name="success", location="Test.jsp"),
    @Result(name = "input", location = "Test.jsp")})
    public String test() throws Exception
    {
        System.out.println("name = "+name);
        return SUCCESS;
    }

    @Action(value = "postAction", results = {
    @Result(name="success", location="Test.jsp"),
    @Result(name = "input", location = "Test.jsp")})
    public String postAction()
    {
        System.out.println("Post invoked");
        System.out.println("name = "+name);
        return SUCCESS;
    }

    @RequiredStringValidator(type= ValidatorType.FIELD, message = "The name is required.")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void validate()
    {
        if(!hasErrors()&&name.length()<2)
        {
            addFieldError("name", "The name must compose of 2 letters.");
        }
    }
}

Test.jsp страница:

<s:form namespace="/admin_side" action="test" validate="true">
    <s:textfield id="name" name="name" label="Name"/>
    <s:submit id="btnSubmit" name="btnSubmit" value="Submit" action="postAction"/>
</s:form>

Сгенерированный HTML-код для <s:submit> будет выглядеть следующим образом.

<input type="submit" id="btnSubmit" name="action:postAction" value="Submit"/>

@InterceptorRef выше класса

@InterceptorRef(value="params", params={"excludeParams", "action:postAction"})

не похоже на работу. Метод postAction() никогда не вызывается, вызывая следующее предупреждение.

24 декабря 2013 г. 22:49:16 com.opensymphony.xwork2.interceptor.ParametersInterceptor warn ПРЕДУПРЕЖДЕНИЕ: Параметр [action:postAction] находится в списке шаблонов excludeParams!


в struts.properties файл, у меня есть следующие свойства до сих пор.

struts.enable.DynamicMethodInvocation=false
struts.devMode=false
struts.ui.theme=simple

struts.convention.package.locators=actions
struts.convention.action.suffix=Controller
struts.convention.action.mapAllMatches=true

struts.convention.result.path=/WEB-INF/content //No need. It is the default.
struts.mapper.action.prefix.enabled=true

Я использую Struts 2.3.16.


Почему он не исключает параметр кнопки отправки? Как вызвать postAction() метод, когда <s:submit> нажал?

1 ответ

Решение

Почему он не исключает параметр кнопки отправки?

Поскольку этот параметр находится в excludeParams список params перехватчик в defaultStack на которое ваше действие ссылается по умолчанию.

Как вызвать метод postAction(), когда <s:submit> нажал?

В этом вопросе вы спрашиваете, как вызвать метод (не действие). Разница между действием и методом первого сопоставляется с указанным URL-адресом с использованием пространства имен и имени действия. Итак, чтобы вызвать метод, отличный от действия, вы должны включить DMI. Struts, так как 2.3.16 отключил эту опцию. Следующая константа конфигурации для использования в struts.xml:

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

и использовать method атрибут вместо action приписывать.

<s:form namespace="/admin_side" action="test">
  <s:submit value="Submit" method="postAction"/>
</s:form> 

как я уже сказал в этом ответе.

Если вы не хотите использовать DMI, у вас есть возможность включить action: префикс к параметру

<constant name="struts.mapper.action.prefix.enabled" value="true"/>

и использовать действие, сопоставленное с методом postAction

<s:form namespace="/admin_side" action="test">
  <s:submit value="Submit" action="postAction"/>
</s:form> 

и использовать аннотацию без params.excludeParams,

@InterceptorRef(value="defaultStack" params={"validation.excludeMethods", "test"})

Предупреждение о том, что action:postAction параметр в списке исключений все еще сохраняется, но он появляется, только если struts.devMode=true, Вы не должны беспокоиться об этом, потому что он предупреждает все параметры из excludeParams список, который прошел. Выключить devMode вы должны установить

<constant name="struts.devMode" value="false" />
Другие вопросы по тегам