Re:Exemplo de paginação em jsp

22 respostas
Pedrosa

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.

22 Respostas

Pedrosa

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>
Pedrosa

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

Pedrosa

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

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

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

Pedrosa

Você adicionou o jstl.jar também?

Como ficou sua página?

fmeyer

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.

augustopovoa

E como eu faria por persistencia??

augustopovoa

Pedrosa:
Você adicionou o jstl.jar também?

Como ficou sua página?

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!!!

Pedrosa

Eu tenho! estou anexando

D

Concordo mas você poderia dar exemplos mas precisos…

D

Concordo mas você tem exemplos mais precisos???

D

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.

Weslley

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!!!

leandronsp

Concordo mas você tem exemplos mais precisos???

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

Simone_Aparecida_M_B

Olá

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

Att
Simone

Simone_Aparecida_M_B

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]
Simone_Aparecida_M_B

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

Simone_Aparecida_M_B

Ok Pedroza…

Mais meu jsp vai conter somente essa tag de display?

E aonde pego esses jars?

Att

Simone_Aparecida_M_B

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

Att
Simone

Simone_Aparecida_M_B

Ok Pedroza coloquei todos os meus .jars dentro da pasta lib, dentro de web-inf, depois coloquei no class path.

Mesmo assim estou tendo esse erro:

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

org.apache.jasper.JasperException: This absolute uri (http://java.sun.com/jsp/jstl/core) cannot be resolved in either web.xml or the jar files deployed with this application
	at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:60)
	at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:385)
	at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:109)
	at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:116)
	at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:309)
	at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:336)
	at org.apache.jasper.compiler.Parser.parseElements(Parser.java:750)
	at org.apache.jasper.compiler.Parser.parse(Parser.java:77)
	at org.apache.jasper.compiler.ParserController.parse(ParserController.java:157)

Sabe o que é?

Att

Simone_Aparecida_M_B

Bom dia

Aonde eu pego esse jar do jstl?

Att
Simone

Simone_Aparecida_M_B

ok pedroza…

já importei todos os jars necessários, que são eles:

commons-beanutils.jar
commons-collections.jar
commons-lang-2.0.jar
commons-logging.jar
displaytag-1[1].0.jar
jstl.jar

Precisa de mais algum…

Estou com o seguinte erro:

org.apache.jasper.JasperException: This absolute uri (<a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a>) cannot be resolved in either web.xml or the jar files deployed with this application

at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:60)

at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:385)

at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:109)

at org.apache.jasper.compiler.TagLibraryInfoImpl.(TagLibraryInfoImpl.java:116)

at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:309)

at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:336)

at org.apache.jasper.compiler.Parser.parseElements(Parser.java:750)

at org.apache.jasper.compiler.Parser.parse(Parser.java:77)

at org.apache.jasper.compiler.ParserController.parse(ParserController.java:157)

at org.apache.jasper.compiler.ParserController.parse(ParserController.java:111)

at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:183)
Criado 25 de setembro de 2006
Ultima resposta 2 de out. de 2006
Respostas 22
Participantes 7