Re:Exemplo de paginação em jsp

Simone, de uma olhada nessa taglib:

http://displaytag.homeip.net/displaytag-examples-1.1/example-pse.jsp

Basicamente, você passa uma lista para ela e a mesma se vira e monta, indepedente se vem de um txt, xml, tabela do bd x y ou z.

1 - Crie uma classe que conecte com o Sql Server, dica use o driver jtds.
2 - Crie sua classe modelo.
3 - Crie sua classe DAO, que contenha o método que retorna uma lista.
4 - Passe essa lista via request ou sessão para um JSP pelo seu Controller, que pode ser uma Servlet caso não use nenhum framework MVC.
5 - Finalmente agora você monta a paginação conforme exemplo.

Qualquer dúvida estamos ai.

Agora que suas classes estão ok, troque na sua JSP para a displaytag, lembre-se de adicionar os jars da taglib e o jstl no projeto.

Toda aquela lógica vira isso:

<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<display:table requestURI="nomeServlet?operacao=buscaItens" name="${resultado}" uid="resultado" class="simple" pagesize="10">
</display:table>  

Os jars são:

displaytag-1.1.jar

http://sourceforge.net/project/showfiles.php?group_id=73068

Esses outros já estão anexados aqui.

commons-logging
commons-lang
commons-collections
commons-beanutils
log4j
itext

Sim, se for somente a paginação aquelas linhas resolvem dentro das tags Htmls normais.

<html>
   <head></head>
   ...
</html>

Tenho a 1.O a 1.1 está mais completa.

Você adicionou o jstl.jar também?

Como ficou sua página?

Paginação não ficaria melhor sendo controlada pela persistencia ? quando voce faz uma consulta vc seleciona o offset + tamanho de pagina, ao inves de retornar uma consulta de 10000 de registros e não mostrar-los na hora.

E como eu faria por persistencia??

[quote=Pedrosa]Você adicionou o jstl.jar também?

Como ficou sua página?[/quote]

eu uso o tomcat c eu jogar todos esses *.jar dentro da pasta common/lib do tomcat seria uma má pratica ou não funcionaria mesmo??

faço isso com a maioria do jar inclusive o core eu só joguei lá e funcionou!!!

Eu tenho! estou anexando

Concordo mas você poderia dar exemplos mas precisos…

Concordo mas você tem exemplos mais precisos???

Pedrosa me esclarece uma coisa… se alguem além dele puder me ajudar agradeço da mesma forma.

Começei a utilizar o displaytag a pouco tempo. portanto me surgiram algumas dúvidas e como encontrei várias respostas suas em muitos posts a respeito de páginação recomendando o Displaytag, acredito que deva conhecer bem esse componente.

Talvez vc possa me ajudar…

Esse componente, ao que me parace que, pega todo o conteúdo recuperado em uma lista e envia, de uma vez só, para a página efetuar o controle de páginação. Isso acredito eu pode vir a gerar sérios problemas de timeout quando falar-mos de milhares de registros… se eu estiver errado peço que me corrija.

Mas de acordo com a documentação existem uma forma de utilizar o Displaytag em conjunto com o Pattern Valuelist, que permite a paginação interna pela aplicação, enviando somente os registros a serem visualizados.

Sendo que infelizmente não consegui exemplos bem claros de como utiliza-los…

Se alguem puder me dar uma luz… sou muito grato…

Abraços.

Existe uma forma mais simples ainda…

quando vc traz uma penca de registros do BD, vc pode salva-los na memória…

Ae sua paginação fica na memória… ao inves de ir ao BD e trazer essa mesma penca novamente…

É uma forma bem simples tbm… acho q até no JSF tem algo q faz dessa forma…

Valeu!!!

Concordo mas você tem exemplos mais precisos???[/quote]

Daniel,

Por persistência, a idéia é um método no Dao receber os parâmetros de inicio e quantidade. Por exemplo:

public List<Usuario> getUsuariosBlaBlaBla (int inicio, int quantidade) {
   // Query q  = sua query
   q.setFirstResult(inicio);
   q.setMaxResults(quantidade);
   return getQueryResultList(q);
}

E outro método no Dao para retornar a quantidade total:

public int getQuantidadeTotalDeUsuariosBlaBlaBla () 
   //Query q = (count) u FROM Usuario...restante da Query
   return ((Number) getQuerySingleResult(q)).intValue();
}

Em alguma lógica sua, voce recebe uma lista de usuarios com o método “getUsuariosBlaBlaBla” e o total:

List<Usuario> usuarios = daoFactory.getUsuarioDao().getUsuariosBlaBlaBla (0,10);
int total = daoFactory.getUsuarioDao().getQuantidadeTotalDeUsuariosBlaBlaBla();
total = (total % 10 == 0) ? total / quantidade : 1 + total / 10;

Aqui no ebaH! no caso, fazemos paginação com persistÊncia desta maneira, pois não precisa carregar toda a lista para a visualização, apenas o que foi necessário para paginar.
Na visualização, porém, fizemos uma tag de paginação própria. Não é muito difícil.

A displaytag carrega todos os dados em tempo de execução, oq pode gerar, conforme alguns colegas citaram, problemas de performance.
Espero ter ajudado,

[]´s

Olá

Alguém tem algum exemplo de paginação jsp, utilizando o banco sql server?

Att
Simone

Ok Pedroza, implementei todas as classes…

Tô com dificuldade apenas para implementar o código da paginação.

Segue código fonte das mesmas:

[color=red]DAO[/color]
public Collection consultaCampos() {
Connection conn = null;
Collection resultado = new ArrayList();

	try {
		  conn = super.getConexao();
		  Statement stat = conn.createStatement();
		  ResultSet rs = stat.executeQuery("SELECT DS_COMANDO, DS_CAMPO, DS_ALIAS FROM SYS_CAMPO ");
	  
	  while (rs.next()) {
		CampoVo campoVo = new CampoVo();
		campoVo.setDS_COMANDO(rs.getString("DS_COMANDO"));
		campoVo.setDS_CAMPO(rs.getString("DS_CAMPO"));
		campoVo.setDS_ALIAS(rs.getString("DS_ALIAS"));	  	
		resultado.add(campoVo);
	  }
	  rs.close();
	  stat.close();
	  System.out.println("Dados pesquisados com sucesso");		  
				
	} catch (SQLException sqle) {
		System.out.println("Erro de SQL");			
	}
	return resultado;
}

[color=red]CONEXÃO BANCO DE DADOS[/color]

public class Conexao {

public Connection getConexao(){

	Connection connection = null;

	String url ="jdbc:microsoft:sqlserver://notedell001:1433;databaseName=CADGEN";
	String user = "sa";
	String password = "password";

	try {
		Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
		System.out.println("Driver Carregado");
		connection = DriverManager.getConnection(url,user,password);
		System.out.println("Banco Conectado");
	} catch (ClassNotFoundException e) {
		System.out.println("Ocorreu um erro no carregamento do Driver SQLServer!");
		e.printStackTrace();
	} catch (SQLException e) {
		System.out.println("Erro ao conectar ao banco de dados!");
		e.printStackTrace();
	}
	return connection;
}

public void fecharRecursos(Connection connection, Statement statement){
	this.fecharRecursos(connection, statement);
}

public void fecharRecursos(Connection connection, 
						   Statement statement,
						   ResultSet resultset){
	try {
		if (resultset != null)
			resultset.close();
	} catch (SQLException e) {
		System.out.println("Erro ao fechar ResultSet");
	}

	try {
		if (statement != null)
			statement.close();
	} catch (SQLException e) {
	System.out.println("Erro ao fechar statement");
	}

	try {
		if (connection != null)
			connection.close();
	} catch (SQLException e) {
		System.out.println("Erro ao fechar connection");
	}
}

}

[color=red]SERVLET[/color]

else if(operacao.equals(“buscaItens”)){
CampoDao dao = new CampoDao();
Collection resultado = (ArrayList) dao.consultaCampos();
request.getSession(false).setAttribute(“resultado”, resultado);
response.sendRedirect(“cadastro.jsp”);
}

[color=red]JSP[/color]

<%@ page language=“java” contentType="text/html; charset=ISO-8859-1"
pageEncoding=“ISO-8859-1”%>
<%@ page import=“br.com.estratege.vo.CampoVo” %>
<%@ page import=“java.util.*” %>

<%
String path = request.getContextPath();
Collection resultado = null;
resultado = (ArrayList) request.getSession().getAttribute(“resultado”);

%>

Cadastro de Campos



Cadastro - Campos

<%
if(resultado != null){
%>

<%
Iterator iter = resultado.iterator();
while(iter.hasNext()){
CampoVo campoVo = (CampoVo) iter.next();
%>

    <td><%= campoVo.getDS_COMANDO()%><br></td>
    <td><%= campoVo.getDS_CAMPO()%></td>
 	<td><%= campoVo.getDS_ALIAS()%></td>
</tr>

<%
}
%>

Descrição do Comando Descrição do Campo Descrição do Alias

<% }else{ %>

<%
}
%>

[/code]

Aiaiaiaiaia

Toda minha lógica vai virar simplesmente isso:

 <display:table requestURI="nomeServlet?acao=paginar" name="${resultado}" uid="resultado" class="simple" pagesize="10">
 </display:table> 

E aonde eu pego esses jars?

Att

Ok Pedroza…

Mais meu jsp vai conter somente essa tag de display?

E aonde pego esses jars?

Att

Que pena, não estou conseguindo baixar o jar do display, vc tem ele aí?

Att
Simone