Author |
Message |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/04/2007 17:05:33
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
Você pode utilizar o DBListData. Veja como é fácil:
Se as suas listas estão internacionalizadas no seu banco de dados, você provavelmente tem uma tabela mais ou menos assim:
Nome da Tabela: Genders
Campos:
ID, VALUE, LOCALE
m, Masculino, pt_BR
f, Feminino, pt_BR
m, Man, en_US
f, Woman, en_US
Então tudo que vc deve fazer é:
Code:
DBListData list = new DBListData("genders", "ID", "VALUE", "LOCALE", "Genders", "VALUE");
// genders = nome da lista
// ID = nome da coluna do BD com o id (chave) do item da lista
// VALUE = nome da coluna do BD com o valor do item da lista
// LOCALE = nome da coluna do BD com o locale do item da lista
// Genders = nome da tabela do BD onde a lista está armazenada
// VALUE = coluna que será usada para ordenação (order by)
// aqui vc pega a conexao do pool do mentawai ou da maneira que vc estiver fazendo...
Connection conn = ...
list.load(conn); // carrega todas as listas...
ListManager.addList(list);
A query produzida será:
select ID,VALUE,LOCALE from Genders order by VALUE;
Vamos supor que vc não esteja trabalhando com internacionalização, então a sua tabela provavelmente estará assim:
Nome da Tabela: Genders
Campos:
ID, VALUE
m, Masculino
f, Feminino
Então tudo que vc precisa fazer é:
Code:
DBListData list = new DBListData("genders", "ID", "VALUE", "Genders", "VALUE");
// genders = Nome da lista do mentawai
// ID = nome da coluna do BD com o id (chave) do item da lista
// VALUE = nome da coluna do BD com o valor do item da lista
// Genders = nome da tabela do BD onde a lista está armazenada
// VALUE = coluna que será usada para ordenação (order by)
// aqui vc pega a conexao do pool do mentawai ou da maneira que vc estiver fazendo...
Connection conn = ...
list.load(conn); // carrega todas as listas...
ListManager.addList(list);
Agora vamos supor que no seu banco de dados, a coluna locale esteja indexada por ids e não pelo nome do locale:
Nome da Tabela: Genders
Campos:
ID, VALUE, LOCALE
m, Masculino, 1
f, Feminino, 1
m, Man, 2
f, Woman, 2
Tudo que vc tem que fazer nesse caso é herdar DBListData e sobrescrever o método getLocaleFromString(loc), ou seja, basicamente, vc precisa fazer um mapping de 1 para "pt_BR" e de 2 para "en_US".
A implementação default do método é:
Code:
protected Locale getLocaleFromString(String loc) {
return new Locale(loc);
}
|
Sergio Oliveira
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/10/2007 19:49:32
|
saoj
Joined: 01/07/2005 09:59:17
Messages: 2846
Location: Rio de Janeiro, RJ
Offline
|
Mais uma explicação do Leiber:
Vou te mostrar como eu uso ok.
ApplicationManager
Code:
public class ApplicationManager extends import org.mentawai.core.ApplicationManager {
ListData listData; //Para listas em arquivos
DBListData dbListData; //Para Listas no banco de dados
public void init(Context application) {/*BLA BLA BLA*/}
public void loadActions() {/*BLA BLA BLA*/}
//Listas defaults pra todos tanto do arquivos lists quando do BD
public void loadLists() throws IOException {
//LISTA SIMPLES EM ARQUIVO (SEXO)
listData = new BaseListData("gender", BaseListData.ORDER_BY_ID);
ListManager.addList(listData);
// LISTA DO BANCO DE DADOS DEFAULT PRA TODOS
// 1 = name of list
// 2 = name of column - id (key)
// 3 = name of column - value of key
// 4 = name of table on the DB
// 5 = ORDER BY ? column
// COUNTRYS (PAISES)
dbListData = new DBListData("country", "paicod", "painom", "pais", "painom");
try{
dbListData.load(sessionFactory.openSession().connection());
} catch(SQLException e){}
ListManager.addList(dbListData);
}
}
Eu tenho um Serviço só pra cuidar dos combos "dinâmicos" e neste eu recebo os campos que eu passo da action ID, TABELA ETC, inclusive o WHERE nem preciso dizer seu uso correto, se eu nao quizer dar um WHERE passo NULL ou... posso por exemplo deixar como default um WHERE 1=1.
MinhaAction
Code:
public class MinhaAction {
public String meuMetodo() throws Exception {
DBListData dbListData = dbListDataService.newListData("QualSeráONomeDaLista", "QualOValueDoOption", "OQueIráNoTextoDoOption", "EmQueTabelaBuscar", "OrderBy?", "WhereOqueIgualOQue?" );
ListManager.addList(dbListData); //Adicionei a lista.
}
}
Omiti algumas coisas como GROUP de usuario que eu PASSO TB, pego na action e passo a lista de GRUPOS daquele usuario e dentro do service eu MONTO o WHERE de acordo com o GRUPO. Se vc quizer fazer o mesmo pros grupos, basta receber a lista de grupos daquele usuário (List groups = BaseLoginAction.getUserGroups(session) e passar como "variavel" também pro service e no service vc fazer suas "validações". Entendeu ?
Minha Interface DBListService
Code:
public interface DBListService {
DBListData newListData(String listName, String columnId, String columnName, String table, String orderBy, String sqlWhere) throws Exception;
}
Minha Classe que implementa a interface DBListService
Code:
public class DBListServiceImpl implements DBListService {
public DBListData newListData(String listName, String columnId, String columnName, String table, String orderBy, String sqlWhere) throws Exception {
if (meuDAO == null) throw new IllegalStateException(MSG);
return meuDAO.newListData(listName, columnId, columnName, table, orderBy, sqlWhere);
}
}
Eu to usando Hibernate Annotations / Generics OK. Então tenho:
A Interface BaseDAO
Code:
public interface BaseDAO<T, PK extends Serializable> {
//OUTROS METODOS OMITIDOS
DBListData newListData(String listName, String columnId, String
columnName, String table, String orderBy, String sqlWhere) throws HibernateException, SQLException;
}
A Classe BaseDAOImpl que implementa BaseDAO
Code:
public abstract class BaseDAOImpl<T, PK extends Serializable> implements BaseDAO<T,PK> {
//OUTROS METODOS OMITIDOS
public DBListData newListData(String listName, String columnId, String columnName, String table, String orderBy, String sqlWhere) throws HibernateException, SQLException {
DBListData dbListData = new DBListData(listName, columnId, columnName, table, orderBy);
if (sqlWhere!=null) dbListData.setWhere(sqlWhere);
dbListData.load(conn.connection());
return dbListData;
}
}
Acho que é isso ai...
|
Sergio Oliveira
|
|
 |
|
|
|