Primeira dúvida com WW

13 respostas
rvaldomiro

Olá amigos,

De tanto ler os posts sobre ww aqui do guj resolvi experimentar o danado, pois já tenho uma certa experiência em Struts o que me ajudou muito e entender o funcionamento e as diferenças entre eles :slight_smile: , realmente o ww é mais limpo em termos de configurações e quantidade de classes do que o Struts, também achei o validator muito bacana e um dos pontos mais interessante é o desacoplamento das actions então tenho duas perguntas:

:?: - Em meu sistema (Struts) tenho muitos formulários para edição de dados onde à partir de uma lista eu chamo um formulário detalhe com as informações do cliente por exemplo onde o usuário altera estas informações e salva no banco via hibernate, eu faço isso trafegando beans na sessão e carregando os FormBeans antes de chamar à página. Como eu faço isso no ww já que o model está acoplado na action que sempre é criada a cada requisição?

:?: - Se as actions são independentes de requisições http qual seria o melhor caminho se eu quiser posteriormente montar algumas interfaces swing para a camada view aproveitando toda ou boa parte da MC?

Quero aproveitar para em especial agradecer ao smota pelo brilhante tutorial sobre o assunto o que me fez olhar para este fw com outros olhos pois antes de ler estava cético no Struts, não que não seja bom, mas ele impõe muitas papagaiadas desnecessárias e que deixaram meu projeto enorme :wink:

13 Respostas

maresp

:arrow: Vc pode acessar a sessão normalmente com:

ActionContext.getContext().getSession()

Não é o caso, mas vc já viu como o ww trabalha com componentes?

:arrow: URLConnection e commons-HttpClient do jakarta pode atender vc.

rvaldomiro

Então jogar o bean carregado na sessão (ou request sei lá) antes de chamar a Action e na action fazer a cópia do bean para o modelo seria a melhor solução??

Agora quanto as ações eu tenho que ter uma para cada caso, ou seja, IncluirCliente, AlterarCliente, ExcluirCliente, etc… ou tem alguma forma de ter um ManterCliente que recebe algum tipo de parametro com a ação??? :lol:

Você teria um micro-exemplo de como fazer?

Qto ao segundo item vou dar uma estudada. valeu!!! :wink:

Lucas_Teixeira

É legal dar uma olhada até que ponto o xwork puro (sem o ww) te ajudaria numa situacao desta.

(:

Jair_Rillo_Junior

Se eu entendi bem (ou será que não, essas férias estão me matando :wink: ), você quer fazer tudo isso para preencher um modelo??? Se for isso apenas use o Interceptor Model-Driven e seja feliz :lol:

rvaldomiro

Putz, que legal que seja mais simples do que eu pensava + eu num sei como implementar isso buáááááá!!!

Alguém posta um pequeno exemplo please :wink:

smota

Hummm … pelo que entendi você será um homem mais feliz a partir de agora :shock: , nada de formbeans ou dynaformbeans … com o WW você nao precisa se preocupar com o que vc coloca onde (cuidado) … aprenda sobre a ValueStack e seja feliz …

Tá, falando portugues:
Voce nao precisa se preocupar em colocar nada manualmente na sessao, request ou seja la onde for para acessar em uma pagina … a action executada automaticamente vai pra stack e todos os seus metodos estao disponiveis, inclusive o model que vc populou executando a action (nao necessariamente precisa implementar ModelDriven, veja no historico do guj tem algumas discussoes sobre isso) …

Eu entendi que sua duvida eh basicamente “como criar um formulario”, eh isso?

Os componentes como citado vao te permitir acessar outros escopos (session, aplication) de forma transparente (a nao ser no components.xml vc nao vai precisar saber onde esta aquele componente em nenhum outro lugar) …

Vc vai ter que implementar um Webwork da vida … ou usar o pendulum :wink: … isso sera o controller que ira interagir com o Xwork (as actions sao do Xwork) e tá tudo resolvido …

[]s

rvaldomiro

perfeito smota como vai??

é. na verdade eu tô com dificuldade em entender como mostrar um form de edição populado pelo modelo entende?? Esse lance de num precisar colocar nada na mão na request, session, etc… é D+ :smiley: mas seguindo o teu exemplo tenho o inverso, ou seja, um form em branco que carrega o modelo e daí em diante sou feliz!!!
Me dá uma palhinha baseado nesse exemplo, tipo, imagina que após o login eu tivesse que carregar todas as informações do usuário em outra página, alterar o nome (por exemplo) e salvar… Se eu dominar isso já tenho 70% de base para começar a programar WW 8)

maresp

Melhorando um pouco a resposta... se vc quer popular um bean vc tem 3 alternativas:
- model-driven - parâmetros do request com mesmo nome dos atributos do bean (mencionado pelo ManchesteR);
- ognl;
- métodos get (mostrar) set (preencher) para as propriedades da action com mesmo nome dos parâmetros que estão vindo pelo request.

model-driven (no xwork.xml vc precisa do interceptor model-driven)
public class ModelDrivenAction extends ActionSupport implements ModelDriven {

   private MyBean bean;

   public Object getModel() {
      return bean;
   }

   public String execute() throws Exception {
      ...
   }
}
ognl
form (html)
<input type="text" name="bean.id">
<input type="text" name="bean.name">

public class MyBean implements Serializable {

   private Integer id;
   private String nome;

   // get's & set's
}

Veja o EVGD sobre ww tem bons tópicos lá falando sobre isso.

smota

Antes: Jundiaí? Se estiver querendo um emprego veja isso aqui (ehehehe to matando cachorro a grito) e me manda o seu CV, se encaixar a gente conversa :wink:
No meio: Vou virar seu vizinho :lol: … mas ta dificil encontrar casa pra alugar na sua terra, V. Arens, Jd. Estadio e redondezas, se conhecer alguma me de um toque tb (pleaaase) :shock:

Pronto pessoal … vamos continuar, é simples: V
oce executa a action por exemplo detalhes.action que faz um find com o Hibernate populando o bean Usuario … e coloca um getUsuario na action … no form chama os campos usuario.nome, usuario.sobrenome, etc …

desculpa a preguica :roll: … é igual qui nem o seu SALVAR, soh que antes de exibir o formulario vc executa uma action pra popular o objeto …

kartler

rvaldomiro:
perfeito smota como vai??

é. na verdade eu tô com dificuldade em entender como mostrar um form de edição populado pelo modelo entende?? Esse lance de num precisar colocar nada na mão na request, session, etc… é D+ :smiley: mas seguindo o teu exemplo tenho o inverso, ou seja, um form em branco que carrega o modelo e daí em diante sou feliz!!!
Me dá uma palhinha baseado nesse exemplo, tipo, imagina que após o login eu tivesse que carregar todas as informações do usuário em outra página, alterar o nome (por exemplo) e salvar… Se eu dominar isso já tenho 70% de base para começar a programar WW 8)

è simples ModelDriven… vc passa o modelo para requisição e Show!!! é só ser feliz. o Modelo(Objeto o Bean ) estará lá com os getS Da vida, intão vc só o chama.

Tipo com velocity eu só uso assim, já que no WW conhece os Atributos get set …

$nome
$endereco
$fone
$blablabla

o próprio WW se encarrega de preencher isso ai com o Bean (Modelo q usei na action). Lembrando tem de ter os mesmo nome dos atributos

Jair_Rillo_Junior

Um exemplo bem simples do que você deseja.
Vamos supor que você tem o seguinte modelo (Java Bean)

public class MyModel implements Serializable {
    private Integer id;
    private String nome;
    // getters and setters

Você tem uma Action, chamada de TesteAction, que irá popular esse Modelo para ser apresentado na página JSP.

public class TesteAction extends ActionSupport {
    private MyModel myModel = new MyModel(); //olha o modelo aqui
    public String execute() throws Exception {
        myModel.setId(Integer.valueOf("1"));
        myModel.setNome("Junior");
        return SUCCESS;
    }
    public MyModel getMyModel() {
        return myModel;
    }
    public void setMyModel(MyModel myModel) {
        this.myModel = myModel;
    }
}

Nesse caso estou usando apenas os próprios gets e sets do modelo, mas você poderia usar o Model-Driven que irá refletir no mesmo efeito.
Na classe acima você NÃO vê eu jogando o modelo diretamente na Session ou no Request, o próprio Webwork faz isso pra você.
Depois no JSP, é só usar uma taglib

<%@taglib uri="webwork" prefix="ww"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'success.jsp' starting page</title>
  </head>  
  <body>
  	<ww:property value="myModel.nome"/>
  </body>
</html>

Bastante simples não :wink:

rvaldomiro

Uhuuuu agora sim sou um homem mais feliz!!! funfou legal…
ficou só uma questão em aberto:

Não é preguiça de criar várias actions e sim tentar padronizar minha aplicação :wink:

Valeuzão à todos!!! GUJ 10!!!

smota

Vc pode escolher 2 coisas:

  1. Colocar em uma só classe (ActionsUsuario) vários métodos (listar, salvar, excluir, etc.) e mapear no xwork.xml várias actions indicando qual o método que será executado assim não ficando preso ao execute().

  2. Mapear uma só classe para a action usuario por exemplo e chamá-la com usuario!metodo.action onde o metodo é que executará a ação não o execute.

qual das duas escolher? Depende! Os dois mantem as acoes relacionadas a um contexto na mesma classe mas o primeiro permite configuracoes diversas (interceptors & cia) enquanto o segundo nao.

Criado 29 de dezembro de 2004
Ultima resposta 29 de dez. de 2004
Respostas 13
Participantes 6