Pergunta

No padrão, quero que meu aplicativo Struts2 encaminhe para uma ação:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

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

    <package name="myApp" namespace="/myApp" extends="struts-default">


        <action name="Login_*" method="{1}" class="myApp.SessionManager">
            <result name="input">/myApp/Login.jsp</result>
            <result type="redirectAction">Menu</result>     
        </action>

    </package>

    <package name="default" namespace="/" extends="struts-default">
        <default-action-ref name="index" />
        <action name="index">
            <result type="redirectAction">
                <param name="actionName">Login_input.action</param>
                <param name="namespace">/myApp</param>
            </result>
        </action>
    </package>


</struts>

Estou procurando o aplicativo para ligar para sessionManager.Input (), mas, em vez disso, ele chama sessionManager.execute ().

Foi útil?

Solução

Você não quer normalmente um público entrada() método. O cenário mais básico e típico para uma ação é:

  • A ação pretende "fazer algo" (uma coisa), e essa ação precisa de alguma entrada do usuário.
  • A ação faz do que algo no método executar()
  • Se a ação fez com êxito algo, ela se retira SUCESSO. Isso desencadeia uma página JSP informativa do resultado.
  • Se a ação não conseguiu a entrada do usuário (porque não havia, ou porque era insuficiente ou errado), ele retorna ENTRADA. Isso desencadeia um JSP "formulário de entrada" para que o usuário possa preencher os dados e (re) experimentar a ação.

Agora, esse cenário básico pode ser codificado de várias maneiras, entre eles:

1) Dois mapeamentos diferentes, um para a forma de entrada, outro para a execução

<!-- default action class: execute does nothing, returns SUCCES -->
<action name="ActionXXXShowForm"> 
                <result>/myApp/XXXForm.jsp</result>
</action>

<action name="ActionXXX" class="myApp.XXXAction"> 
                <result name="input">/myApp/XXXForm.jsp</result>
                <result>/myApp/XXXDone.jsp</result>
</action>

2) Apenas um mapeamento

<action name="ActionXXX"  class="myApp.XXXAction"> 
                <result name="input">/myApp/XXXForm.jsp</result>
                <result>/myApp/XXXDone.jsp</result>
</action>

Ambos são muito semelhantes (especialmente se você estiver fazendo validação programática). Nos dois casos, temos apenas um método "struts" na ação (executar), o que é uma boa prática como nossa ação apenas "faz uma coisa". Mas, no segundo caso, precisamos lidar com o caso em que nenhum dado é publicado e não emitir uma mensagem de erro para esse caso.

Exemplo: no caso 1:

public class XXXAction extends ActionSupport {
    ...    
    public String execute() throws Exception {
        if(! inputOk()) return INPUT;
         // .. do your stuff
        return SUCCESS;
    }

    private boolean inputOk() {
       // ... check your inputs - sort of programatic validation
       if( surname == null ) addActionError("no surname");
       // .... more checks
       return ! hasActionErrors());
    }

}

No caso 2, você o modifica um pouco:

public class XXXAction extends ActionSupport {
    ....    
    public String execute() throws Exception {
        if( emptyInput() ) return INPUT;  // no error messages in this case
        if(! inputOk()) return INPUT;
         // .. do your stuff
        return SUCCESS;
    }

    private boolean inputOk() {
       // same as before
    }

    private boolean emptyInput() {
       // detect no input was sent. do not emit errors herer
    }
}

Outras dicas

Quando você chama uma ação do JSP, o método padrão é execute (). Se você deseja chamar outro método, poderá especificar pelo método do atributo = "".

<s:url action="SessionManager" method="input"/>

O método de atributo é comum em outras tags.

Se você estiver usando um <s:a... Tag, então você não poderá chamar o método pretendido além do método padrão execute (). Ao invés de <s:a... tag, você precisa definir a ação usando um <s:url... Marque com um ID e chame o mesmo usando a etiqueta de âncora HTML normal, isto é.,<a href=${<<id>>} mas pode ser necessário especificar o método em seu struts.xml ou qualquer outro arquivo de configuração XML, que você incluiu no seu arquivo struts.xml com o atributo do método em seu <action... method="..." cláusula.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top