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>