javaweb新闻数据分页

目录

序言:

1.分页显示的步骤

确定每页显示数据的数量

计算显示的页数

编写SQL语句

2.使用分页功能的案例

数据库编译语句:

新闻发布系统改动:

主页(index):

NewsDao


序言:

在开发过程中,经常做的一件事情,也是最基本的事情,就是从数据库查询数据,然后在客户端显示出来。当数据较少的时候,可以在一个页面显示出来,然而,如果数据多达上百条、上千条呢?如果继续使用列表,那表格应该多长啊?这时我们就能够使用分页技术。

1.分页显示的步骤

  • 确定每页显示数据的数量

  • 计算显示的页数

  • 编写SQL语句

2.使用分页功能的案例

数据库编译语句:

select * from (select a.*,ROWNUM myr from t_news a where news_title like ?) b where myr between ? and ?

这里使用的是rownum伪列,特点嘞就不细讲了,之前oracle文章中有提过,可以理解为中的虚列,这里使用rownum就很好解决了id若删除就不存在了,导致使用id直接查询会出现漏洞,而rownum就不会,它无论如何都会向后一次排序的。

注意:我们在使用rownum的时候很容易就犯一个错,因为它本身具有递推性,所以只能从1开始的,如果要做取区间的只能将其变成实列才能够实现。操作语句如上。

新闻发布系统改动:

主页(index):

<%@page import="com.yilin.pojo.News"%>
<%@page import="com.yilin.dao.NewsDao"%>
<%@page import="com.yilin.util.DBHelper"%>
<%@page import="javax.servlet.http.Cookie"%>
<%@page import="java.nio.charset.StandardCharsets"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="oracle.jdbc.driver.OracleDriver"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
/**
*新闻主页
*/
%>

<!DOCTYPE html>
<html lang="zh">

<head>
<meta charset="UTF-8">
<title>bootstrap</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet"
	href="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/css/bootstrap.css">
<script
	src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/jquery-3.5.1.js"></script>
<script
	src="${pageContext.request.contextPath}/bootstrap-3.3.7-dist/js/bootstrap.js"></script>
<style>
* {
	outline: none !important;
}

body, html {
	background: #7f8d90;
}

nav, .breadcrumb {
	border-radius: 0px !important;
	margin-bottom: 0px !important;
}

.breadcrumb {
	margin-bottom: 20px !important;
	background: #36485c;
	color: white;
}

li h4 {
	width: 300px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.breadcrumb .active {
	color: yellow;
}
</style>
</head>

<body>
	<%--include 包含--%>
	<%@include file="top.jsp"%>

	<ol class="breadcrumb">
		<li>您当前的位置是</li>
		<li>新闻发布系统</li>
		<li class="active">首页</li>
	</ol>

	<form class="form-inline" style="margin: 0px auto 20px;" action="${pageContext.request.contextPath}/news/index.jsp" method="get">
		<div class="form-group" style="display: block; text-align: center;">
			<div class="input-group">
				<div class="input-group-addon">新闻标题</div>
				<input type="text" name="newName" class="form-control" placeholder="请在此输入搜索的关键字">
				<span class="input-group-btn">
					<button type="submit" class="btn btn-primary">搜索🔍</button>
				</span>
			</div>
		</div>
	</form>

	<div class="container">
		<ul class="list-group">
		
			<%
			
			//点击表单后应该在页面上携带newname用来充当查询的关键字
			String newName = request.getParameter("newName");
			if (newName == null) {
				newName = "";//进行查询所有
			}
			//拿值的时候会发现出现乱码的情况,这个时候可以将数据先变成字节的形式再变成字符的形式(破碎重组)
			//newName = new String(newName.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
			
			//设置当前用户进行分页的名字为page
			String index=request.getParameter("page");
			int n=1;//设置默认的页数为1
			if(index!=null){
				n=Integer.parseInt(index);//设置为你携带的页数
			}
			request.setCharacterEncoding("utf-8");
			
			//查询当前数据对应的页数
			int maxPage=new NewsDao().queryCount(newName);
			
			
			for(News news:new NewsDao().queryByName(newName,n)){
			%>
			<li class="list-group-item">
				<h4 class="list-group-item-heading">
					<a href="${pageContext.request.contextPath}/news/read.jsp?newId=<%=news.getNewsId()%>" data-placement="bottom" data-toggle="tooltip" href="" title="<%=news.getNewsTitle()%>"><%=news.getNewsTitle()%></a>				
                </h4>
				<p class="list-group-item-text text-right">
					<span class="glyphicon glyphicon-user"><code><%=news.getNewsAuthor()%></code></span>
					<span class="glyphicon glyphicon-eye-open"><code><%=news.getNewsCount()%></code></span>
					<span class="glyphicon glyphicon-tag"><code><%=news.getNewsComment()%></code></span>
					<span class="glyphicon glyphicon-time"><code><%=news.getNewsPublisher()%></code></span>
				</p>
			</li>
			<%
			}
			%>
		</ul>
	</div>
	<div class="container text-center">
		<ul class="pagination" style="margin: 20px auto;">
			<li><a href="index.jsp?page=<%=Math.max(n - 1, 1)%>&newName=<%=newName%>"><span>&laquo;</span></a></li>
			<%
            //动态生成(根据最大的页数)
            for(int i=1;i<=maxPage;i++){
        	%>
       		<li class="<%=i==n?"active":""%>"><a href="index.jsp?page=<%=i%>&newName=<%=newName%>"><%=i%></a></li>
        	<%
           		}
       	 	%>
        	<li><a href="index.jsp?page=<%=Math.min(n+1,maxPage)%>&newName=<%=newName%>"><span>&raquo;</span></a></li>
		</ul>
	</div>
	<script>
		$(function() {
			$('[data-toggle="tooltip"]').tooltip({
				trigger : "hover"
			})
		})
	</script>
</body>
</html>

NewsDao

在功能类中主要做了模糊查询的优化,并且查询了最大页数。

package com.yilin.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.yilin.pojo.News;
import com.yilin.util.DBHelper;

/**
 * 功能类
 * 
 * @author 一麟
 *
 */
public class NewsDao {
	private Connection con;
	private PreparedStatement ps;
	private ResultSet rs;


	/**
	 * 增加新闻
	 * 
	 * @param n 新闻对象
	 * @return 返还受影响行数
	 */
	public int add(News n) {
		try {
			con = DBHelper.getCon();
			ps = con.prepareStatement(
					"insert into t_news(news_id, news_title, news_topic, news_author, news_publisher, news_content) values(?,?,?,?,?,?)");
			// 赋值(注意:数据一定要一一对应)
			ps.setInt(1, n.getNewsId());// 新闻的编号
			ps.setString(2, n.getNewsTitle());// 新闻的标题
			ps.setInt(3, n.getNewsTopic());// 新闻的类型
			ps.setString(4, n.getNewsAuthor());// 新闻的作者
			ps.setString(5, n.getNewsPublisher());// 新闻的发布时间
			ps.setString(6, n.getNewsContent());// 新闻的内容
			return ps.executeUpdate();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		} finally {
			DBHelper.close(con, ps, null);
		}
		return 0;
	}

	/**
	 * 根据新闻的标题进行模糊查询
	 * 
	 * @param newName 新闻标题
	 * @param page    页数
	 * @return 结果集合
	 */
	public List<News> queryByName(String newName, int page/* 页数 */) {
		int rows = 5;// 条数
		int begin = 1 + ((page - 1) * rows);// 开始位置
		int end = page * rows;// 结束位置
		List<News> list = new ArrayList<News>();
		try {
			con = DBHelper.getCon();
			ps = con.prepareStatement(
					"select * from (" + "    select a.*,ROWNUM myr from t_news a where news_title like ?"
							+ ") b where myr between ? and ?");
			ps.setString(1, "%" + newName + "%");
			ps.setInt(2, begin);
			ps.setInt(3, end);
			rs = ps.executeQuery();
			while (rs.next()) {
				News news = new News();
				// 给新闻对象属性赋值
				news.setNewsId(rs.getInt(1));
				news.setNewsTitle(rs.getString(2));
				news.setNewsTopic(rs.getInt(3));
				news.setNewsAuthor(rs.getString(4));
				news.setNewsPublisher(rs.getString(5));
				news.setNewsContent(rs.getString(6));
				news.setNewsCount(rs.getInt(7));
				news.setNewsComment(rs.getInt(8));
				// 将新闻对象添加到集合中
				list.add(news);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBHelper.close(con, ps, rs);
		}
		return list;
	}

	/**
	 * 查询页数
	 * 
	 * @param newName 新闻标题
	 * @return 返还受影响行数
	 */
	public int queryCount(String newName) {
		int rows = 5;// 初始条数设置为5
		int count = 0;// 数据库中数据的数量,初始值为0
		try {
			con = DBHelper.getCon();
			ps = con.prepareStatement("select count(1) from T_NEWS where NEWS_TITLE like ?");
			ps.setString(1, "%" + newName + "%");
			rs = ps.executeQuery();
			if (rs.next()) {
				count = rs.getInt(1);// 数据库的条数
			}
			// 返回页数用Double包装类
			// Math.ceil(),使用math对象中的取整函数
			return new Double(Math.ceil(count * 1.0 / rows)).intValue();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DBHelper.close(con, ps, rs);
		}
		return 0;
	}
}

 效果图:

tip:由于数据有限,图中只有四组数据,所有只有一页,但是因为我们做的是动态增加,所以页数会随着数据的增加而增加。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaWeb 中实现分页功能,你可以按照以下步骤进行操作: 1. 首先,在页面上显示数据的地方,需要获取总记录数。你可以通过数据库查询语句或其他方式获取到总记录数。 2. 然后,确定每页显示的记录数和当前页码。你可以设定一个固定的每页记录数,比如每页显示 10 条记录。当前页码可以通过用户点击页面上的页码按钮或其他方式获取。 3. 计算总页数。将总记录数除以每页记录数,然后向上取整即可得到总页数。 4. 计算当前页的起始记录索引。通过当前页码和每页记录数来计算起始记录索引。假设每页显示 10 条记录,当前页码为 1,则起始记录索引为 0;当前页码为 2,则起始记录索引为 10,依此类推。 5. 编写 SQL 查询语句,使用 LIMIT 关键字来限制查询结果的范围。例如,在 MySQL 中可以使用以下语句来实现分页查询: ```sql SELECT * FROM your_table LIMIT start_index, page_size; ``` 其中,`start_index` 是起始记录索引,`page_size` 是每页记录数。 6. 执行查询并将结果展示在页面上。 7. 在页面上显示分页导航条,包括上一页、下一页、首页、末页等按钮。根据当前页码和总页数来确定按钮的状态和链接。 8. 处理用户点击分页按钮的请求。根据用户点击的按钮类型(上一页、下一页、首页、末页等),计算新的当前页码,然后重新执行查询并更新页面内容。 通过以上步骤,你就可以在 JavaWeb 中实现分页功能了。当然,具体的实现方式可能会根据你使用的框架或工具有所不同,但基本思路是一样的。祝你成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一麟yl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值