2013-12-24 6 views
4

Я пытаюсь исключить действие отправки из списка параметров. Ниже приведен класс действий.Как исключить действие submit из списка параметров в 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 10:49:16 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor предупреждают ПРЕДУПРЕЖДЕНИЕ: Параметр [действие: 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>?

ответ

3

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

Поскольку этот параметр находится в 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> 

как я уже говорил в this ответ.

Если вы не хотите использовать 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" /> 
+0

На самом деле, я хочу, метод 'postAction()' должен быть отображен на данный '' action' из '(не' method'), так как DMI не рекомендуется. Этот перехватчик над классом действия - '@InterceptorRef (value =" defaultStack ", params = {" params.excludeParams "," action: postAction "," validation.excludeMethods "," test "})})' все еще не может удалить это warning - 'WARNING: Параметр [action: postAction] находится в списке шаблонов excludeParams!'. Я не могу найти подходящие/подходящие примеры в Интернете. – Tiny

+0

Затем оно выдает это предупреждение - «ВНИМАНИЕ: Параметр [действие: postAction] не соответствует принятому шаблону паттерна!' – Tiny

+0

Затем он выдает эти предупреждения: 'WARNING: Параметр [действие: postAction] не соответствует списку acceptParams pattern! 'и' WARNING: Параметр [name] не соответствует списку шаблонов acceptParams! ' – Tiny

 Смежные вопросы

  • Нет связанных вопросов^_^