Direcionar action diretamente para um método dentro de uma action no Struts

Boa tarde amigos,

Estou com uma pequena dúvida. Estou usando Struts 1.3.8 … Tenho uma classe FornecedorAction, e quero criar um método para cada action que vem do struts-config… Atualmente tenho que fazer um IF dentro desta action e pegar o valor de um property de um button por exemplo… Quero criar um metodo para cada action, exemplo alterar, incluir, e etc… como faço este direcionamento amigos ?

struts-config:

<action path="/alterarFornecedor" 
	type="br.com.sce.controller.action.fornecedor.FornecedorAction" 
	name="fornecedorForm" 
	input="/jsp/fornecedor/listarFornecedor.jsp" 
	scope="request" 
	validate="true">
				
<forward name="fwd-sucesso_alterar_fornecedor" path="/jsp/fornecedor/alterarFornecedor.jsp"/>
</action>

Obrigado…

vc tera que ter passar um parametor para sua action por exemplo assim:

<action name="InserirAlterarTipoSolictPapltaForm" path="/excluirTipoSolictPaplta" parameter="dscAcao" type="br.com.controller.actions.controle.TipoSolictPapltaActions" validate="false" scope="request">
			<forward name="sucesso" path="/navegacaoControle.do?target=consultarTipoSolictPaplta" contextRelative="false" />
			<forward name="falha" path="/htdocs/programas/controle/Cadastro.jsp" contextRelative="true" />
			<forward name="resubmit" path="/htdocs/programas/controle/Usuario.jsp" contextRelative="true" />
		</action>

parameter=“dscAcao” esse trecho é oque vc terá que implementar.

e entao a sua classe action vc terá que da extends de DispatchAction.

entao se o parametro dscAcao = “inserirUsuario”, ele vai executar o metodo inserirUsuario dentro da classe action.

vlw!!!

Entendi amigo,

Mas quando implemento o parameter no struts-config, e no uso extends DispatchAction no método dentro da Action … o eclipse informa um erro pedindo para eu criar uma classe DispatchAction… O que devo fazer?

Vlw!

Estou implementado o meu método na action assim:

package br.com.sce.controller.action.fornecedor;

import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.*;
import br.com.sce.business.dao.fornecedor.FornecedorDAO;
import br.com.sce.business.vo.fornecedor.*;
import br.com.sce.resources.ConstantsUtil;

public final class FornecedorAction extends DispatchAction{

		
	// Alterar fornecedor
	public ActionForward alterarFornecedor (
				ActionMapping mapping, 
				ActionForm form, 
				HttpServletRequest request, 
				HttpServletResponse response) throws Exception {
			
			System.out.println("*** alterarFornecedor ***");
			
			ActionMessages errors = new ActionMessages();
			ActionMessages sucesso = new ActionMessages();
			FornecedorDAO daoFornecedor = new FornecedorDAO();
			
			// Objeto beanFornecedorForm que é populado com o que veio da jsp
			FornecedorVO fornecedorForm = (FornecedorVO) form;
			
			// Objeto beanFornecedor é o que vai para a jsp forward - se não houver erros
			String IdFornecedor = fornecedorForm.getId(); // Com Struts
			String opcao = request.getParameter("opcao");
			
			boolean bExist = daoFornecedor.selectNomeFantasiaFornecedorBoolean(fornecedorForm.getNomeFantasia());
			
			// Se for alterar e não existe no BD
			if(fornecedorForm.getOpcao().equals("ALTERAR") && !bExist) {
				System.out.println("** Fornecedor Inexistente para Alteração! **");
				ActionMessage error = new ActionMessage("error.alteracao");
				errors.add(ActionMessages.GLOBAL_MESSAGE, error );
				saveErrors(request, errors);	
				return new ActionForward(mapping.getInput());
			}
			
			
			if(opcao.equals("ALTERAR")) {			
				
				fornecedorForm.setId(IdFornecedor);
				int flagUpdate  = daoFornecedor.update(fornecedorForm);
				fornecedorForm.setId(Integer.toString(flagUpdate));
				
				// Verifica se ocorreu alteração do fornecedor e encaminha msg de sucesso para a JSP.
				if(flagUpdate > 0) {
					sucesso.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("sucesso.fornecedorAlteradoComSucesso"));
					saveMessages(request, sucesso);
					return mapping.findForward(ConstantsUtil.FWD_SUCESSO_ALTERAR_FORNECEDOR);
				
				} else {
					System.out.println("ATUALIZAÇÃO NAO REALIZADA!");
					}
			}

			// Põe na sessão o resultado o fornecedorForm Populado
			HttpSession session = request.getSession();
			session.setAttribute("fornecedorForm", fornecedorForm);
			return mapping.findForward(ConstantsUtil.FWD_SUCESSO_ALTERAR_FORNECEDOR);
	}
}

Porq que o Struts não “reconhece” o DispatchAction amigos?

Vlw!

Amigos, descobri porq que a classe DispatchAction não estava sendo reconhecido no meu projeto, era porq não tinha o arquivo struts-extras.jar. Agora já está sendo reconhecido, mas ainda não funciona. O método não é achado dentro da classe LoginAction, oq pode ser amigos?

action do struts-config:

<action path="/login" 
	type="br.com.sce.controller.action.login.LoginAction" 
	parameter="login"
	name="loginForm" 
	input="/jsp/login.jsp" 
	scope="request" 
	validate="true">
				
         <forward name="fwd-sucesso" path="/jsp/index.jsp"/>
</action>
Classe LoginAction:
package br.com.sce.controller.action.login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;

import br.com.sce.business.dao.usuario.UsuarioDAO;
import br.com.sce.business.vo.login.LoginVO;
import br.com.sce.business.vo.usuario.UsuarioVO;
import br.com.sce.resources.ConstantsUtil;

public class LoginAction extends DispatchAction{

	public ActionForward login(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		System.out.println("*** LoginAction ***");
		
		UsuarioDAO daoUsuario = new UsuarioDAO();
		LoginVO loginVO = (LoginVO)form;
		
		boolean valida = false; // Retorno do BD validando o acesso
		
		ActionMessages errors = new ActionMessages();
		
		System.out.println("getLogin: " + loginVO.getLogin());
		System.out.println("getSenha: " + loginVO.getSenha());
		
		if (loginVO.getLogin() == null || loginVO.getLogin().trim().equals("")) { // trim tira os espaços em branco
			errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.login"));
			
		}
		if(loginVO.getSenha() == null || loginVO.getSenha().equals("")) {
			errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.senha"));
		}
								
		if(errors.size() != 0) { 
			saveErrors(request, errors);
			System.out.println("Erro no Preenchimento do Login ou Password!");
			return new ActionForward(mapping.getInput());
		} else {
			
			System.out.println("Login ou Password Preenchidas corretamente!");
			System.out.println("Vai no banco validar Login e Password!");
			
			valida = daoUsuario.verificaUsuario(loginVO.getLogin(),loginVO.getSenha());
			UsuarioVO verificaNivelUser = daoUsuario.verificaNivelUsuario(loginVO.getLogin());
			
			System.out.println("loginBean.getNivel(): " + verificaNivelUser.getId());
			
			// Retorno da validação do Login Senha no BD
			if(valida && verificaNivelUser.getId().equals("1")) { // Se validado OK
				System.out.println("NIVEL 1!");
				HttpSession session = request.getSession();
				session.setAttribute("loginBean", loginVO);
				return mapping.findForward(ConstantsUtil.FWD_SUCESSO);
			} 
			if (valida && verificaNivelUser.getId().equals("2")){
				System.out.println("NIVEL 2!");
				return mapping.findForward(ConstantsUtil.FWD_SUCESSO);
			}
			
			else {
				System.out.println("Login ou Password invalido no BD!");
				errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.validador"));
				saveErrors(request, errors);
				return new ActionForward(mapping.getInput());
			}
		}
						
	}
	
}

Error:

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: Action[/login] does not contain specified method (check logs)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause 

java.lang.NoSuchMethodException: Action[/login] does not contain specified method (check logs)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:261)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
	org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
	org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
	org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
	org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
	org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


note The full stack trace of the root cause is available in the Apache Tomcat/5.5.12 logs.