O objetivo do filtro org.mentawai.filter.VOFilter (Value-Object Filter) é popular um objeto com os valores presentes no input da action. Isso pode ser útil na hora de manipular os dados de um formulário já que ao invés de fornecer para sua action um monte de parâmetros soltos, você pode entregar um objeto populado com os dados. Esse objeto não precisa estender nenhuma classe do Mentawai em específico e é apenas um objeto como outro qualquer (POJO).
O funcionamento do VOFilter se resume em tentar injetar todos os parâmetros do input da action num objeto recém-criado via reflection. Ele também é capaz de injetar um valor diretamente num campo público ou privado. A regra é: primeiro tente através de um setter (setUsername, setFirstName, etc.). Se não funcionar tente injetar diretamente no campo (username, firstName, etc.) mesmo que esse campo seja privado.
Coisas que você deve notar sobre o VOFilter:
import org.mentawai.core.*; import org.mentawai.filter.*; public class ApplicationManager extends org.mentawai.core.ApplicationManager { public void loadActions() { ActionConfig ac = new ActionConfig("/Hello", HelloVOFilter.class); ac.addConsequence(SUCCESS, fwd("/show.jsp")); ac.addConsequence(ERROR, fwd("/user.jsp")); addActionConfig(ac); ac.addFilter(new VOFilter(User.class)); // populate a User object and place it in the action input with "org.myprof.User" key // or ac.addFilter(new VOFilter(User.class, "user")); // populate a User object and place it in the action input with "user" key // or ac.addFilter(new VOFilter(User.class, "user", true)); // populate a User object and place it in the action input with "user" key // also try to inject directly into the fields, public or private } }
O org.mentawai.filter.OVFilter (Object-Value filter) faz exatemento o oposto do VOFilter. Ele procura por um objeto no output da action e tenta extrair todas as suas propriedades e colocá-las no output da action. Esse procedimento é bastante útil quando você precisa exibir todas as propriedades de um objeto dentro de um formulário html, por exemplo. Consulte a seção Tags de HTML para entender como o Mentawai pode exibir os valores do output da action automaticamente dentro do seu formulário web, sem que você precisa escrever uma linha de código para tal.
Coisas que você deve notar sobre o OVFilter:
import org.mentawai.core.*; import org.mentawai.filter.*; public class ApplicationManager extends org.mentawai.core.ApplicationManager { public void loadActions() { ActionConfig ac = new ActionConfig("/Hello", HelloOVFilter.class); ac.addConsequence(SUCCESS, fwd("/show.jsp")); ac.addConsequence(ERROR, fwd("/user.jsp")); addActionConfig(ac); ac.addFilter(new OVFilter("user")); // look for an object with the "user" key in the action output and extract its properties // placing them in the action output. } }
Da mesma maneira que nós temos o VOFilter e OVFilter, o Mentawai também oferece o InjectionFilter e OutputFilter. Eles se comportam da mesma maneira exceto que o InjectionFilter tenta injetar os valores do input da action diretamente na action e não num objeto qualquer. O OutputFilter por sua vez tentará pegar todas as propriedades da action e colocá-las no output da action.
Você pode utilizar o InjectionFilter e o OutputFilter para não ter que utilizar o input e o output dentro das suas actions.
Note que o Injection/Output Filter possuem um papel fundamental quando temos um design model-driven para nossas actions. Em outras palavras, o InjectionFilter irá detectar que a action implementa a interface ModelDriven e vai injetar os valores do input não diretamente na action mais no modelo retornado pelo método getModel(). Mesma coisa acontecerá com o OutputFilter que pegará as propriedades diretamente do modelo e não da action.