servlet和jsp实现简单分页功能

最近在做毕设,需要写一个管理系统,对几个框架也不很是很熟练,所以就打算servlet和jsp来做这个项目。

其中分页是比较麻烦的一个问题,就在慕课网上找了视频看,整理了实现步骤。大家可以直接看我博客,

也可以直接去看视频。此处附上原视频链接:https://www.imooc.com/learn/180

话不多说,先直接上效果图,有兴趣的话再往下看:

准备撸代码了:
一、准备工作
开发工具:myeclipse
数据库:mysql

二、创建数据库相关文件
 先创建一个数据库pagination,然后创建t_student表,此处贴上sql脚本:
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `stu_name` varchar(16) NOT NULL,
  `gender` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `address` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

INSERT INTO `t_student` VALUES ('1', '王小军', '1', '17', '北京市东城区');
INSERT INTO `t_student` VALUES ('2', '李雷雷', '1', '16', '北京市朝阳区');
INSERT INTO `t_student` VALUES ('3', '张静', '2', '16', '北京市昌平区');
INSERT INTO `t_student` VALUES ('4', '王晓萌', '2', '17', '北京市顺义区');
INSERT INTO `t_student` VALUES ('5', '韩梅梅', '2', '16', '北京市朝阳区');
INSERT INTO `t_student` VALUES ('6', '李小军', '1', '17', '北京市海淀区');
INSERT INTO `t_student` VALUES ('7', '成龙', '1', '16', '北京市石景山区');
INSERT INTO `t_student` VALUES ('8', '李海飞', '2', '16', '北京市海淀区');
INSERT INTO `t_student` VALUES ('9', '罗红', '2', '16', '北京市朝阳区');
INSERT INTO `t_student` VALUES ('10', '孙海杰', '1', '16', '北京市石景山区');
INSERT INTO `t_student` VALUES ('11', '王海龙', '1', '16', '北京市东城区');
三、开始正题了,创建java web项目
 1.首先创建以下目录,下面再一一讲解每个目录中文件

2.在model包下创建Student类、Pager类和Contants类:
 Student就不用解释了(注意其中有个根据参数为map对象的构造函数),
 Pager是jsp页面需要展示的对象,包括pageSize、pageNum、totalRecord、totalPage、studentList
这些在jsp页面需要的属性
 Contants中定义了一些常量
package com.wang.PaginationTest.model;

import java.io.Serializable;
import java.util.Map;

public class Student implements Serializable{

	private static final long serialVersionUID = -2673637313342809713L;
	
	private int id;
	private String stuName;
	private int age;
	private int gender;
	private String address;
	
	public Student() {
		super();
	}
	//注意此处有个以map为参数的构造函数
	public Student(Map<String, Object> map) {
		this.id = (Integer)map.get("id");
		this.stuName = (String)map.get("stu_name");
		this.age = (Integer)map.get("age");
		this.gender = (Integer)map.get("gender");
		this.address = (String)map.get("address");
	}
	public Student(int id, String stuName, int age, int gender, String address) {
		super();
		this.id = id;
		this.stuName = stuName;
		this.age = age;
		this.gender = gender;
		this.address = address;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getStuName() {
		return stuName;
	}
	public void setStuName(String stuName) {
		this.stuName = stuName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getGender() {
		return gender;
	}
	public void setGender(int gender) {
		this.gender = gender;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", stuName=" + stuName + ", age=" + age
				+ ", gender=" + gender + ", address=" + address + "]";
	}
	
}

package com.wang.PaginationTest.model;

import java.io.Serializable;
import java.util.List;

/**
 * @author Mr.Wang
 *
 * @param <T>
 */
public class Pager<T> implements Serializable{
	
	
	private static final long serialVersionUID = 1272640772922982817L;
	private int pageSize;
	private int currentPage;
	private int totalRecord;
	private int totalPage;
	private List<T> dataList;
	
	
	public Pager() {
		super();
	}
	public Pager(int pageSize, int currentPage, int totalRecord, int totalPage,
			List<T> dataList) {
		super();
		this.pageSize = pageSize;
		this.currentPage = currentPage;
		this.totalRecord = totalRecord;
		this.totalPage = totalPage;
		this.dataList = dataList;
	}
	public Pager(int pNum,int pSize,List<T> sourceData){
		if(sourceData==null)
			return;
		totalRecord = sourceData.size();
		pageSize = pSize;
		currentPage = pNum;
		totalPage = (totalRecord%pageSize)==0?(totalRecord/pageSize):(totalRecord/pageSize+1);
		int fromIndex = (currentPage-1)*pageSize;
		int toIndex = (currentPage*pageSize<=totalRecord)?(currentPage*pageSize):totalRecord;
		dataList = sourceData.subList(fromIndex, toIndex);
		
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	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;
	}
	public List<T> getDataList() {
		return dataList;
	}
	public void setDatalist(List<T> dataList) {
		this.dataList = dataList;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
}

package com.wang.PaginationTest.model;

public class Constants {
	public static final int GENDER_MALE=1;               //男性
	public static final int GENDER_FEMALE=2;			 //女性
	public static final int DEFAULT_GENDER=0;			 //男女
	public static final int DEFAULT_PAGENUM=1;			 //默认当前页
	public static final int DEFAULT_PAGESIZE=5;			 //默认页面大小为5
}


3.jdbc连接:
jdbc.properties的内容如下:(注意改为自己数据库的用户名和密码)
jdbc.username=root
jdbc.password=123456
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/pagination
在util包下创建JdbcUtil.java:
package com.wang.pagination.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class JdbcUtil {

	private static String USERNAME;
	private static String PASSWORD;
	private static String DRIVER;
	private static String URL;

	private Connection connection;
	private PreparedStatement pstmt;
	private ResultSet resultSet;

	static{
		loadConfig();
	}
	
	/**
	 * 加载配置文件jdbc.propertiesֵ
	 */
	public static void loadConfig(){
		try {
			InputStream inStream = JdbcUtil.class
					.getResourceAsStream("/jdbc.properties");
			Properties prop = new Properties();
			prop.load(inStream);
			USERNAME = prop.getProperty("jdbc.username");
			PASSWORD = prop.getProperty("jdbc.password");
			DRIVER = prop.getProperty("jdbc.driver");
			URL = prop.getProperty("jdbc.url");
		} catch (Exception e) {
			throw new RuntimeException("加载配置文件异常", e);
		}
	}
	
	public JdbcUtil() {

	}
	
	//创建Connection
	public Connection getConnection() {
		try {
			Class.forName(DRIVER);
			connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (Exception e) {
			throw new RuntimeException("get connection error!");
		}
		return connection;
	}

	/**
	 *更新语句
	 *params为查询条件参数list
	 */
	public boolean updateByPreparedStatement(String sql, List<?> params)
			throws SQLException {
		boolean flag = false;
		int result = -1;
		pstmt = connection.prepareStatement(sql);
		int index = 1;
		
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		result = pstmt.executeUpdate();
		flag = result > 0 ? true : false;
		return flag;
	}
	
	/**
	 *查询语句
	 *每个map以键(属性)值对的形式存储一个对象
	 *list存储这样的多个map
	 */
	public List<Map<String, Object>> findResult(String sql, List<?> params)
			throws SQLException {
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		int index = 1;
		pstmt = connection.prepareStatement(sql);
		if (params != null && !params.isEmpty()) {
			for (int i = 0; i < params.size(); i++) {
				pstmt.setObject(index++, params.get(i));
			}
		}
		resultSet = pstmt.executeQuery();
		ResultSetMetaData metaData = resultSet.getMetaData();
		int cols_len = metaData.getColumnCount();
		while (resultSet.next()) {
			Map<String, Object> map = new HashMap<String, Object>();
			for (int i = 0; i < cols_len; i++) {
				String cols_name = metaData.getColumnName(i + 1);
				Object cols_value = resultSet.getObject(cols_name);
				if (cols_value == null) {
					cols_value = "";
				}
				map.put(cols_name, cols_value);
			}
			list.add(map);
		}
		return list;
	}

	/**
	 * 释放资源
	 */
	public void releaseConn() {
		if (resultSet != null) {
			try {
				resultSet.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
} 

4.在dao包和service包下分别创建StudentDao和StudentService接口类
 
package com.wang.PaginationTest.dao;

import com.wang.PaginationTest.model.Pager;
import com.wang.PaginationTest.model.Student;

public interface StudentDao {
	public Pager<Student> findStudent(Student model,int pageNum,int pageSize);
}

package com.wang.PaginationTest.service;

import com.wang.PaginationTest.model.Pager;
import com.wang.PaginationTest.model.Student;

public interface StudentService {
	public Pager<Student> findStudent(Student model,int pageNum,int pageSize);
}


5. 在dao包和service包下分别创建 StudentDaoImpl.java和 StudentServiceImpl.java
package com.wang.PaginationTest.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.wang.PaginationTest.model.Constants;
import com.wang.PaginationTest.model.Pager;
import com.wang.PaginationTest.model.Student;
import com.wang.PaginationTest.util.JdbcUtil;

public class StudentDaoImpl implements StudentDao{
	@Override
	public Pager<Student> findStudent(Student model, int pageNum, int pageSize) {
		Pager<Student> result=null;
		List<Object> paramList = new ArrayList<Object>();  //查询参数list
		String stuName = model.getStuName();               //两个查询参数
		int gender = model.getGender();
		
		StringBuilder sql = new StringBuilder("select * from t_student where 1=1 ");
		StringBuilder countSql = new StringBuilder("select count(id) as recordTotal from t_student where 1=1 ");
		
		if(stuName!=null&&!stuName.equals("")){
			sql.append("and stu_name like ? ");
			countSql.append("and stu_name like ? ");
			paramList.add("%"+stuName+"%");
		}
		if(gender==Constants.GENDER_MALE||gender==Constants.GENDER_FEMALE){
			sql.append("and gender = ? " );
			countSql.append("and gender = ? ");
			paramList.add(gender);
		}
		int fromIndex = (pageNum-1)*pageSize;
		sql.append(" limit "+ fromIndex +","+ pageSize);       
		

		JdbcUtil jdbcUtil = null;
		try {
			 jdbcUtil = new JdbcUtil();
			  jdbcUtil.getConnection();
			  
			  //取总记录数
			 List<Map<String, Object>> totalList = jdbcUtil.findResult(countSql.toString(), paramList);
			 Map<String, Object> totalMap = totalList.get(0);
			 int recordTotal = ((Number)totalMap.get("recordTotal")).intValue();
			 
			 //取stuList
			 List<Student> stuList = new ArrayList<Student>();
			 List<Map<String, Object>> findStuResult = jdbcUtil.findResult(sql.toString(), paramList);
			 for (Map<String, Object> map : findStuResult) {
				Student stu = new Student(map);
				stuList.add(stu);
			}
			 int totalPage = recordTotal/pageSize;
			 if(recordTotal%pageSize!=0){
				 totalPage+=1;
			 }
			 result =new Pager<Student>(pageSize, pageNum, recordTotal, totalPage, stuList);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			if(jdbcUtil!=null)
				jdbcUtil.releaseConn();
		}
		return result;
	}

}

package com.wang.PaginationTest.service;

import com.wang.PaginationTest.dao.StudentDao;
import com.wang.PaginationTest.dao.StudentDaoImpl;
import com.wang.PaginationTest.model.Pager;
import com.wang.PaginationTest.model.Student;

public class StudentServiceImpl implements StudentService{
	StudentDao stuDao;
	public StudentServiceImpl(){
		stuDao = new StudentDaoImpl();
	}
	
	@Override
	public Pager<Student> findStudent(Student model, int pageNum, int pageSize) {
		// TODO Auto-generated method stub
		Pager<Student> pager = stuDao.findStudent(model, pageNum, pageSize);
		return pager;
	}
}



6.在servlet包下创建StudentServlet.java
package com.wang.PaginationTest.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.wang.PaginationTest.model.Constants;
import com.wang.PaginationTest.model.Pager;
import com.wang.PaginationTest.model.Student;
import com.wang.PaginationTest.service.StudentServiceImpl;
import com.wang.PaginationTest.service.StudentService;

public class StudentServlet extends HttpServlet {

	private static final long serialVersionUID = -99919030529746195L;
	private StudentService stuService = new StudentServiceImpl();
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		//获取request参数
		String stuName = request.getParameter("stuName");
		
		int gender = Constants.DEFAULT_GENDER;
		String genderStr = request.getParameter("gender");
		if(genderStr!=null&& !"".equals(genderStr)){
			 gender = Integer.parseInt(genderStr);
		}
		int pageSize = Constants.DEFAULT_PAGESIZE;
		String pageSizeStr = request.getParameter("pageSize");
		if(pageSizeStr!=null&& !"".equals(pageSizeStr)){
			pageSize = Integer.parseInt(pageSizeStr);
		}
		int pageNum = Constants.DEFAULT_PAGENUM;
		String pageNumStr = request.getParameter("pageNum");
		if(pageNumStr!=null&& !"".equals(pageNumStr)){
			pageNum = Integer.parseInt(pageNumStr);
		}
		//组装查询条件
		Student stu = new Student();
		stu.setStuName(stuName);
		stu.setGender(gender);
		//调用service查询
		Pager<Student> result = stuService.findStudent(stu, pageNum, pageSize);
		//返回结果
		request.setAttribute("result", result);
		request.getRequestDispatcher("pagination.jsp").forward(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}




7.pagination.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学生信息</title>
</head>
<%
	// 获取请求的上下文
	String context = request.getContextPath();
%>
<script type="text/javascript">
// 当前第几页数据
var currentPage = ${result.currentPage};

// 总页数
var totalPage = ${result.totalPage};

function submitForm(actionUrl){
	var formElement = document.getElementById("stuForm");
	formElement.action = actionUrl;
	formElement.submit();
}

// 第一页
function firstPage(){
	if(currentPage == 1){
		alert("已经是第一页数据");
		return false;
	}else{
		submitForm("<%=context %>/StudentServlet?pageNum=1");
		return true;
	}
}

// 下一页
function nextPage(){
	if(currentPage == totalPage){
		alert("已经是最后一页数据");
		return false;
	}else{
		submitForm("<%=context %>/StudentServlet?pageNum=" + (currentPage+1));
		return true;
	}
}

// 上一页
function previousPage(){
	if(currentPage == 1){
		alert("已经是第一页数据");
		return false;
	}else{
		submitForm("<%=context %>/StudentServlet?pageNum=" + (currentPage-1));
		return true;
	}
}

// 尾页
function lastPage(){
	if(currentPage == totalPage){
		alert("已经是最后一页数据");
		return false;
	}else{
		submitForm("<%=context %>/StudentServlet?pageNum=${result.totalPage}");
		return true;
	}
}
function initPage(){
	var genderRequest = "${gender}" ;
	var genderVal = 0;
	var genderElement = document.getElementById("gender");
	if(genderRequest != ""){
		genderVal = parseInt(genderRequest);
	}
	
	var options = genderElement.options;
	var i = 0;
	for(i = 0; i < options.length; i++){
		if(options[i].value == genderVal){
			options[i].selected=true;
			break;
		}
	}
	
}
</script>
<body onload="initPage();">
	<div style="margin-left: 100px; margin-top: 100px;">
		<div>
			<font color="red">${errorMsg }</font>
		</div>
		<div>
			<form action="<%=context %>/StudentServlet"   id="stuForm"  method="post">
				姓名
				<input type="text" name="stuName" id="stu_name" style="width:120px" value="${stuName }">
				 
				性别
				<select name="gender" id="gender" style="width:80px">
					<option value="0">全部</option>
					<option value="1">男</option>
					<option value="2">女</option>
				</select>
				  
				<input type="submit" value="查询">
			</form>
		</div>		
		<br>
		学生信息列表:<br>
		<br>
		<!-- 后台返回结果为空 -->
		<c:if test="${fn:length(result.dataList) eq 0 }">
			<span>查询的结果不存在</span>
		</c:if>
		
		<!-- 后台返回结果不为空 -->
		<c:if test="${fn:length(result.dataList) gt 0 }">
			<table border="1px" cellspacing="0px"
				style="border-collapse: collapse">
				<thead>
					<tr height="30">
						<th width="130">姓名</th>
						<th width="130">性别</th>
						<th width="130">年龄</th>
						<th width="190">家庭地址</th>
					</tr>
				</thead>
					<c:forEach items="${result.dataList }" var="student">
						<tr>
							<td><c:out value="${student.stuName }"></c:out></td>
							<td>
								<c:if test="${ student.gender eq 1}">男</c:if>
								<c:if test="${ student.gender eq 2}">女</c:if>
							</td>
							<td><c:out value="${student.age }"></c:out></td>
							<td><c:out value="${student.address }"></c:out></td>
						</tr>
					</c:forEach>
			</table>
			<br> 共${result.totalRecord }条记录共${result.totalPage }页  当前第${result.currentPage }页  
			<a href="#" onclick="firstPage();">首页</a>   
			<a href="#" onclick="nextPage();">下一页</a>   
			<a href="#" onclick="previousPage();">上一页</a>  
			<a href="#" onblur="lastPage();">尾页</a>	
		</c:if>
	</div>
</body>
</html>
8.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <servlet>
    <servlet-name>StudentServlet</servlet-name>
    <servlet-class>com.wang.PaginationTest.servlet.StudentServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>StudentServlet</servlet-name>
    <url-pattern>/StudentServlet</url-pattern>
  </servlet-mapping>

</web-app>
9.启动服务,访问http://localhost:8088/PaginationTest/pagination.jsp ,成功!












猜你喜欢

转载自blog.csdn.net/guaituo0129/article/details/79254283