English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Análisis del código de implementación de la función de paginación en javabean servlet jsp

la implementación del frontend utiliza ligerUI para la paginación, siento que usar un framework es realmente simple, por diversión, simulo la interfaz de paginación de liger (ignorando tanto las funcionalidades como el estilo) 

Aquí se utiliza una arquitectura de tres capas básica+servlet+implementación en jsp, la idea es simple, escribir toda la información de paginación en una clase pagebean, el servicio devuelve esta clase, cada vez que se realiza una consulta de paginación, se buscan las información en esta clase. Solo hay detalles más complicados, como el tratamiento de los límites (se deben manejar tanto en el frontend como en el backend), después de la transición del desplegable debe mostrar la página actual, etc. 

Este es el estilo de paginación implementado por ligerUI (el proceso se describe en mi último blog: https://es.oldtoolbag.com/artículo/92850.htm) 

proceso de implementación simulado: 

estructura de directorio

 

capa de modelo,

 

un modelo de base de datos correspondiente (Blog), y un pageBean(BlogPage)import java.sql.Date; 

public class Blog {
private int id;
 private int category_id;
 private String title;
 private String content;
 private Date created_time;
 getter y setter métodos
  //@Override
 public String toString() {
 return "Blog [id="
  id + category_id=" + " + category_id + "1#]", content=" + content
    + ", created_time=" + created_time + "]";
 } 
}
public class BlogPage {
 private List<Blog> pagerecord;//Registros por página
 private int pageno;//Página actual
 private int pagenostart;//Índice de inicio de página
 private int pagesize=5;//Número de datos por página
 private int totalrecord;//Número total de registros
 private int totalpage;//Número total de páginas
 public BlogPage(int pageno,int totalrecord){
  //pageno totalrecord pueden considerarse información existente
  this.totalrecord=totalrecord;
  //Calcular el número total de páginas
  totalpage=(totalrecord%pagesize==0)?totalrecord/pagesize:totalrecord/pagesize+1;
  //Tratamiento de los límites de pageno
  if(pageno<=1)
   this.pageno=1;
  else if(pageno>=totalpage)
   this.pageno=totalpage;
  else
   this.pageno=pageno;
  //Calcular el índice de inicio de la página, es decir, el índice del primer dato de la página, utilizado para la consulta de paginación
  pagenostart=(this.pageno-1)*pagesize;
 }
 public int getPagenostart() {
  return pagenostart;
 }
 public void setPagenostart(int pagenostart) {
  this.pagenostart = pagenostart;
 }
 public List<Blog> getPagerecord() {
  return pagerecord;
 }
 public void setPagerecord(List<Blog> pagerecord) {
  this.pagerecord = pagerecord;
 }
 public int getPageno() {
  return pageno;
 }
 public void setPageno(int pageno) {
  this.pageno = pageno;
 }
 public int getPagesize() {
  return pagesize;
 }
 public void setPagesize(int pagesize) {
  this.pagesize = pagesize;
 }
 public int getTotalrecord() {
  return totalrecord;
 }
 public void setTotalrecord(int totalrecord) {
  this.totalrecord = totalrecord;
 }
 public int getTotalpage() {
  return totalpage;
 }
 public void setTotalpage(int totalpage) {
  this.totalpage = totalpage;
 }
}
 

data access layer

JDBCUtil encapsulates the connection and release operations of jdbc

public class JDBCUtil {
 private static String url = "jdbc:mysql://localhost:3306/blogs_stu";
 private static String username = "root";
 private static String password = "";
 static {
  try {
   Class.forName("com.mysql.jdbc.Driver");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 public static Connection getConnection(){
  Connection conn;
  try {
   conn= DriverManager.getConnection(url, username, password);
   return conn;
  catch (SQLException e) {
   e.printStackTrace();
  }
  devolver null;
 }
 public static void release(ResultSet rs,PreparedStatement ps,Connection conn){
  if(rs!=null){
   try {
    rs.close();
   catch (SQLException e) {
    e.printStackTrace();
   }
  }
  if(ps!=null){
   try {
    ps.close();
   catch (SQLException e) {
    e.printStackTrace();
   }
  }
  if(conn!=null){
   try {
    conn.close();
   catch (SQLException e) {
    e.printStackTrace();
   }
  }
 }
}
public class BlogDao {
 //Registros por página, ingresar el índice de inicio de página y el tamaño de página para la paginación, es decir, los dos parámetros de limit (se utiliza limit en MySQL para paginación)
 public List<Blog> getPageRecord(int pagenostart, int pagesize) {
  Connection conn = JDBCUtil.getConnection();
  PreparedStatement ps = null;
  ResultSet rs = null;
  String sql = "select * from blog limit ?,?";
  List<Blog> lista = new ArrayList<Blog>();
  try {
   ps = conn.prepareStatement(sql);
   ps.setInt(1, pagenostart);
   ps.setInt(2, pagesize);
   rs = ps.executeQuery();
   while (rs.next()) {
    Blog blog = new Blog();
    blog.setId(rs.getInt("id"));
    blog.setCategory_id(rs.getInt("category_id"));
    blog.setTitle(rs.getString("title"));
    blog.setContent(rs.getString("content"));
    blog.setCreated_time(rs.getDate("created_time"));
    lista.add(blog);
   }
   devolver lista;
  catch (SQLException e) {
   e.printStackTrace();
  }
   JDBCUtil.release(rs, ps, conn);
  }
  devolver null;
 }
 //Número total de registros
 public int getTotal() {
  Connection conn = JDBCUtil.getConnection();
  PreparedStatement ps = null;
  ResultSet rs = null;
  try {
   ps = conn.prepareStatement("select count(*) from blog);
   rs = ps.executeQuery();
   if (rs.next()) {
    devolver rs.getInt(1);
   }
  catch (SQLException e) {
   e.printStackTrace();
  }
   JDBCUtil.release(rs, ps, conn);
  }
  devolver 0;
 }
}

Capa de servicio 

public class BlogService {
 BlogDao blogDao = new BlogDao();
 //devuelve pagebean, toda la información necesaria para todas las páginas se encuentra en pagebean
 public BlogPage findPageRecord(int pageno) {
  int totalrecord = blogDao.getTotal();
  BlogPage blogpage = new BlogPage(pageno, totalrecord);
  List<Blog> list = blogDao.getPageRecord(blogpage.getPagenostart(),blogpage.getPagesize());
  blogpage.setPagerecord(list);
  return blogpage;
 }
}

clase servlet 

@WebServlet("/BlogSplitServlet")
public class BlogSplitServlet extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  request.setCharacterEncoding("UTF-8");
  response.setContentType("text/html; charset=utf-8");
  String pagenostr=request.getParameter("pageno");
  //La primera vez que se accede al servlet, pagenostr es null, se proporciona un valor inicial, es decir, la primera página por defecto
  int pageno=1;
  if(pagenostr!=null)
   pageno=Integer.parseInt(pagenostr);
  BlogService service=new BlogService();
  BlogPage blogPage=service.findPageRecord(pageno);
  request.setAttribute("blogPage", blogPage);
  request.getRequestDispatcher("/blogPage.jsp").forward(request, response);}}
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doGet(request, response);
 }
}

de esta manera, toda la información de paginación se encapsula en pagebean 

la implementación de jsp solo necesita extraer la información de pagebean 

A continuación, se muestra mi implementación de jsp (simulando ligerUI) 

<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@page import="java.util.*,model.Blog,model.BlogPage"%>
!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insertar título aquí</title>
<script type="text/javascript">
 window.onload = function() {
  //asegurar que las opciones de select coincidan con la página actual
  select = document.getElementById("select");
  pageno = '${blogPage.pageno}';
  select.options[pageno - 1].selected = 'selected';
 }
 //salto de lista desplegable select
 function selectjump() {
  var pageno = select.selectedIndex + 1;
  window.location.href = "http://localhost/jspPageSplit/BlogSplitServlet?pageno="
    + pageno;
 }
 //salto de texto, evento onblur, cuando el cuadro de texto pierde el foco ocurre
 function textjump() {
  var pageno = document.getElementById("text").value;
  window.location.href = "http://localhost/jspPageSplit/BlogSplitServlet?pageno="
    + pageno;
 }
</script>
</head>
<body>
 <%
  BlogPage blogPage = (BlogPage) request.getAttribute("blogPage");
  List<Blog> list = blogPage.getPagerecord();
  // relleno de filas en blanco en la última página, si no se rellena, el número de filas de la tabla tr en la última página no coincide con las anteriores y se ve mal
  if (list.size() < blogPage.getPagesize()) {
   for (int i = list.size(); i < blogPage.getPagesize(); i++)
    list.add(null);
  }
 %>
 <div style="width: 50%; height: 400px">
  <table border="1" cellspacing="0" width="100%" bgcolor="#CEF0C5">
   <tr height="40px">
    <td>id</td><td>Título</td><td>Contenido</td><td>Fecha de creación</td>
   </tr>
   <%
    for (Blog blog : list) {
     if (blog != null) {
   %>
   <tr height="50px">
    <td width="10%"><%=blog.getId()%<//td>
    <td width="20%"><%=blog.getTitle()%<//td>
    <td width="40%"><%=blog.getContent()%<//td>
    <td width="30%"><%=blog.getCreated_time()%<//td>
   </tr>
   <!-- Rerelleno de línea en blanco de página final -->
   <%} else {%>
   <tr height="50px">
    <td width="10%"></td>
    <td width="20%"></td>
    <td width="40%"></td>
    <td width="30%"></td>
   </tr>
   <%}}%>
  </table>
  <div style="height:50px;background-color: #4B7DB3;line-height: 40px;">
    
  <!-- select desplegable -->
  <select id="select">
   <%for (int i = 1; i <= blogPage.getTotalpage(); i++) {%>
   <option onclick="selectjump()"><%=i%></option>
   <%}%>
  </select> 
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=1">Primera página</a>
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=<%=blogPage.getPageno()-1<1?blogPage.getPageno():blogPage.getPageno()-1%>">Anterior</a>  
  <input type="text" id="text" size="1px" value="${blogPage.pageno}" onblur="textjump()">/${blogPage.totalpage} 
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=<%=blogPage.getPageno()+1>blogPage.getTotalpage()?blogPage.getPageno():blogPage.getPageno()+1%>>página siguiente</a>
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=<%=blogPage.getTotalpage()%>>página final</a>
  <div style="float: right;">
  Mostrar desde ${blogPage.pagenostart+1} hasta ${blogPage.pageno==blogPage.totalpage?blogPage.totalrecord:blogPage.pagesize},
  Un total de ${blogPage.totalrecord} artículos. Se muestran ${blogPage.pagesize} artículos por página
  </div>
  </div>
 </div>
</body>
</html>

esta es la última apariencia, el estilo se ajustó de manera brusca, la función es idéntica a la de paginación predeterminada de ligerUI 

Cambiar el código en JSP a etiquetas (JSTL, se debe引入相应的jar包) y poner el relleno en la última página en el servlet después de eso 

se agrega en el servlet 

// relleno de filas en blanco en la última página, si no se rellena, el número de filas de la tabla tr en la última página no coincide con las anteriores y se ve mal
  List<Blog> list = blogPage.getPagerecord();
  if (list.size() < blogPage.getPagesize()) {
   for (int i = list.size(); i < blogPage.getPagesize(); i++)
    list.add(null);
  }
  blogPage.setPagerecord(list);

jsp página 

<%@ page language="java" contentType="text/html; charset=utf-8"
 pageEncoding="utf-8"%>
<%@page import="java.util.*,model.Blog,model.BlogPage"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insertar título aquí</title>
<script type="text/javascript">
 //salto de lista desplegable select
 function selectjump() {
  var select = document.getElementById("select");
  var pageno = select.selectedIndex + 1;
  window.location.href = "http://localhost/jspPageSplit/BlogSplitServlet?pageno="
    + pageno;
 }
 //text salto, evento onblur, que ocurre cuando el cuadro de texto pierde el foco
 function textjump() {
  var pageno = document.getElementById("text").value;
  window.location.href = "http://localhost/jspPageSplit/BlogSplitServlet?pageno="
    + pageno;
 }
</script>
</head>
<body>
 <div style="width: 50%; height: 400px">
  <table border="1" cellspacing="0" width="100%" bgcolor="#CEF0C5">
   <tr height="40px">
    <td>id</td><td>Título</td><td>Contenido</td><td>Fecha de creación</td>
   </tr>
   <c:forEach items="${blogPage.pagerecord}" var="c" varStatus="vs">
   <c:if test="${c!=null}">
      <tr height="50px">
    <td width="10%">${c.id}</td>
    <td width="20%">${c.title}</td>
    <td width="40%">${c.content}</td>
    <td width="30%">${c.created_time}</td>
   </tr>
   </c:if>
   <!-- Rerelleno de línea en blanco de página final -->
   <c:if test="${c==null}">
   <tr height="50px">
    <td width="10%"></td>
    <td width="20%"></td>
    <td width="40%"></td>
    <td width="30%"></td>
   </tr>
   </c:if>
   </c:forEach>
  </table>
  <div style="height:50px;background-color: #4B7DB3;line-height: 40px;">
    
  <!-- select desplegable -->
  <select id="select">
  <c:forEach begin="1" end="${blogPage.totalpage}" var="i">
  <option value="${i}" onclick="selectjump()" ${blogPage.pageno==i?'selected="selected"':''}>${i}</option>
  </c:forEach>
  </select> 
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=1">Primera página</a>
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=${blogPage.pageno-1<1?blogPage.pageno:blogPage.pageno-1}">Anterior página</a>  
  <input type="text" id="text" size="1px" value="${blogPage.pageno}" onblur="textjump()">/${blogPage.totalpage} 
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=${blogPage.pageno+1>blogPage.totalpage?blogPage.pageno:blogPage.pageno+1}">Página siguiente</a>
  <a href="${pageContext.request.contextPath}/BlogSplitServlet?pageno=${blogPage.totalpage}">Última página</a>
  <div style="float: right;">
  Mostrar desde ${blogPage.pagenostart+1} hasta ${blogPage.pageno==blogPage.totalpage?blogPage.totalrecord:blogPage.pagesize},
  Un total de ${blogPage.totalrecord} artículos. Se muestran ${blogPage.pagesize} artículos por página
  </div>
  </div>
 </div>
</body>
</html>

 En la aplicación práctica, se puede escribir una página jsp según las necesidades, pero el código en el servidor es básicamente común. 


Esto es todo el contenido del artículo, esperamos que haya sido útil para su aprendizaje y que todos apoyen el tutorial de grito.

Declaración: el contenido de este artículo se ha obtenido de la red, pertenece al autor original, el contenido se ha contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará