ResultSet to Pagination

Como converter object Resultset em uma exibição paginada em um JSP?

Por exemplo, esta é minha consulta e conjunto de resultados:

pst = con.prepareStatement("select userName, job, place from contact"); rs = pst.executeQuery(); 

   

Para começar, você precisa adicionar um ou dois parâmetros adicionais de solicitação ao JSP: firstrow e (opcionalmente) rowcount . O rowcount também pode ser deixado de lado e definido inteiramente no lado do servidor.

Em seguida, adicione um monte de botões de paginação ao JSP: o próximo botão deve instruir o Servlet para incrementar o valor do firstrow com o valor de rowcount . O botão anterior deve obviamente diminuir o valor do firstrow com o valor de rowcount . Não se esqueça de lidar com valores negativos e transbordar corretamente! Você pode fazer isso com ajuda de SELECT count(id) .

Em seguida, dispare uma consulta SQL específica para recuperar uma sublista dos resultados. A syntax exata do SQL, no entanto, depende do database usado. No MySQL e no PostgreSQL é fácil com as cláusulas LIMIT e OFFSET :

 private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM" + " contact ORDER BY id LIMIT %d OFFSET %d"; public List list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, rowcount); // Implement JDBC. return contacts; } 

No Oracle, você precisa de uma subconsulta com a cláusula rownum , que deve se parecer com:

 private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM" + " (SELECT id, username, job, place FROM contact ORDER BY id)" + " WHERE ROWNUM BETWEEN %d AND %d"; public List list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount); // Implement JDBC. return contacts; } 

No DB2 você precisa da function OLAP row_number() para isso:

 private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM" + " (SELECT row_number() OVER (ORDER BY id) AS row, id, username, job, place" + " FROM contact) AS temp WHERE row BETWEEN %d AND %d"; public List list(int firstrow, int rowcount) { String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount); // Implement JDBC. return contacts; } 

Eu não faço MSSQL, mas é sintaticamente semelhante ao DB2. Veja também este tópico .

Por fim, basta apresentar a sub-lista na página JSP da maneira usual com o JSTL c:forEach .

  
${contact.username} ${contact.job} ${contact.place}

Observe que alguns podem sugerir que você precise SELECT a tabela inteira e salvar a List no escopo da session e fazer uso da List#subList() para paginar. Mas isso está longe de ser eficiente em termos de memory, com milhares de linhas e vários usuários simultâneos.

Para aqueles que estão interessados ​​em respostas semelhantes no contexto JSF / MySQL usando o componente h:dataTable , você pode achar este artigo útil. Ele também contém algumas matemáticas agnósticas de linguagem úteis para que a paginação “semelhante ao Google” funcione bem.

Este exemplo do Oracle está errado.

Sim, na seleção externa quando tiver bons valores de ROWNUM, mas ainda é pseudo coluna então não podemos usar BETWEEN nela. Precisamos de mais um select.

O código sql correto é:

 SELECT c.* FROM (SELECT c.*, ROWNUM as rnum FROM (SELECT id, username, job, place FROM contact ORDER BY id) c) c WHERE c.rnum BETWEEN 5 AND 10 

Camaradas, usando uma string SQL sólida e a class Statement é SLOOOW. A Oracle precisa analisar seu SQL toda vez que você o executa.

 //Slooow example Satement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from my_table where id = 11"); 

Use PreparedStatement e parâmetros de binding.

  //Faster example PreparedStatement ps = conn.getPrepareStatement("select * from my_table where id = ?"); ps.setInt(1, 11); 

E solução mais rápida é colocar seu sql no procedimento armazenado oracle e usar o CallableStatement para chamá-lo.

 //Fastest example CallableStatement cs = conn.prepareCall("{? = call my_plsql_function(?)}"); cs.setInt(1, 11); 

Aqui estão algumas coisas que você pode fazer:

  • Marshall o conjunto de resultados para alguma lista de objects / registros
  • Com base no tamanho de página desejado, calcule quantas páginas você terá com base no conjunto de resultados.
  • Verifique o parâmetro de solicitação para a página e os deslocamentos necessários com base no número de itens a serem exibidos na página. Então, se você está na página 4 com 12 para exibir, seu deslocamento é 48.
  • Determine o número total de páginas com base na contagem dos itens.

  • Exibir seus itens com base no deslocamento determinado (somente a exibição a partir do item 48)

  • Gere sua paginação com a quantidade de páginas com base no número total de páginas que você determinou.

=======

Essa é a sua abordagem básica. Você pode ajustar isso com:

  • Determinar uma maneira de limitar a consulta à página (mas isso não ajudará você a determinar os tamanhos de página)
  • Formas extravagantes de paginação
  • etc ..

Procure o padrão da lista de valores e aplique-o. Essa é tipicamente a melhor maneira de lidar com esse tipo de coisa.

Você pode usar displaytag para paigination ou resultset, mas você pode baixar algum arquivo jar do displattag

Primeiro você cria um servlet StudentList.java

 public class StudentList extends HttpServlet 

{public void service (solicitação HttpServletRequest, resposta HttpServletResponse) gera ServletException, IOException {

  ArrayList al=new ArrayList(); StudentDao stdo=new StudentDao(); // this is DAO Class (Data Acccess Object) try { al=stdo.getStudentList(); //getstudent list dao method } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } request.setAttribute("al",al); RequestDispatcher rd=request.getRequestDispatcher("StudentPaging.jsp"); rd.forward(request,response); } 

}

// método dao

 public ArrayList getStudentList() throws SQLException,Exception { ArrayList ai=new ArrayList(); Connection con=null; Statement st=null; ResultSet rs=null; Date dt=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy"); StudentInformation sdata=null; con=MyConnection.creatConnection(); if(con!=null) { st=con.createStatement(); String select="select * from STUDENT"; System.out.println(select); rs=st.executeQuery(select); if(rs!=null) { while(rs.next()) { sdata=new StudentInformation(); sdata.setSid(rs.getString("SID")); sdata.setFirstName(rs.getString("FIRSTNAME")); sdata.setMiddleName(rs.getString("MIDDLENAME")); sdata.setLastName(rs.getString("LASTNAME")); dt=rs.getDate("SDATE"); sdata.setDateofbirth(sdf.format(dt)); sdata.setGender(rs.getString("GENDER")); sdata.setAddress(rs.getString("ADDRESS")); sdata.setHigestQulification(rs.getString("HIQULIFICATION")); sdata.setLanguageKnow(rs.getString("LANGUAGE")); sdata.setHobby(rs.getString("HOBBY")); sdata.setTermCondition(rs.getString("TERMCON")); ai.add(sdata); } } } return ai; } 

insira a descrição da imagem aqui