Duvida Basica com Struts e carregamento de listas na JSP

Oi pessoal,
tenho uma dúvida que deve ser algo bem simples para vocês.

Digamos que eu precise ao exibir uma .jsp que ela seja exibida com algumas listas de informações obtidas da base de dados, qual a forma de se fazer isso utilizando o Struts?
Ex.:

  • Estou na minha página inicial e vou para uma página de cadastro de cliente.
  • Na minha página de cadastro de cliente, eu preciso que seja listado os Estados ( mas não quero fazer uma lista dos estados dentro do .jsp, vamos utilizar estado apenas como exemplo )

meus passos:
-> Quando estou na página principal eu vou chamar a Action que me leva até a página de Cadastro (uma action que faça apenas forward ).
-> Ao ser exibida a Página de Cadastro eu não teria obtido essa lista e nem colocado na requisição.
A Action que faz o cadastro do cliente, tem apenas um execute que é chamado apenas na confirmação/submit do formulario na .jsp, como eu conseguiria faze com que antes de ser exibido a página do Cadastro ja venha a lista do que eu preciso para tal requisição ? ( como vocês fazem …)

escrevendo esse texto, vi algo com criar uma Action mesmo que fizesse isso ( obter as listas , inserir na requisição) e depois fizesse o forward para a tela de cadastro, é uma solução ?

DispatchAction
Eu consigo solucionar o problema atrás com o uso de DispatchAction, mas eu de quebra recebo um outro problema, como eu faço validação no Form ( validate ) e usando DispatchAction eu tenho configurado um form mas posso ter algumas “actions” dentro dele, quando eu tentasse chamar uma action que preparasse essas informações pra mim ( quando ela fizesse o forward ) ele automaticamente vai na classe Form e vai fazer a validação dos campos ( embora ainda nem foi exibido a página do cadastro, mas como ta o Form configurado ele vai fazer isso) me retornar a mensagem de que existe campos a serem preenchidos, mesmo antes de ser a página que deveria ser testado ( Cadastro ).

Então,
eu gostária de saber de vocês como solucionar esse “problema” das duas formas, uma utilizando apenas uma Action pra fazer isso e a segunda utilizando DispatchAction com validação dos campos no Form.

Agradeço.

alguém pra dar uma força ?

[size=9]nem pra dizer que não entendeu a pergunta ? :)[/size]

Fala rapaz :smiley:

Vamos por partes:

Você trabalha usando o DispatchAction e todas as ações referentes a Action do Cadastro, vamos supor que, estão na CadastroAction. Sua classe CadastroAction extende a DispatchAction e a classe mãe tem um método chamado dispatchMethod. Na sua classe CadastroAction você precisa sobrescrever esse método, vou te explicar o pq:

  • No momento que vc acessar o http://localhost:8080/sudeval/cadastroAction.do, ele vai entrar na classe CadastroAction e por ser a primeira vez que entra, ele não vai ter nenhuma ação setada e se não tiver o método sobrescrito, vai dar erro.

  • Sobrescrevendo o método, você pode preencher todas as listas que você quer, setar na requisição e lá na JSP, você vai recuperar e seta no select do html através da tag <c:forEach>.

Agora para validar os dados você tem a opção de usar o struts-validator ou fazer a validação no seu método de inserir.

Me parece que sua dúvida é como setar as ações para classe, é bem simples. Na sua jsp você cria um hidden field com o nome de acao, por exemplo. No seu struts-config você adiciona na tag correspondente aquela jsp o atributo parameter=“acao”. Esse campo acao PRECISA ter o mesmo nome do seu metodo da classe Action que voce deseja chamar.

Para setar o value da acao no campo hidden, use uma funcao javascript e é só correr pro abraço depois :smiley:

[]'s

[quote=mendigosujo]Fala rapaz :smiley:

Vamos por partes:

Você trabalha usando o DispatchAction e todas as ações referentes a Action do Cadastro, vamos supor que, estão na CadastroAction. Sua classe CadastroAction extende a DispatchAction e a classe mãe tem um método chamado dispatchMethod. Na sua classe CadastroAction você precisa sobrescrever esse método, vou te explicar o pq:

  • No momento que vc acessar o http://localhost:8080/sudeval/cadastroAction.do, ele vai entrar na classe CadastroAction e por ser a primeira vez que entra, ele não vai ter nenhuma ação setada e se não tiver o método sobrescrito, vai dar erro.

  • Sobrescrevendo o método, você pode preencher todas as listas que você quer, setar na requisição e lá na JSP, você vai recuperar e seta no select do html através da tag <c:forEach>.
    [/quote]
    Ok, aqui você me deu o toque de como resolver uma das minhas dúvidas ( a de listar dados dinâmicos ao chamar um .jsp, embora seja usando o dispatchaction, mas saquei), mas nesse caso o DispatchAction poderia ter os N metodos de um CRUD por exemplo ne ?

vou estar dando uma olhada no Validator :slight_smile:

[quote=mendigosujo]
Me parece que sua dúvida é como setar as ações para classe, é bem simples. Na sua jsp você cria um hidden field com o nome de acao, por exemplo. No seu struts-config você adiciona na tag correspondente aquela jsp o atributo parameter=“acao”. Esse campo acao PRECISA ter o mesmo nome do seu metodo da classe Action que voce deseja chamar.

Para setar o value da acao no campo hidden, use uma funcao javascript e é só correr pro abraço depois :smiley:
[]'s[/quote]
Na verdade não era essa a minha dificuldade, isso eu ja faço, so que eu o chamo fazendo algo assim por exemplo:

<html:link action="/usuarioAction.do?method=prepareUsuario">
    <bean:message key="registrar"/>
</html:link>

mais obrigado :D.

[color=blue]------- [/color]
vou tentar colocar alguns códigos para mostrar o meu problema.
[color=blue]------------------------------[/color]

Digamos que eu tenha o meu struts-config.xml dessa forma:

    <action path="/usuarioAction"
    	name="UsuarioForm"
    	type="br.com.sav.action.UsuarioAction"
    	input="registroPageDef"
    	parameter="method" >
      <forward name="registro" path="registroPageDef" />
      <forward name="ok" path="homePageDef" />
      <forward name="failedRegistro" path="falhaRegistroPageDef" />
      <forward name="failedLogin" path="falhaLoginPageDef" />
    </action>

e que eu tenha um UsuarioForm que sobrescreva o metodo validate

public class UsuarioForm extends ActionForm {

    get e sets ...

    public ActionErrors validate(ActionMapping map, HttpServletRequest req) {
        ActionErrors erros = new ActionErrors();
        if (getNome() == null) {
            erros.add("nome", new ActionMessage("errors.campoNome"));
        }
         os demais testes de preenchimentos ...
         return erros;
    }
}

e que eu tenha o meu UsuarioAction:

public class UsuarioAction extends DispatchAction {
    public ActionForward prepareUsuario(ActionMapping map,
			   ActionForm form,
			   HttpServletRequest request,
			   HttpServletResponse response) {
     // aqui eu vou obter alguns valores para a exibição de informações (como estados, tipo de endereços e etc.....) e colocaria na requisicao
     // ex.:
     /* Estados */
     List<Estado> listEstado = EnderecoRepository.getEstados(); // sera que ele deveria vir de Endereco?
     request.setAttribute("listEstado", listEstado );

     return map.findForward("registro");
    }

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

		UsuarioForm usuarioForm = (UsuarioForm)form;
		Usuario usuario = usuarioForm.getUsuario();
		usuario.setEndereco(usuarioForm.getEndereco());
		usuario.registrar();

		/* tudo ok, colocar o usuário na sessão */
		request.getSession().setAttribute("usuario", usuario);

		return map.findForward("ok");
	}

        // atualizar

        // obter 
}

o que eu estou tentando explicar é que, quando eu chama o

action="/usuarioAction.do?method=prepareUsuario">

mesmo esse metodo não sendo o de registrar ( ele é um antes, o que me traz as informações 1o), o UsuarioForm vai tentar validar e como eu ainda não estou na tela do registro do usuário ( return map.findForward(“registro”); ) eu com certeza não vou ter esses campos válidos, ae sempre vai me retornar para a página configurada no input, com os erros de preenchimentos.
então, a minha dúvida é como eu consigo evitar isso? utilizando o DispatchAction e fazendo a validação pelo Form. ( uma forma de “driblar” que ele fique checando se os dados estão OK, antes de eu está na página de inserir os dados )

Desculpa se você tiver respondido e eu não tiver conseguido enxergar :wink:

Agradeço!

Sudeval,

Conseguiu resolver esse problema do método validate ser chamado no carregamento da página? Tou exatamente com o mesmo problema, carrego umas informações iniciais no form e ele chama o método validate com os campos do form em branco.

Valeu!
Marcos.

Existe alguma forma de sobrescrever o método execute de tal forma que não seja necessário passar meu método na URL ?

<html:link action="/usuarioAction.do?method=prepareUsuario">Usuario</html:link> 

Valew.

Não entendi o que você quer fazer. Você está usando DispatchAction? Se você tem vários métodos na Action, como você gostaria de chama-los na URL?
[]'s

[quote=scheide]Não entendi o que você quer fazer. Você está usando DispatchAction? Se você tem vários métodos na Action, como você gostaria de chama-los na URL?
[]'s[/quote]

Isso, estou usando DispatchAction … então, tenho vários métodos na Action, tem algum forma de chamá-los sem ter que passar via get ou post ?