Ação Struts2 não ligando corretamente
-
21-09-2019 - |
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 ().
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.