Resultado de lista em várias páginas

23 respostas
101574

Boa tarde Galera,

Estou desenvolvendo um projeto com vraptor, e fiz um menu dinâmico.

Eu tenho as classes.

Sistemas
Módulos
Rotinas.

Cada Sistema contém vários Módulos.
Cada Módulo Contém várias Rotinas.

Implementei usando hibernate, vraptor.

Fiz um for para listar todos eles, e coloquei alguns if para listar somente os módulos do sistemas e assim sucessivamente.

Mas não está funcionando.
Quando eu abro a tela de listar sistemas, ele lista somente os sistemas. E nas demais ele não lista nada.
Como eu resolvo isso?

Grato.

23 Respostas

Rafael_Guerreiro

Está acontecendo algum erro?
Qual erro está acontecendo?
Como está o código na parte que não está funcionando?

101574

Não está dando erro algum.

Eu fiz o código do menu.
<div id="menuprincipal">
<ul >
	<li ><a >Home</a></li>
	<li><a >Empresa</a>
	</li>
		<li><a >Sistemas</a>
		<ul>
		&lt;c:forEach items="${sistemasList}" var="sistemas"&gt;
			<li><a >${sistemas.nome}</a>
				<ul>
				&lt;c:forEach items="${modulosList}" var="modulos"&gt;
				   &lt;c:if test="${sistemas.id == modulos.sistemas_id}"&gt;  
                <li> <a >${modulos.nome}</a>
					<ul>
				&lt;c:forEach items="${rotinasList}" var="rotinas"&gt;
				   &lt;c:if test="${sistemas.id == rotinas.sistemas_id}"&gt;  
					   &lt;c:if test="${modulos.id == rotinas.modulos_id}"&gt;  
				 <li><a >${rotinas.nome}</a></li>
				&lt;/c:if&gt; 
                &lt;/c:if&gt; 
                &lt;/c:forEach&gt;
                </ul></li>
                &lt;/c:if&gt;  
                &lt;/c:forEach&gt;
                </ul>
                &lt;/c:forEach&gt;
                </li>
				</ul>
				</li>
				<li><a >Produtos</a></li>
				<li><a >Serviços</a></li>
				<li><a >Suporte</a></li>
				<li><a >Adquirir</a></li>
				<li><a href="https://webmail.softsol.com.br/">Web E-mail</a></li>
				<li><a href="https://sac.softsol.com.br/">Documentação</a>
				</li>
			<li><a href="http://www.softsol.com.br/?link=faq">Dúvidas</a></li>
			<li><a href="http://www.softsol.com.br/?link=falecom">Contato</a></li>
		</ul>
&lt;/div&gt;
Eu coloquei ele no arquivo header.jspf Para aparecer em todas as páginas. Está aparecendo. Mais o menu sistemas, não abre. Quando eu abro uma página que lista os sistemas, ele abre pra mim somente os sistemas. E como a gente pode ver, além dos sistemas eu tenho módulos e rotinas. E so abre quando eu listo os sistemas.

Não entendi porque isso.
Tem alguma solução?

Rafael_Guerreiro

Pode me mostrar as classes Sistemas, Modulos e Rotinas?

Por colocar no Header, vc precisa colocar o result.include(‘sistemas’, sistemas); em um interceptor para que ele coloque isso na tela o tempo todo para vc. não basta colocar uma vez.

101574

Aqui estão.

Sistemas.java

@Entity
public class Sistemas {
	@Id
	@GeneratedValue
	private long id;
	private String nome;
	private String ativo;
	private String url;
	private String imagem;
	@OneToMany(mappedBy = "sistemas",targetEntity= Modulos.class,
	fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List&lt;Modulos&gt;modulos;
	@OneToMany(mappedBy = "sistemas2",targetEntity= Rotinas.class,
	fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List&lt;Rotinas&gt;rotinas;

	//Métodos get e set
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getAtivo() {
		return ativo;
	}
	public void setAtivo(String ativo) {
		this.ativo = ativo;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getImagem() {
		return imagem;
	}
	public List&lt;Rotinas&gt; getRotinas() {
		return rotinas;
	}
	public void setRotinas(List&lt;Rotinas&gt; rotinas) {
		this.rotinas = rotinas;
	}
	public void setImagem(String imagem) {
		this.imagem = imagem;
	}
	public List&lt;Modulos&gt; getModulos() {
		return modulos;
	}
	public void setModulos(List&lt;Modulos&gt; modulos) {
		this.modulos = modulos;
	}
	
}

Módulos.java

@Entity
public class Modulos {
	@Id
	@GeneratedValue
	private long id;
	private String nome;
	private String ativo;
	private String url;
	private String imagem;
	
	//Relacionamento com Rotinas
	@OneToMany(mappedBy = "modulos",targetEntity = Rotinas.class,
	fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	private List&lt;Rotinas&gt;rotinas;
	
	//Relacionamento com Sistemas
	@ManyToOne
	@JoinColumn(name="sistemas_id")
	private Sistemas sistemas;
	
	
	
	
	//Métodos get e set
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getAtivo() {
		return ativo;
	}

	public void setAtivo(String ativo) {
		this.ativo = ativo;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getImagem() {
		return imagem;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}

	public Sistemas getSistemas() {
		return sistemas;
	}

	public void setSistemas(Sistemas sistemas) {
		this.sistemas = sistemas;
	}
	public List&lt;Rotinas&gt; getRotinas() {
		return rotinas;
	}

	public void setRotinas(List&lt;Rotinas&gt; rotinas) {
		this.rotinas = rotinas;
	}
	
	}

rotinas.java

@Entity
public class Rotinas {
	@Id
	@GeneratedValue
	private long id;
	private String nome;
	private String ativo;
	private String url;
	private String imagem;
	//Relacionamento com Modulos
	@ManyToOne
	@JoinColumn(name="modulos_id")
	private Modulos modulos;
	
	//Relacionamento com Sistemas
	@ManyToOne
	@JoinColumn(name="sistemas_id")
	private Sistemas sistemas2;
	
	public Sistemas getSistemas2() {
		return sistemas2;
	}

	public void setSistemas2(Sistemas sistemas2) {
		this.sistemas2 = sistemas2;
	}

	//Métodos get e set
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getAtivo() {
		return ativo;
	}

	public void setAtivo(String ativo) {
		this.ativo = ativo;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getImagem() {
		return imagem;
	}

	public void setImagem(String imagem) {
		this.imagem = imagem;
	}

	public Modulos getModulos() {
		return modulos;
	}

	public void setModulos(Modulos modulos) {
		this.modulos = modulos;
	}

	
	}

Tem ainda a controller e dao de cada.
Se precisar, avisa.

Agora,

Não entendi bem.

Rafael_Guerreiro

Caraca, mas que relacionamento complicado, ruim isso…

Por que um Sistema tem várias Rotinas se o Módulo já tem várias Rotinas?

Bom, vamos facilitar aquele seu menu:

&lt;div id="menuprincipal"&gt;
	<ul>
		<li><a>Home</a></li>
		<li><a>Empresa</a></li>
		<li><a>Sistemas</a>
			<ul>
				&lt;c:forEach items="${sistemasList}" var="sistema"&gt;
					<li>
						<a>${sistema.nome}</a>
						<ul>
							&lt;c:forEach items="${sistema,modulos}" var="modulo"&gt;
								<li><a>${modulo.nome}</a>
									<ul>
										&lt;c:forEach items="${modulo.rotinas}" var="rotina"&gt;
											<li><a>${rotina.nome}</a></li>
										&lt;/c:forEach&gt;
									</ul>
								</li>
							&lt;/c:forEach&gt;
						</ul>
					</li>
				&lt;/c:forEach&gt;
			</ul>
		</li>
		<li><a>Produtos</a></li>
		<li><a>Serviços</a></li>
		<li><a>Suporte</a></li>
		<li><a>Adquirir</a></li>
		<li><a href="https://webmail.softsol.com.br/">Web E-mail</a></li>
		<li><a href="https://sac.softsol.com.br/">Documentação</a></li>
		<li><a href="http://www.softsol.com.br/?link=faq">Dúvidas</a></li>
		<li><a href="http://www.softsol.com.br/?link=falecom">Contato</a></li>
	</ul>
&lt;/div&gt;

Da uma analisada nisso que eu fiz.
Bom, pelo o que você me disse, esse menu está no header.jspf para aparecer em todas as páginas, pois então, você precisa definir o que será colocado dentro de ${sistemasList} o tempo todo…
Me mostra a action que você chama e o menu funciona.

101574

A página é jsp/sistemas/lista.jsp

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;Página&lt;/th&gt;
&lt;th&gt;Imagem&lt;/th&gt;
&lt;th&gt;Ativo&lt;/th&gt;
&lt;th&gt;Alterar&lt;/th&gt;
&lt;th&gt;Excluir&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;c:forEach items="${sistemasList}" var="sistemas"&gt;
&lt;tr&gt;
&lt;td&gt;${sistemas.nome}&lt;/td&gt;
&lt;td&gt;${sistemas.url}&lt;/td&gt;
&lt;td&gt;${sistemas.imagem}&lt;/td&gt;
&lt;td&gt;${sistemas.ativo}&lt;/td&gt;
&lt;td&gt;<a /sistemas/${sistemas.id}"/>"&gt;Editar</a>&lt;/td&gt;
&lt;td&gt;&lt;form action="&lt;c:url value="/sistemas/${sistemas.id}"/&gt;"method="POST"&gt;&lt;button class="link" name="_method" value="DELETE"&gt;Remover&lt;/button&gt;&lt;/form&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/c:forEach&gt;
&lt;/tbody&gt;
&lt;tr&gt;<a /sistemas/novo"/>"&gt;Novo Sistema</a>&lt;/tr&gt;
&lt;/table&gt;

No meu controller, o método que chama ela é

@Get("/sistemas")
public List&lt;Sistemas&gt; lista() {
return dao.listaTudo();
 }

E a url fica assim.

http://localhost:8080/Soft/sistemas
Rafael_Guerreiro

Concorda que isso:

@Get("/sistemas") public List&lt;Sistemas&gt; lista() { return dao.listaTudo(); }
é igual a isso:

@Get("/sistemas") public void lista() { result.include("sistemasList", dao.listaTudo()); }
Pois então, você precisa executar aquele include em TODAS as requisições. Ou seja, crie um interceptor que vai fazer aquilo.

101574

Oo mano,

Valeu pela ajuda.
Mas não entendi.
A questão do interceptor.
E meu próximo passo, a implementação do interceptor para login e afins.
Vou estudar, e qualquer coisa eu volto.

Rafael_Guerreiro

Tudo bem. Estude bastante tudo isso.

No menu, você entendeu o que foi feito? Funcionou? Mostrou todos os sub menus?
E no seu modelo, repito a minha pergunta:
“Por que um Sistema tem várias Rotinas se o Módulo já tem várias Rotinas?”

101574

Não tive como testar o menu.
Porque lembra, que ele só lista os sistemas, no método lista do sistemas?

Então,

As vezes eu preciso relacionar apenas sistemas e rotinas.
Por isso que temos um campo do sistemas nas rotinas.
Ok?

Rafael_Guerreiro

Pode testar o menu naquela URL “/sistemas” que você sabia que funcionava.
Se você olhar bem, o menu agora só depende da lista de sistemas.

101574

Brother,

Deve ter alguma coisa errada com o meu código.
Porque continua não funcionando.
So lista, os sistemas na tela dos sistemas.
Acredita?

Rafael_Guerreiro

Debuga e ve se os Sistemas estão devidamente populados na hora em que o DAO faz o listaTudo()

101574

Brother,

Curte o resultado do console

Hibernate: 
    select
        this_.id as id0_0_,
        this_.ativo as ativo0_0_,
        this_.imagem as imagem0_0_,
        this_.nome as nome0_0_,
        this_.url as url0_0_ 
    from
        Sistemas this_
Rafael_Guerreiro

Você debugou? Isso ai não quer dizer nada.

Como você marcou os Módulos e as Rotinas como Lazy, o hibernate vai carregá-las depois. Se ele não carregou, é pq vc não usou…

Me mostra o método listaTudo()

101574
public List&lt;Produto&gt; listaTudo() {
		return this.session.createCriteria(Produto.class).list();
		}
Rafael_Guerreiro

Isso ai lista Produtos e não Sistemas…

Certo… Você vai precisar usar o Hibernate.initialize(sistemas.getModulos()) e Hibernate.initialize(sistemas.getRotinas()).

Ou então setar a configuração dos dois atributos como EAGER.

101574

Beleza,

Valeu pela força, nem reparei.
Estou fazendo o login. Foi mal.
Mas onde eu posso colocar esse metodos.?

Rafael_Guerreiro

Antes de fazer o return.

101574

Vou testar agora. Valeu.

101574
public List&lt;Sistemas&gt; listaTudo() {
			return this.session.createCriteria(Sistemas.class).list();
			Hibernate.initialize(sistemas.getModulos());
			Hibernate.initialize(sistemas.getRotinas()); 
			}

Esta dando erro.
sistemas não pode ser resolvido.

Rafael_Guerreiro

101574:
public List&lt;Sistemas&gt; listaTudo() { return this.session.createCriteria(Sistemas.class).list(); Hibernate.initialize(sistemas.getModulos()); Hibernate.initialize(sistemas.getRotinas()); }

Esta dando erro.
sistemas não pode ser resolvido.


Ixi cara… Você precisa estudar mais um pouquinho…

Não pode ter nada depois do return… Como que o método vai executar o resto se ele já saiu do método?
Eu não vou te entregar tudo na boca. Vou te falar o que fazer:

  • Colocar o retorno em uma variável separada;
  • Iterar sobre cada item dessa variável;
  • Sobre cada item, você aplica o initialize;
  • E, por último, retornar essa variável.
101574

Caraca que burrice.
Eu nem vi isso.rsrs.
Vou tentar aqui.
Valeu.

Criado 3 de setembro de 2012
Ultima resposta 4 de set. de 2012
Respostas 23
Participantes 2