Dúvida VOFilter - Mentawai

15 respostas
ACDias

Olá estou estudando mentawai e estava lendo o material do site e me surgiu uma dúvida:

Se você estiver populando vários objetos ao mesmo tempo na mesma requisição e algum deles tiverem propriedades em comum (Ex: client.nome, empresa.nome) como o VOFilter vai poder diferenciá-los ? A resposta está em utilizar um prefixo junto com o VOFilter. Dessa maneira o seu VOFilter só vai pegar os parâmetros que possuem o prefixo e ignorar todos os outros. Na hora de injetar no objeto ele removerá o prefixo para obter o nome correto da propriedade. Dessa maneira nada impede de você popular dois objetos diferentes usando dois VOFilters na mesma requisição. Para setar o prefixo tudo que vc tem que fazer é passá-lo no construtor do VOFilter.
Como eu usaria esse prefixo? Como codifico isso?

15 Respostas

saoj

Dois objetos:

Pessoa (id, nome)

Amigo (id, nome)

Como o VOFilter vai saber qual id e qual nome é de qual?

<input name=“pessoa.id”>
<input name=“pessoa.nome”>

<input name=“amigo.id”>
<input name=“amigo.nome”>

Daí quando vc criar o VOFilter, vc passa o prefixo dele.

new VOFilter(“pessoa”, Pessoa.class, “pessoa”);

new VOFilter(“amigo”, Amigo.class, “amigo”);

Isso é muito mais simples do que parece. É apenas um prefixo para separar/organizar os parametros de forma que cada um possa ir para o seu correspondente VOFilter.

E quando vc tiver uma composição de objetos, ou seja, um objeto dentro de outro e ambos virão da requisição?

http://forum.mentaframework.org/posts/list/841.page

ACDias

Quando eu uso o prefixo obrigatoriamente eu devo colocar o nome do input com esse prefixo?

Eu criei o VOFilter desse maneira:
new VOFilter(“pessoa”, Pessoa.class, “pessoa”);

Quando eu vou instanciar pessoa e capturar os dados do form eu devo usar assim?

Pessoa pessoa = (Pessoa) input.getValue(pessoa);

ou assim?

Pessoa pessoa = (Pessoa) input.getValue(pacote.Pessoa);

Quando eu uso desse primeiro modo nenhum dado é capturado, quando uso do segundo modo a aplicação retorna nullPointerException.

Quando eu crio o VOFilter sem o prefixo assim:
new VOFilter(Pessoa.class);
eu consigo capturar os dados do form normalmente exceto os dados de um objeto endereço que tenho dentro de pessoa.

saoj

Vc tem que colocar o prefixo nos parametros do formulário:

<input name=“pessoa.nome”>

Já o nome do objeto no input será o nome que vc passar no VOFilter:

new VOFilter(“pessoa”, Pessoa.class, “pessoa”);

O último parametro acima é o prefixo e o primeiro é o nome do objeto que vc pegará do input.

Pessoa p = (Pessoa) input.getValue(“pessoa”);

O ideal é vc usar SEM prefixo, ou seja, new VOFilter(“pessoa”, Pessoa.class) e colocar os seus dados SEM prefixo no formulário.

<input name=“nome”>

O prefixo só é necessário quando vc tem dois VOFilters com atributos em comum, ou seja, vc precisa separar o nome de um do nome do outro.

<input name=“pessoa.nome”>
<input name=“amigo.nome”>

ACDias

Mas como eu faria pro VOFilter também filtrar os dados de um objeto que está dentro de pessoa? endereço por ex. Como devo nomear os inputs da minha página?

saoj

Não entendi a sua dúvida…

Se vc usa prefixo vc está’exatamente filtrando os parametros para o VO pessoa…

Reformule sua dúvida por favor.

ACDias

Minha classe pessoa tem um objeto endereco.

puclic class Pessoa{ private String nome; private Endereco end; . . . }Como eu devo nomear os inputs para que o VOFilter jogue os dados do formulário nesse objeto? Quando eu tentei os dados do formulário foram apenas para os outros atributos, esse objeto “end” ficou vazio.

saoj

Dá uma olhada aqui: http://forum.mentaframework.org/posts/list/841.page

Basicamente vc vai ter que ter dois VOs, um para Pessoa (pai) e outro para Endereço (filho).

E depois usar DI para colocar filho dentro de pai.

ACDias

Esse DIFilter só tem essa finalidade? Injetar um objeto filho no objeto pai? Ou ele pode ser usado em algum outro caso?

Obrigado pela ajuda.

saoj

DI é um conceito altamente difundido.

Também é conhecido por auto-wiring em alguns frameworks.

Um exemplo clássico é a dependencia de um DAO em uma conexão do DB ou session do hibernate.

Nesses casos vc seta um filtro global:

new DIFilter(“connection”, Connection.class);

ACDias

E se o meu objeto filho for um ArrayList? Vai mudar algo?

saoj

Vc pode fazer assim:

new DIFilter(“list”, List.class);

ou ainda

new DIFilter(“list”, Collection.class);

ACDias
Ainda restaram algumas dúvidas sobre alguns filtros: Como o InjectionFilter funciona? Eu li que quando ele é usado não é necessário usar o input para capturar os dados na action. Quando ele é usado não é necessário o uso do VOFilter? Eu vi em um exemplo de Injection que os atributos que estariam na classe Pessoa por exemplo foram para a classe da action, não tem como deixar a classe Pessoa intacta e ainda usar o InjectionFilter? Antes havia uma classe pessoa, nesse ex os atributos de pessoa foram pra action
public class HelloInjection extends BaseAction {
    
    private String username = null;
...
   public String execute() throws Exception {
      return SUCCESS;
   }
}
Qual dos dois filtros é mais indicado que eu use? E o ioc? Quando devo usá-lo? Li sobre ele no FAQ, mas não entendi muito bem como usá-lo.
saoj

O InjectionFilter pega os dados do input e tenta injetar na action (ou no modelo em caso de ModelDriven action).

O VOFilter não tem nada haver com o InjectionFilter.

Veja bem: se o VOFilter colocar um objeto Pessoa no input, o InjectionFilter vai tentar injetar esse objeto Pessoa na action.

Quanto a IOC, há uma explicação bem clara e objetiva no FAQ. O que vc não entendeu?

ACDias

Eu já havia lido o faq e entendi como o ioc funciona, só gostaria de saber uma aplicação prática para o seu uso, porque em um primeiro momento não consegui ver.

Quanto ao InjectionFilter também gostaria de uma aplicação de seu uso, porque vi que ele pode substituir o VOFilter, porém ao meu ver o código fica mais legível com o VOFilter.

saoj

O InjectionFilter não deve substituir o VOFilter porque são coisas totalmente diferentes, para propósitos diferentes.

VOFilter cria um objeto, popula e coloca no input.

InjectionFilter pega tudo que está no input e injeta na action.

Na uma olhada no código do MyBooks para um exemplo prático de IOC e DI.

Criado 27 de janeiro de 2007
Ultima resposta 29 de jan. de 2007
Respostas 15
Participantes 2