Action - Struts [Definir varias funções]

6 respostas
E

Pessoal Boa tarde,

Uma vez eu li que da para criar uma Action no Struts com várias funções além da Execute();

Ex.

Execute();

Update();

Delete();

A minha dúvida é a seguinte, como fazer, para definir quando deve entrar na opção de Update ou delete ?

Tem como setar isso direto no Struts-Config ?

[]s,
Eduardo Lima
[email removido]

6 Respostas

danieldestro

Sua action deve implementar DispatchAction e na configuração da action o struts-config.xml, no atributo parameter coloque o nome do paramêtro HTTP que vai conter o nome do método a executar.

Exemplo: parameter=“exec”

E no JSP:

<input type=“hidden” name="execvalue=“update”>

E

Daniel,

Entendi o que vc disse mas eu não consegui implementar…

Meu código:

JSP

&lt;html:form action="/admin/updateCadastro" focus="usuario.nome" method="post" &gt;
        <br/>
        Nome --&gt &lt;html:text property="usuario.nome" /&gt;
        E-mail --&gt &lt;html:text property="usuario.email" /&gt;
        &lt;input type="hidden" name="exec" value="update"&gt;
        &lt;html:submit value="Salvar" /&gt;
    &lt;/html:form&gt;

ACTION

public class Cadastro extends DispatchAction {
    
    /* forward name="success" path="" */
    private final static String SUCCESS = "success";
    private final static String ERROR = "error";
    
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        HttpSession session = request.getSession();
        
        CadastroForm cadastroForm = (CadastroForm) form;
        
        cadastroForm.setUsuario((Usuario) session.getAttribute("usuario"));
        
        session.setAttribute("body", "cadastro.jsp");
        
        System.out.println("Dentro da Action [execute]");
        
        return mapping.findForward(SUCCESS);
        
    }
    
    public void update(){
        System.out.println("No meu método...");        
    }    
}

STRUTS_CONFIG

&lt;action path="/admin/updateCadastro" parameter="exec" name="CadastroForm" type="br.com.peoplemais.site.struts.action.Cadastro" input="/admin/home.jsp"&gt;
            &lt;forward name="success" path="/admin/home.jsp" redirect="true"&gt;&lt;/forward&gt;
        &lt;/action&gt;
danieldestro

public ActionForward update( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { //... }

marciobarroso

Você não deve implementar mais o execute(...) quando está extendendo DispatchAction.

O execute da classe DispatchAction é executado inicialmente, e ele verifica o valor do seu parameter. E usando reflection, ele invoca o metódo referente ao valor do seu parameter.

Então, em suma, sua action terá somente os métodos referentes as ações, e não mais será necessário o controle para ver qual o método executar.

Exemplo

A super class GenericAction é filha de DispatchAction

public class UsuarioAction extends GenericAction {
	
    private UsuarioBD bd = UsuarioBD.getInstance();
    private Usuario usuario = new Usuario();
    
	public ActionForward iniciar(	ActionMapping mapping,
									ActionForm form,
									HttpServletRequest request,
									HttpServletResponse response) throws DaoException {
        
        return go(Constantes.USUARIO_ACTION_INICIAR);
	}
    
    public ActionForward logar(     ActionMapping mapping,
                                    ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response) throws DaoException {
        
        processValidationRules();
        
        try {
            populateObject(usuario);
        } catch (DaoException e) {
            setErrors("mensagem.usuarioaction.logar.erro.cast");
            return iniciar(mapping, form, request, response);
        } 
        try{
            usuario = bd.login(usuario);
        } catch (DaoException e) {
            setErrors(e.getMessage());
            return iniciar(mapping, form, request, response);
        }
        
        setObjectSession(Constantes.USUARIO_SESSAO, usuario);
        
        return go(Constantes.USUARIO_ACTION_LOGAR);
    }
    
    public ActionForward logout(    ActionMapping mapping,
                                    ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response) throws DaoException {
        
        invalidateSession();
            
        return iniciar(mapping, form, request, response);
    }
}
&lt;struts-config&gt;
    &lt;form-beans&gt;
		&lt;form-bean name="usuarioForm" type="org.apache.struts.validator.DynaValidatorActionForm"&gt;
			&lt;form-property name="login" type="java.lang.String" /&gt;
			&lt;form-property name="senhaWeb" type="java.lang.String" /&gt;
		&lt;/form-bean&gt;
    &lt;/form-beans&gt;
    &lt;action-mappings&gt;

		&lt;action path="/usuario" 
				parameter="service" 
				type="sgv.view.action.UsuarioAction" 
				name="usuarioForm"
				validate="true" 
				scope="request"&gt;
			&lt;forward name="logar" path="tiles.usuario.login" /&gt;
			&lt;forward name="home" path="tiles.usuario.home" /&gt;
		&lt;/action&gt;
    &lt;/action-mappings&gt;
&lt;/struts-config&gt;

No jsp, eu seto um textfield tipo hidden com o name=service e com o valor igual ao método que eu quero que seja executado na action.

Abraço

E

blz… esta tudo certo…

O problema é que a variavel exec está sendo perdida no meio do caminho.
Não sei se por causa do struts, ou sei lá o que… mas ele não consegue encontrar o valor dela…

Bom, não sei o que fazer agora… rs

valew

marciobarroso

vc está usando qual versão do struts ? te aconselho, caso não esteja usando, a baixar a última release do struts.

Abraço

Criado 25 de agosto de 2006
Ultima resposta 25 de ago. de 2006
Respostas 6
Participantes 3