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());
}
}O exemplo abaixo mostra o melhor jeito de ler grupos de checkbox do seu form.
<html>
<form action="person.add.logic" method="get">
Name: <input name="person.name"/> <br/>
Interests: <br/>
<input type="checkbox" name="interests" value="friends">Friends</input><br/>
<input type="checkbox" name="interests" value="work">Work</input><br/>
<input type="checkbox" name="interests" value="relationship">Relationship</input><br/>
<input type="submit" />
</form>
</html>@Component
public class PersonLogic {
@Parameter
private Person person = new Person();
@Parameter(key="interests")
private String[] interests;
public void add() {
System.out.println("Adding " + person.getName() + " interested on "
+ Arrays.asList(interests));
}
}Infelizmente você não pode usar isso com caminhos ainda, então o nome do parâmetro não poderia ser person.interests>> mesmo se a classe Person tivesse um atributo <<<String[] interests.
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!