Trocar Método

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.

:wink:

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