Java: Utilizando DropDownChoice do Wicket associado a um Map

Wicket

Um dia desses precisei de mudar uma página (WebPage) para que permitisse persistir um atributo simples em uma entidade. Primeiramente pensei em usar um Enum, porém estou usando persistência JPA com Hibernate, e fiquei com receio da forma como o Hibernate iria manipular esse Enum ao fazer buscas ou coisas mais complicadas. Então decidi criar um atributo do tipo Integer e setar nele uma constante.

Este é um exemplo de código usando um Map para exibir uma lista de opções (DropDownChoice) no Wicket para persistir uma constante (Integer) em uma entidade.

Código da entidade ControlSerum onde vamos persistir o atributo status:

[sourcecode language=”java”]
@Entity
public class ControlSerum {
private Integer status;

public final static int STATUS_PREP = 0;
public final static int STATUS_ACTIVE = 1;
public final static int STATUS_INACTIVE = 2;
private final static Map<Integer, String> statusMap = new HashMap<Integer, String>();

static{
statusMap.put(STATUS_PREP, "Em preparo");
statusMap.put(STATUS_ACTIVE, "Ativo");
statusMap.put(STATUS_INACTIVE, "Inativo");
}

@Column(nullable=false)
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}

@Transient
public static Map<Integer, String> getStatusMap(){
return new HashMap<Integer, String>(statusMap);
}
}
[/sourcecode]

Na classe da página ControlSerumEditPage, implementei um IChoiceRenderer para renderizar corretamente as opções do select, utilizando a chave do Map como sendo o valor a ser submetido pelo option e o valor do Map como sendo o nome para exibição do option.

Trecho de código do construtor da classe ControlSerumEditPage onde é instanciado e adicionado ao Form, um renderizador para o DropDownChoice:

[sourcecode language=”java” firstline=”66″]
IChoiceRenderer choicesRenderer = new IChoiceRenderer() {
@Override
public String getDisplayValue(Integer object) {
return ControlSerum.getStatusMap().get(object);
}
@Override
public String getIdValue(Integer object, int index) {
return object.toString();
}
};

IModel optionsModel = new Model(){
@Override
public Serializable getObject() {
return new ArrayList(ControlSerum.getStatusMap().keySet());
}
};

IModel statusModel = new PropertyModel<Integer>(controlSerum, "status");

DropDownChoice<Integer> status = new DropDownChoice<Integer>("status", statusModel, optionsModel, choicesRenderer);
form.add(status);
[/sourcecode]

Para baixar o código completo desta aplicação (ainda em desenvolvimento):
http://github.com/ziglee/biomedcalib

Façam seus comentários e envie quaisquer dúvidas que prontamente responderei.

Fonte: Cassio Landim’s Blog


2 Comentários

Lazaro
1

Cara. Estou começando a usar o wicket. COmo é a sua experiencia com esse framework? Ele já é bem aceito no mercado. Seria um diferencial na hora de arrumaar um emprego de programador pleno? Pq eu sou Junior
Valew

Cássio Landim
2

Olha Lazaro, eu já fiz um projeto usando JPA (Hibernate), Wicket e Spring.
Minha impressão deste framework é que se projeto realmente já começa num ritmo acelerado, porque ele não necessita de muita configuração!
Achei ele bem fácil de se utilizar, exceto a utilização dos Models que ainda me confunde um pouco.
Extremamente orientado a objetos e permite manter o código bem legível, sem código de lógica nas páginas html.
Com relação ao mercado de trabalho eu não tenho visto vagas que solicitam conhecimentos sobre Wicket até o momento. Somente fora do Brasil que eu tenho visto algumas vagas.

Deixe seu comentário

Seu endereço de e-mail não será publicado. Campos com * são obrigatórios!