A minha duvida é a seguinte:
O codigo abaixo esta ok, mas para ele funcionar, o metodo deve ser chamar execute(…) , qndo eu mudo ele para listarPorCodigo, ai aparece o seguinte erro:
message DispatchMapping[/produtos] does not define a handler property
description The server encoutered an internal error(DispatchMapping [/produtos] does not define a handler property) that prevented it from fulfilling this request.
O q tenho q configurar no struts-config.xml para chamar o metodo listarPorCodigo ao inves de execute?
Abaixo segue os arquivos q estou usando:
struts-config.xml
<action path="/produtos" scope="request" name="produtosForm" validate="false" type="teste.ProdutoAction">
<forward name="sucesso" path="/pages/produtos.jsp" />
</action>
ProdutoAction.java
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttServletResponse response) {
int cod = Integer.parseInt(request.getParameter("cod"));
Collection produtos = listar(cod);
request.setAttribute("produtos", produtos);
return mapping.findForward("sucesso");
}
Você não pode simplesmente mudar o metodo e colocar o que você quiser, isso faz parte da API do Struts e você tem que obedece-la, se não o framework não funciona. Você tem que só sobrescrever o método.
Até existe um esquema de criar Inner Actions, igual tem no Mentawai, usando Struts, mas a configuração fica tão ruim que sinceramente, isso é quase inútil. Se está tentando colocar varias coisas na mesma action, ou você coloca tudo no método execute(), cria outra Action e esquece isso… ou usa um framework melhor.
Mas eu ja vi diversos exemplos em q eles mudam o metodo para outro nome ao inves de execute…mas tipo assim, se eu mudar o nome para listar, o q tenho q mexer no struts-config.xml, para ele saber q é para acessar o metodo listar?
No seu struts-config.xml:
<action .... parameter=metodo />
No seu ActionForm:
public class FormEu extends ActionForm{
private String metodo;
//get e set
}
No seu action:
public class ActionEu extends Action{
public ActionForward meuNome(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
return null; // retorna algo melhor :)
}
}
No seu jsp:
<form....>
<input type="text" name="metodo" value="meuNome" />
Entendeu?
Vc tem que identificar lah no seu xml, qual a String que armazenará o nome do metodo chamado, coloca esse atributo no form, seta o valor do form no jsp e dê o submit.
Ao executar ele entra automaticamente no método informado.
Não falei, a configuração do struts é sinistra…
Ainda bem que já foi-se!
sim, eh possível utilizar o método q vc quiser, inclusive ter uma Action que contenha varios métodos que tenham algo em comum, para fazer sentido estarem na mesma classe…
o lance eh q a sua Action vai ter q extender ActionDispatcher
http://struts.apache.org/1.x/apidocs/index.html e não mais Action…eh la no struts-config, vc vai atribuir um parametro a mais, q sera o “method” aih vc vai mapear qual método vc quer q seja executado…
se eu nao me engano eh assim, eu num tenho nenhum exemplo aqui, se eu conseguir eu posto…
flw