Para ler os parâmetros você deve usar os parâmetros do método ou a anotação @Parameter.
O exemplo seguinte ilustra como ler propriedades simples na sua lógica de negócios.
<html> <form action="person.add.logic" method="get"> Nome: <input name="name"/><br/> Endereçãoo: <input name="address"/><br/> Numero prefirido: <input name="preferredNumber"/><br/> <input type="submit"/> </form> </html>
package org.vraptor.examples.first; @Component public class PersonLogic { @Parameter private String name, address; @Parameter private int preferredNumber; public void add() { System.out.printf("Adding %s, %s, %d to the database!%n", name, address, preferredNumber); } }
VRaptor vai preencher as suas variáveis na classe com os valores dos parâmetros name, address and preferredNumber.
O jeito descrito acima fica bem complexo se nós teremos preencher muitos valores. Mais fácil seria criar uma variável Person e trabalha em cima dela usando o caminho como:
person.name, person.address and person.preferredNumber
<html> <form action="person.add.logic" method="get"> Nome: <input name="person.name"/><br/> Enderçãoo: <input name="person.address"/><br/> Numero prefirido: <input name="person.preferredNumber"/><br/> <input type="submit"/> </form> </html>
Você pode usar injeção de parâmetros e receber os dados através do seu método:
@Component public class PersonLogic { public void add(Person p) { System.out.println("Adding ", p.getName()); } }
Note que o VRaptor usa o nome do tipo com a primeira letra em minúsculo: person e não o nome da variável p.
Ou podemos usar a anotação @Parameter na lógica. O mesmo exemplo com @Parameter seria:
@Component public class PersonLogic { @Parameter private Person person = new Person(); public void add() { System.out.println("Adding ", person.getName()); } }
A maioria dos frameworks têm problemas se precisarem preencher uma lista com POJO's. O exemplo seguinte mostra como simular esse problema num framework diferente, enquanto uma solução elegante será mostrado na seqüência.
<html> <form action="person.add.logic" method="get"> Nome: <input name="persons[0].name"/><br/> Endereçãoo: <input name="persons[0].address"/><br/> Numero prefirido: <input name="persons[0].preferredNumber"/><br/> <br/> Nome: <input name="persons[1].name"/><br/> Endereçãoo: <input name="persons[1].address"/><br/> Numero prefirido: <input name="persons[1].preferredNumber"/><br/> <br/> <input type="submit"/> </form> </html>
@Component public class PersonLogic { @Parameter private List<Person> persons; public PersonLogic() { // feio .... tenta evitar ... persons = new ArrayList(Person); persons.add(new Person()); persons.add(new Person()); } public void add() { System.out.printf("Adding %s", persons.toString()); } }
Para resolver o problema precisamos avisar o VRaptor que ele deve criar os objetos necessários dinamicamente para preencher os valores da requisição ...
Nota: VRaptor usa ArrayList e Set interno como implementação padrão por List e Set.
@Component public class PersonLogic { @Parameter(create=true) private List<Person> persons; public void add() { System.out.printf("Adding %s", persons.toString()); } }
Você viu? Tem nada feio no nosso código acima ... se for necessário os objetos serão criados.
Aqui você pode ler o tutorial inteiro como ler as parâmetros da requisição.
Mas cuidado quando você usa create=true para não oferecer setters demais na requisição!