Duvida struts

Olha eu de novo :smiley:

Meu projeto usa struts 1.2, criei todas as Action mas eu acho que ta muito porco, por que está estruturado da seguinte maneira:

É possível criar uma única Action, tipo MendigoAction e nela ter todos os métodos de inserir mas sem precisar passar um parâmetro na URL? Como ficar o struts-config.xml?

[]'s

Existem 3 opções:

1° - Estender a classe Action e no execute fazer as condições necessárias através de um parâmetro, esse parâmetro não precisa estar na url pode ser um campo hidden via form post…

2° - Estender a classe DispatchAction e passar um parâmetro com o nome do método que vc quer acessar, precisa acrescentar o atributo parameter no actionmapping do struts.config…

3° - Estender a classe LookupDispatchAction e sobrescrever o método getKeyMethodMap onde retorna um map que a key é o nome da ação e o value é o nome do método, tanb precisa acrescentar o atributo parameter no actionmapping do struts.config…

O ideal é isso, uma única Action com todos métodos.
Você pode setar a ação via JavaScript, vc configura qual será seu parâmetro de ação no struts-config.

<action path="/mendigo" name="formMendigo"
			type="com.pacote.ActionMendigo" scope="session"
			input="mendigo.jsp" parameter="acao">
</action>

Na sua Action, vc tem por exemplo o método “insere”, no seu jsp, vc seta o parâmetro “acao” do seu form com esse nome. Então ele entra no “insere” de sua Action.

Até mais.

[quote=rodrigo_corinthians]Existem 3 opções:

1° - Estender a classe Action e no execute fazer as condições necessárias através de um parâmetro, esse parâmetro não precisa estar na url pode ser um campo hidden via form post…

2° - Estender a classe DispatchAction e passar um parâmetro com o nome do método que vc quer acessar, precisa acrescentar o atributo parameter no actionmapping do struts.config…

3° - Estender a classe LookupDispatchAction e sobrescrever o método getKeyMethodMap onde retorna um map que a key é o nome da ação e o value é o nome do método, tanb precisa acrescentar o atributo parameter no actionmapping do struts.config…[/quote]

De todas que eu li, a melhor seria a Dispatch né? Pq a Lookup eu iria precisar setar um message key na jsp, estou certo?

Mas na DispatchAction vou precisar passar um parâmetro também, não tem como passar o parâmetro sem ser na URL?

Bom as 3 fazem a mesma coisa de formas diferentes mas fazem dai vai do seu gosto mas eu também prefiro a DispatchAction.

Faz assim cria uma classe abstrata estendendo DispatchAction e sobreescreve o método dispatchMethod, fica mais fácil pra controlar as exceções e tals…

Pra usar Lookup no javadoc mostra um exemplo usando os message key’s mas eu acho que não precisa, faz um teste ae e depois fala pra gente. rs

Sim como tinha dito antes esse parâmetro vc pode passar num campo hidden via form mesmo, não vai ficar exposto na url.

To fazendo com o DispatchAction mas to levando pau dele rs

Minha classe está assim:

public class RegionalAction extends DispatchAction{

	public ActionForward inserir(ActionMapping map, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

jsp.

<html:form action="/mendigoAction.do">
	<input type="hidden" name="acao" id="acao"/>
<script>
function setarAcao(){
	document.getElementById('acao').value = "cadastrar";
}
</script>

e meu struts-config.xml

		<action path="/regionalAction"
			type="br.com.mdg.struts.action.mendigo.MendigoAction"
			name="mendigoForm"
			parameter="acao"
			scope="request">
			<forward redirect="true" name="sucesso" path="/ShowMendigoInsert.do"/>
		</action>	

Se eu passar a acao na action, ele funciona mas eu não qro fazer isso, quero passar por hidden!!

Ta faltando alguma coisa?rs

Bom a exceção está bem clara(NoSuchMethodException = não encontrou o método) mas na função javascript vc está passando um nome(cadastrar) que não existe, coloca o nome correto(inserir) que funciona…

Nossa que vergonha :oops:

Eu estava crente que tinha mudado isso, eu realmente mudei, mas foi na JSP errada rsrs

Valeu amigo, agora ta bala o sistema :smiley:

[]'s

Mais uma pergunta: se eu não definir ação nenhuma, tem como passar uma ação padrão para a classe?

Se não tiver ação nenhuma ele vai tentar acessar o execute() que na classe pai(ActionSupport) retorna uma String SUCCESS.

Certo, mas vamos supor o seguinte cenário: tenho uma classe que é chamada quando acesso o link para ir para a página show.jsp. Vamos supor que a action chamada seja a MendigoShowAction, dentro dessa classe tem um método que passa um parâmetro para a show.jsp.

No struts config, mudei para usar a MendigoAction e ser a única Action, eu consigo usar ela para realizar o que a MendigoShowAction fazia ( acessar http://localhost:8080/mdg/mendigoAction.do ao invés do http://localhost:8080/mdg/mendigoShowAction.do) e partir dela retornar uma String sem dar pau que não foi passado nenhum parâmetro ‘ação’?

[]'s

Favor desconsidera a minha última mensagem viajei grandão isso ae vale no Struts 2. :oops: Sexta de tarde é foda o cerébro já não funfa direito. hahaha

Isso se não passar o parâmetro sempre vai dar pau, vc tá estendendo a DispatchAction direto neh? Se sim acrescenta esses métodos na sua Action…

[code]protected ActionForward dispatchMethod(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, String parameter) throws Exception {
try {
if(parameter == null || parameter.trim().equals("")){
parameter = “pageInit”;
}
ActionForward actionForward = super.dispatchMethod(actionMapping, actionForm, request, response, parameter);
return actionForward;
} catch(Exception e) {
// Aqui vc trata a exceção ao seu estilo.
throw e;
}
}

protected ActionForward pageInit(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, String parameter) throws Exception {
return null; // forward pra página show.jsp
}[/code]

Po cara, deu certinho

Olhei a documentão e esse dispatchAction ( … ) é quem redireciona e tal :smiley:

Valeu

[]'s