이 기사의 예에서는 데이터 페이징 방법의 jsp+servlet+javabean 구현을 설명합니다. 참고하실 수 있도록 자세한 내용은 다음과 같습니다.
여기서는 학습 과정을 걷고 기억한다는 마음으로 기록합니다.
제가 사용한 코드 중 일부는 온라인에서 찾은 후 직접 수정하여 제가 이해한 내용을 추가했습니다. 원본인지 아닌지는 모르겠지만 그냥 제가 배운 내용을 녹음하는 것뿐입니다.
사용 관련: PostgreSQL 데이터베이스, dom4j, JSP, Servlet
1. 먼저 프로젝트 레이아웃, 독자와 스스로 쉽게 보고 사용할 수 있도록 하는 전역 보기
아이디어는 다음과 같습니다.
config.xml 파일을 사용하여 데이터베이스 변경, 이식 및 재사용을 용이하게 하는 구성 정보를 기록합니다.
DOM4JUtil.java는 필요한 데이터를 얻기 위해 xml 속성 파일을 구문 분석하는 데 사용됩니다.
PostgreSQL_Util.java 패키지 데이터 연결 및 데이터베이스 작업
PageProperties.java는 테이블 페이징 속성 javaBean
PageProperties.java는 페이징 작업을 캡슐화합니다.
Page.java는 페이징의 주요 작업입니다
tablePage.jsp는 효과 표시 인터페이스입니다
사용된 타사 jar 패키지:
dom4j-1.6.1.jar xml 파일에 사용됩니다 파싱
postgresql-9.3-1101.jdbc4.jar은 postgreSQL 데이터베이스에 대한 JDBC 연결에 사용됩니다
페이징 효과는 다음과 같습니다. 이전 페이지를 클릭하여 페이지를 넘길 수 있으며 다음 페이지로 이동하고 지정된 페이지를 입력하면 첫 번째 또는 마지막 페이지로 점프(범위 밖으로 점프)됩니다. 특정 구현에 대한 자세한 코드를 참조하십시오. 게시했습니다. 저는 초보자이고 아직 배우는 단계입니다. 마스터가 조언을 해주시면 더 좋을 것 같습니다.
2. 특정 코드 구현
1. config.xml 데이터베이스 연결 정보 속성 파일
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE postgres[ <!ELEMENT postgres (driver,url,username,pwd)> <!ELEMENT driver (#PCDATA)> <!ELEMENT url (#PCDATA)> <!ELEMENT username (#PCDATA)> <!ELEMENT pwd (#PCDATA)> ]> <postgres> <driver>org.postgresql.Driver</driver> <url>jdbc:postgresql://localhost:5432/java</url> <username>admin</username> <pwd>k42jc</pwd> </postgres>
2.
package util; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 用于解析xml属性文件 * @author JohsonMuler * */ public class DOM4JUtil { private static Element root=null; static{//静态代码块 //创建解析对象 SAXReader sr=new SAXReader(); //获取当前工程路径 // String url=System.getProperty("user.dir"); String url=DOM4JUtil.class.getResource("").getPath(); // System.out.println(url); try { //通过文件路径获取配置文件信息 Document doc=sr.read(url+"config.xml"); //获取根节点 root=doc.getRootElement(); } catch (DocumentException e) { e.printStackTrace(); } } public static String getPostgresData(String str){ //以根节点为基础,获取配置文件数据 Element e=root.element(str); String data=e.getText(); return data; } public static void main(String[] args) { // String url=DOM4JUtil.class.getResource("..").getPath(); // System.out.println(System.getProperty("user.dir")); // System.out.println(url); String driver=getPostgresData("driver"); String url=getPostgresData("url"); System.out.println(driver); System.out.println(url); } }
3. PostgreSQL_Util.java
package util; import java.sql.PreparedStatement; import java.sql.Statement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; public class PostgreSQL_Util { private static DOM4JUtil dom=new DOM4JUtil(); private static Connection c=null; private static ResultSet rs=null; private static String driver=dom.getPostgresData("driver"); private static String url=dom.getPostgresData("url"); private static String username=dom.getPostgresData("username"); private static String pwd=dom.getPostgresData("pwd"); public PostgreSQL_Util(){ try { Class.forName(driver); c=DriverManager.getConnection(url); } catch (ClassNotFoundException e) { System.out.println("未找到指定类:"+e.getMessage()); } catch (SQLException e) { System.out.println("获取连接异常:"+e.getMessage()); } } /** * 数据查询方法(Statement) * @param sql * @return * @throws SQLException */ public ResultSet executeQuery(String sql) throws SQLException{ Statement s=c.createStatement(); rs=s.executeQuery(sql); return rs; } /** * 重载方法(PreparedStatement) * @param sql * @param list * @return * @throws SQLException */ public ResultSet executeQuery(String sql,List<Object> list) throws SQLException{ PreparedStatement ps=c.prepareStatement(sql); for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); System.out.println(i+1); ps.setObject(i+1, list.get(i)); } rs=ps.executeQuery(); c.close(); return rs; } /** * 数据更新方法(添加,删除,更改)(Statement) * @param sql * @throws SQLException */ public int executeUpdate(String sql) throws SQLException{ Statement s=c.createStatement(); int i=s.executeUpdate(sql); c.close(); return i; } /** * 重载方法(PreparedStatement) * @param sql * @param list * @throws SQLException */ public int executeUpdate(String sql,List<Object> list) throws SQLException{ PreparedStatement ps=c.prepareStatement(sql); for(int i=0;i<list.size();i++){ ps.setObject(i+1, list.get(i)); } int i=ps.executeUpdate(); c.close(); return i; } /** * 单独的获取连接 * @return * @throws ClassNotFoundException * @throws SQLException */ public static Connection getConnection() throws ClassNotFoundException, SQLException{ Class.forName(driver); c=DriverManager.getConnection(url); return c; } }
4. PageProperties.java
package bean; import java.sql.ResultSet; public class PageProperties { private int currentPage;//当前页号 private int totalPages;//总页数 private int totalRecords;//总数据条数 private ResultSet rs;//动态结果集 public PageProperties() { super(); } public PageProperties(int currentPage, int totalPages, int totalRecords, ResultSet rs) { super(); this.currentPage = currentPage; this.totalPages = totalPages; this.totalRecords = totalRecords; this.rs = rs; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalPages() { return totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getTotalRecords() { return totalRecords; } public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; } public ResultSet getRs() { return rs; } public void setRs(ResultSet rs) { this.rs = rs; } }
5. >6. Page.java가 메인 프로세싱 클래스인 Servlet
package bean; import java.sql.ResultSet; public class PageProperties { private int currentPage;//当前页号 private int totalPages;//总页数 private int totalRecords;//总数据条数 private ResultSet rs;//动态结果集 public PageProperties() { super(); } public PageProperties(int currentPage, int totalPages, int totalRecords, ResultSet rs) { super(); this.currentPage = currentPage; this.totalPages = totalPages; this.totalRecords = totalRecords; this.rs = rs; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalPages() { return totalPages; } public void setTotalPages(int totalPages) { this.totalPages = totalPages; } public int getTotalRecords() { return totalRecords; } public void setTotalRecords(int totalRecords) { this.totalRecords = totalRecords; } public ResultSet getRs() { return rs; } public void setRs(ResultSet rs) { this.rs = rs; } }
7. tablePage.jsp 프론트엔드 디스플레이 효과
package servlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import util.PostgreSQL_Util; import bean.PageProperties; import bean.TablePage; public class Page extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); /** * 通过TablePage设置分页属性 * */ TablePage tb=new TablePage(); //获取当前表格显示的页码 int currentPage=tb.currentPage(tb.getStrPage(request, "page")); System.out.println(currentPage); //设置每页显示数据条数 tb.setPageRecord(10);//设置每页显示10条数据 /** * 通过xxSQL_Util设置JDBC连接及数据处理 */ PostgreSQL_Util postgres=new PostgreSQL_Util(); try { ResultSet rs_count=postgres.executeQuery("select count(*) as c from student"); rs_count.next(); //获得总的数据条数 int totalRecords=rs_count.getInt("c"); //根据数据表的总数据条数获取页面显示表格的总页数 int totalPages=tb.getTotalPages(totalRecords); if(currentPage>totalPages){ currentPage=totalPages;//保证最后一页不超出范围 } //根据数据库表信息和当前页面信息获得动态结果集 ResultSet rs=tb.getPageResultSet(postgres.executeQuery("select * from student"), currentPage); /** * 将数据加入javaBean */ PageProperties pp=new PageProperties(currentPage, totalPages, totalRecords, rs); /** * 将javaBean转发至前端 */ request.setAttribute("result", pp); request.getRequestDispatcher("tablePage.jsp").forward(request, response); } catch (SQLException e) { System.out.println("Class Page:"+e.getMessage()); // e.printStackTrace(); } } }
언뜻 보면 배경이 코드는 정말 번거롭지만 이는 프로그램의 견고성과 이식성을 고려하고 코드 재사용을 용이하게 합니다. 나중에 사용하려면 필요에 따라 속성 파일(config.xml)에서 관련 JDBC 드라이버를 구성하고 jsp 페이지의 요청을 통해 백그라운드 Servlet(Page.jsp)의 전달 결과("result")를 얻은 다음 이를 페이지 속성(PageProperties.java 클래스)과 결합하면 효과를 얻을 수 있습니다.
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="java.sql.ResultSet"%> <%@page import="bean.PageProperties"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>简单数据分页</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <table> <tr> <td>姓名</td> <td>性别</td> <td>年龄</td> <td>分数</td> </tr> <% PageProperties pp=(PageProperties)request.getAttribute("result"); ResultSet rs=pp.getRs(); %> <% int i=1; while(rs.next()){ %> <tr> <td><%=rs.getObject(1) %></td> <td><%=rs.getObject(2) %></td> <td><%=rs.getObject(3) %></td> <td><%=rs.getObject(4) %></td> </tr> <% i++; if(i>10) break; } %> <br/> <span><%=pp.getTotalPages() %>页</span> <span>共<%=pp.getTotalRecords() %>条数据</span> <span>本页<%=i-1 %>条</span> <span>第<%=pp.getCurrentPage() %>页</span> <p align="center"> <% if ( pp.getCurrentPage() > 1 ) { %><a href="<%=path %>/page?page=<%=pp.getCurrentPage() - 1%>"><<上一页</a> <% } %> <% if ( pp.getCurrentPage() < pp.getTotalPages() ) { %><a href="<%=path %>/page?page=<%=pp.getCurrentPage() + 1%>">下一页>></a> <% } %> <input type="text" name="input_text" id="input_text" size="1" /> <input type="button" name="skip" id="skip" value="跳转" onclick="skip();"/> <script> function skip(){ var v=document.getElementById("input_text").value; location.href="page?page="+v; } </script> </p> </table> </body> </html>