Lendo a lista de requisição

O desafio principal, que nos enfrentamos com frameworks https, é o tratamento das coleções de objetos que nos queremos ler ...

O que nos poderemos fazer se tivermos um formulário com vários campos para inserir endereços diferentes e a nossa lógica de negócios não souber quantos realmente foram preenchidos?

O código seguinte apresenta um formulário onde o usuário pode adicionar informações, e a lógica de negócios deveria ler essas informações.

Mas vamos supor que a lógica não sabe quantas pessoas chegarão ... isso significa na verdade, que queremos ler uma lista das pessoas.

O formulário para as duas pessoas:

<html>

<form action="person.newList.logic" method="get">

    Nome: <input name="people[0].name"/><br/>
    Endereço: <input name="people[0].address"/><br/>
    Numero preferido: <input name="people[0].preferredNumber"/><br/>
        <br/>
        
    Nome: <input name="people[1].name"/><br/>
    Endereço: <input name="people[1].address"/><br/>
    Numero preferido: <input name="people[1].preferredNumber"/><br/>
                
        <input type="submit"/>

</form>

</html>

Presta atenção que nós indexamos o formulário como se fosse um simples array: people[0].name, people[1].name etc.

A lógica de negócios

O que nos deveríamos fazer para que a lógica possa ler duas ou mais pessoas?

É simples, vamos criar uma lista de pessoas chamada people e usar a anotação @Parameter para criar os objetos necessários:

package org.vraptor.examples.list;

import java.util.List;

import org.vraptor.annotations.Component;
import org.vraptor.annotations.Logic;
import org.vraptor.annotations.Out;
import org.vraptor.annotations.Parameter;
import org.vraptor.examples.first.Person;

@Component("person")
public class PersonListLogic {

        @Parameter(create = true)
        private List<Person> people;

        public void newList() {
                System.out.printf("Adding %s to the database!%n", people.toString());
        }

        public List<Person> getPeople() {
                return this.people;
        }
}

Adivinha o que aconteceu? VRaptor criou uma lista, como uma simples ArrayList, com todas as pessoas requeridas pelos parâmetros da requisição e as adicionou na lista. O Vraptor usa o parâmetro genérico Person para descobrir qual POJO será criado na lista.

java.util.Set e Person[] também funcionam bem.

Finalizando o exemplo

Crie o arquivo person/newList.ok.jsp para mostrar o resultado:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>

<c:forEach var="person" items="${people}">
        <li> ${person.name} mora em ${person.address} e numero preferido ${person.preferredNumber}</li><br/>
</c:forEach>

</html>

Se você não usa jstl core tag library tente por exemplo $people.

Exemplo do formulário dinâmico

O código seguinte é um formulário dinâmico que é parecido com o que nós já tínhamos visto no exemplo anterior ...

A diferença é que usaremos javascipt para permitir o usuário adicionar quantas pessoas quiser:

<html>

<script language="javascript">

        var last = 0;
        
        function create() {
                last++;
        dynamic_form.innerHTML += base_form.innerHTML.replace(/[[0]]/g, last + "]");
        }

</script>

<form action="person.newList.logic" method="get">

        <div id="base_form">
        
        Nome: <input name="people[0].name"/><br/>
        Endereço: <input name="people[0].address"/><br/>
        Numero preferido: <input name="people[0].preferredNumber"/><br/>
        <hr/>
        
        </div>
        
        <div id="dynamic_form">
        </div>

        <a href="javascript:create();">New entry</a><br/>
        <br/>
                
        <input type="submit"/>

</form>

</html>