Galera,
estou com uma missão que não consigo resolver…tenho a seguinte metodo
minha lista
public ArrayList<Menu> select()throws Exception{
ArrayList<Menu> lista = new ArrayList<Menu>();
String sql = "select * from menu ";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
Menu menu = null;
while(rs.next()){
menu = new Menu();
menu.setId((rs.getInt("ID")));
menu.setNome((rs.getString("Nome")));
menu.setAction(rs.getString("Action"));
menu.setPai(rs.getInt("Pai"));
lista.add(menu);
}
rs.close();
return lista;
}
meu metodo para imprimir os dados
[code]public ArrayList organizarMenu ( List lista, int pai){
preciso montar da seguinte forma:
no meu banco tenho o ID| MENU| PAI
sempre que o pai for igual ao ID quer dizer que é um submenu, essa lógica já está feita no metodo acíma, porém preciso que imprima no formato html…que fique assim:
Agora estou usando apenas uma classe java para teste mesmo, pois preciso da lógica para imprimir nesse formato para estruturar um menu para utilizar depois no JSP.
Meu metodo já está imprimindo na ordem necessário porém preciso que imprima o script tbm.
Vou tentar explicar melhor minha consulta da forma que está imprimi assim:
id| menu| Pai
1 home 0
2 concessionário 0
3 FIat 2
4 UNO 3
5 GM 2
ou seja Home e Concessionário é menu pois a coluna PAI não é igual a nenhum ID
Fiat é um concessionário logo seu PAI é = 2 ( submenu de concessionário )
UNo é um carro da fiat, logo seu paí é igual a 3 ( submenu de Fiat )
GM é um concessionário logo seu PAI é = 2 ( submenu de concessionário )
etc…
Essa lógica já está criada dó que ele imprime assim.
home
concessionário
FIat
UNO
GM
só que preciso adicionar script de html na hora de imprimir preciso que esse seja impresso assim
[quote=FernandoCps]sim nel,
porém gostaria de visualizar isso ( aestrutura montada ) antes pelo System.out.println() nessa minha classe de teste antes de ir para o jsp.
acho que devo usar um condição if, mais não consegui achar a logíca certa ainda no metodo abaixo.
Possivelmente terá de usar alguma condição para montar a String. Mas não concatene String dentro de um for com o ‘+’, é muito ruim!
Não vou entrar em detalhes, mas use o StringBuffer ou o StringBuilder para montar tua saída e ao fim mande imprimir, para ver se fica como quer.
Caso não consiga, coloque seu algoritmo aqui que ajudamos você!
[quote=lineofgol]pq vc nao executa um select retornando as colunas que voce precisa
select id,nome,pai from tabela
[/quote]
Ao que eu entendi, ele já possui estes valores. O que ele simplesmente não está conseguindo é “edentar” esses valores em uma String no formato HTML como ele deseja.
private static StringBuilder toHtmlString(List<Menu> list, int pai){
StringBuilder result = new StringBuilder();
boolean exist = false;
for (Menu m:list){
if(m.getPai() == pai){
if (!exist){
result.append("<ul>");
exist = true;
}
result.append("<li>").append(m.getNome());
result.append(toHtmlString(list,m.getId()));
result.append("</li>");
}
}
if (exist){
result.append("</ul>");
}
return result;
}
Atenção que este forma é muito ineficiente, principalmente se a lista for grande. Nesse caso deves considerar utilizar outra estrutura que não um ArrayList após obter os dados da BD.
Atenção que este forma é muito ineficiente, principalmente se a lista for grande. Nesse caso deves considerar utilizar outra estrutura que não um ArrayList após obter os dados da BD.[/quote]
pmlm,
Acredito que isso vá funcionar porkém não estou conseguindo fazer o teste no meu metodo Main, estava usando assim.
Menu menu = new Menu();
MenuDao cdao = new MenuDao(conn);
ArrayList<Menu> lista = new ArrayList<Menu>();
lista = cdao.select(); // Aqui é o metodo que seleciona todos os dados do banco
cdao.organizaMenu(lista,0);
tendei um cdao.toHtmlString(lista,1); porém não está funcionando.
ele me retorna um erro: :56 le leva até o For do metodo.
Exception in thread "main" java.lang.StackOverFlowError
at java.util.AbstractList$Itr.next(Unknown Source)
at Metodos.Dao.Menu.Dao.ToHtmlString(MenuDao.java:56)
A minha lista que vem do banco tem exatamente só essas informações do seu exemplo…
com o seu exemplo funcionou, talvez o problema esteja na minha lista…vou ver se acho o erro.
Crie (o melhor seria depois que fizer a consulta, com o resultado dela), um conjunto com os níveis “pai”, esse conjunto, deverá conter dentro de cada posição, o nível pai e um outro conjunto, com os níveis filho dele. Dessa forma, você itera pelo conjunto pai, e os conjuntos filhos são os ítens de menu desse conjunto pai.