Lendo as parâmetros da requisição

Para ler os parâmetros você deve usar os parâmetros do método ou a anotação @Parameter.

Lendo propriedades simples

O exemplo seguinte ilustra como ler propriedades simples na sua lógica de negócios.

  1. html
    <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>
  2. Logic
    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.

Usando o caminho para preencher POJOs

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

  1. html
    <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>
  2. Logic

    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());
            }
    
    }

Usando caminhos para preencher Lists/Arrays/Sets (o problema)

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());
        }

}

Usando o caminho para preencher Lists/Arrays/Sets dinamicamente (a solução)

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!