2013-12-23 8 views
1

В следующем фрагменте кода о Struts класса действий,Как вызвать метод на кнопку отправки в Struts 2 с помощью плагина соглашения?

@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> 

Я видел некоторые вопросы например this one, но все они используют XML-конфигурации в struts.xml.

Как сделать возможным используя условный плагин?

ответ

1

Вам необходимо использовать атрибут 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

Как избавиться от этого предупреждения - 'ПРЕДУПРЕЖДЕНИЕ: Параметр [действие: postAction] находится в списке шаблонов excludeParams!'? [Google] (https://www.google.co.in/?gws_rd=cr&ei=FG64UrzYGsK4rgf4sIHABQ#q=WARNING:+Parameter+is+on+the+excludeParams+list+of+patterns!) Не привел меня к решение. Я не знаю, как настроить перехватчик с помощью аннотаций. Можете привести пример, пожалуйста? – Tiny

+0

http://stackoverflow.com/a/16604527/573032, http://stackoverflow.com/a/15922028/573032 –

2

Различные методы могут быть достигнуты с помощью:

  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; 
    } 
    

От the documentation:

Применение @Action и @Actions на уровне класса

Есть обстоятельства, когда это желательно, как при использовании динамического Вызов метода.Если выполнить метод определен в классе, то он будет использоваться для отображения действий, в противном случае метод будет использоваться будет определяться, когда запрос сделан (по методу динамического Призывание, например)

и, очевидно, путем включения вызова динамического метода в Struts.xml.

Но этого следует избегать; прочитайте эту статью, чтобы понять, почему: Making Struts2 app more secure: disable DMI. Обратите внимание, что архетипы Struts2 Maven уже имеют DMI, установленный в false, потому что он обескуражен.

Затем следует отключить DMI и начать использовать несколько действий вместо нескольких методов, просто аннотирование методы другого действия слишком, и с использованием различных 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> 

EDIT: с Struts 2.3.15.3, вы должны явно ан струкцией action: суффикс с:

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

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

+0

Я поместил это свойство 'struts.enable.DynamicMethodInvocation = false', чтобы отключить DMI под' WEB-INF/classes/struts.properties', но этот метод никогда не вызывается в моем случае. Вместо этого я всегда получаю предупреждение: «23 декабря 2013 г. 11:15:02 com.opensymphony.xwork2.interceptor.ParametersInterceptor warn ВНИМАНИЕ: Параметр [action: postAction! PostAction] находится в списке шаблонов excludeParams!' , – Tiny

+0

Является ли ваш JSP точно так же, как мой? –

+0

Да, это то же самое, что и в вашем ответе. – Tiny