Preenchendo caixas de seleção

Um trabalho comum na vida do programador é preencher caixas de seleção com valores possíveis.

Use o conceito da fábrica para resolver esse problema.

  1. Escreva uma fábrica que retorna uma coleção de elementos que você quer usar para preencher a sua caixa.
  2. Escreva um interceptador que crie a fábrica
  3. Escreve a lógica que implementa o interceptador
  4. Use a fábrica no view

A fábrica

Vamos escrever uma classe que é responsável por criar valores que são usados na aplicação web.

package org.vraptor.example.factory;

public class Factory {
    
    private enum Sizes{MIN,MEDIUM,BIG,HUGE}; 
    
    public Sizes[] getSizes() {
                return Sizes.values();
    }
}

Aqui nós usamos uma enumeração e devolvemos os valores dela. Normalmente uma fábrica teria muito mais métodos.

Interceptador

O interceptador vai criar a fábrica e ejetar ela ao escopo da requisição.

package org.vraptor.example.factory;

public class FactoryInterceptor implements Interceptor {

    @Out
    private Factory factory;
    
    public void intercept(LogicFlow flow) throws LogicException, ViewException {
                this.factory = new Factory();
                flow.execute();
    }
}

Você também poderia passar no construtor da fábrica uma conexão ou hibernate session para acessar o banco de dados.

Lógica

Nessa lógica implementa o interceptador FactoryInterceptor. Isso garante que a fábrica será criada e ejetada ao request.

@Component
@InterceptedBy(FactoryInterceptor.class)
public class PersonLogic {

    public void add() {
                System.out.println("do something");
    }
}

Camada de apresentação

Se você acessar person.add.logic, você será direcionado á página person/add.ok.jsp.

O jsp final poderia ser:

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

Size:
        <select name="size">

                <c:forEach items="${factory.sizes}" var="size">
                        <option name="${size}">${size}</option>
                </c:forEach>

        </select>
</html>