Mentawai Web Framework

Lista de Dados

Uma aplicação web pode possuir diversas listas de dados estáticas, que são exibidas por páginas JSP. Por exemplo, um lista de estados, uma lista de categorias, uma lista de métodos de pagamento aceitos, etc.

No Mentawai, uma lista de dados é apenas um arquivo i18n que é carregado e controlado automaticamente pra você. O Mentawai também cuida da ordenação, assim você não precisa perder tempo implementando essas tarefas chatas. Você pode clicar aqui para baixar um arquivo WAR de uma aplicação de exemplo que mostra o uso das data lists.

Por padrão, o Mentawai verifica o diretório /lists e carrega todos os arquivos i18n que ali se encontram como listas. Por convenção, o nome da lista será o nome do arquivo i18n. A ordenação padrão é feita pelo valor dos elementos da lista, e não pela chave. Veremos mais adiante como alterar as convenções do Mentawai, caso isso seja necessário.

Após o carregamento das listas pelo controlador do Mentawai (quando o site se inicia), você pode usar a classe org.mentawai.list.ListManager para acessar estas lists de maneira fácil e sem enrolações. As listas retornadas pelo ListManager.getList() são objetos da classe org.mentawai.list.ListData e que possuem métodos bastante úteis para retornar os itens da lista. Os itens de uma lista são objetos da classe org.mentawai.list.ListDataItem e possuem apenas os métodos getId() e getValue().

Um trecho de código explicará isso melhor:

					
	ListData list = ListManager.getList("genders"); // return a ListData with the name "genders"
	
	// A ListData object will contain a list for each supported locale...
	// Therefore to fetch the list you must specify a locale...
	List<ListItem> items = list.getValues(LocaleManager.getDefaultLocale());
	
	Iterator<ListItem> iter = items.iterator();
	
	while(iter.hasNext()) {
	
		ListItem item = iter.next();
		
		System.out.println("ID: " + item.getKey());
		
		System.out.println("VALUE: " + item.getValue());
	}
			

Uma ListData tem na verdade uma lista diferente para cada locale suportado pela aplicação web. É por isso que, para pegar a lista de itens (ListDataItems), você precisa chamar o método getValues(locale) com o locale da lista que você deseja, pois para cada locale há uma lista dentro do ListData. Abaixo mostramos a interface ListData:

package org.mentawai.list;

import java.util.*;

public interface ListData {
	
	public String getValue(int id, Locale loc);
	public List getValues(Locale loc);
	public String getName();
	public int size();
	
}
	

Os arquivos genders_loc.i18n (onde loc é o locale/idioma) devem estar dentro do diretório /lists da raiz. Veremos mais adiante como mudar este diretório padrão.

###################################
# File: /lists/genders_en_US.i18n #
###################################

1 = Male
2 = Female
		

Note que a chave para cada valor deve ser um número (índice), e não uma string.



Select Tag para combo boxes

Como você deve ter notado, listas de dados combinam perfeitamente com combo boxes de um formulário HTML. O Mentawai fornece a tag <mtw:select> para exibir uma lista de dados em uma combo box de maneira bem simples. O arquivo JSP abaixo mostra o uso da tag <mtw:select>:

<%@ taglib uri="/WEB-INF/tags/mentawai.tld" prefix="mtw" %>
<html>
<body>
<h1>Hello Data List!</h1>
<form action="HelloMentawai.mtw" method="post">
Type your username: <input name="fullname" size="25" />
Your gender: <mtw:select name="gender" list="genders" />
<input type="submit" value="Send Now">
</form>
</body>
</html>
	


Mais Controle

Você pode alterar o comportamento padrão do ListManager no método loadLists() da sua classe ApplicationManager. Por exemplo, você pode querer ordenar a sua lista de dados por ID ao invés de por valor, que é o padrão. Você também pode querer carregar uma lista de algum outro lugar, por exemplo de um banco de dados. E você ainda pode querer alterar o diretório /lists padrão para algum outro. O código abaixo dará uma idéia a você de como fazer isso:

public class ApplicationManager extends org.mentawai.core.ApplicationManager {
	
	public void loadActions() {
		// ...
	}
	
	public void loadLocales() {
		// ...
	}
	
	public void loadLists() throws IOException {
		ListManager.setListDir("/mylists");
		ListManager.init(); // load lists in /mylists
		
		ListData genders = new BaseListData("genders", BaseListData.ORDER_BY_ID);
		ListManager.addList(genders);
		
		ListData states = new BaseListData("states", BaseListData.ORDER_BY_VALUE, "/states");
		ListManager.addList(states);
	}
}
	

Você ainda pode querer implementar a interface org.mentawai.list.ListData para criar seus próprios tipos de data lists.