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.
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.
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.
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>