【Lehr】如何只依靠Jsp和Servlet实现网站的分页功能
分析问题
首先,要明确各个部分的数据需求:
Jsp
输入:总页码,该页的内容
总页码:
知道了总的页码才能打印出对应的跳转页面的点击链接。
该页的内容:
…这个当然要知道了
输出:跳转页码
跳转页码:
告诉Servlet你要跳转到哪一页,后端才能提供对应的数据。
Servlet
输入:跳转页码
跳转页码:
通过跳转页面,执行逻辑层业务,去数据库中取出对应的内容。
输出:总页码,该页的内容
总页码:
让前端去打印。
该页的内容:
让前端去打印。
数据库
输入:每页的文章数,跳转页码
每页的文章数:
提取数据
跳转页码:
提取数据
输出:该页的内容,总文章量
该页的内容:
从后端再传给前端
总文章量:
用来计算总页码的
Servlet部分的实现
代码
int nowPage = 1; //当前页码默认为第一页
if(request.getParameter("nowPage")!=null)
{
nowPage = Integer.valueOf(request.getParameter("nowPage"));
} //如果前端传入了页码,那么就改为前端传入的
int eachRow = 3; //这里规定每页显示3篇文章
int totalRow = 0; //总的文章数
int totalPage = 0; //总的页数
//得到文章总数
totalRow = dao.getTotalRow();
//得到本页的文章内容
List<Article> list = dao.getList(nowPage, eachRow);
//文章放入session传给前端
request.getSession().setAttribute("List", list);
//计算总页码
if(totalRow%eachRow==0) //如果刚好整除,就是那么多了
{
totalPage = totalRow/eachRow;
}
else //如果每页还单独多了几页,那就多生成一页
{
totalPage = totalRow/eachRow+1;
}
//把页码数传给前端
request.getSession().setAttribute("totalPage", totalPage);
//跳转回到主页
response.sendRedirect("View.jsp");
}
说明
这里我们需要有四个参数:
nowPage,eachRow,totalRow,totalPage
其中nowPage由前端获得,结合eachRow到数据库中进行筛选(后面会讲)。而totalRow和totalPage则是基于数据库获取,用于计算总的页码。
数据库部分的实现
原理
从上面的代码里发现,我们需要从数据库里得到总的文章数和当前页的内容。
所以接下来分别讲解这两个语句的关键部分。(JDBC代码量太大了我就不贴了,只写sql语句了XD)
得到文章数
SELECT COUNT(*) AS NUM FROM XXX
获取当前页的内容
SELECT * FROM ARTICLE ORDER BY DATE DESC LIMIT ?, ?
这个我要好好谈下…
为了获取指定页的内容,需要用到Limit
Limit后面有两个参数,分别表示从X行开始
,读取X条数据
很显然,从X行开始
就是我们要的数据的开始位置,比如,我们现在要看第三页,(每页有3条数据),那么第三页的第一条消息也就是第7条,是当前页数-1乘以每页条数的加一。(在草稿本上画一下就知道了XD)。
读取X条数据
其实就是我们规定的每页的条数。
所以,采集者的问号补充应该就是这样
st.setInt(1,(nowPage-1)*eachRow);
st.setInt(2,eachRow);
Jsp部分的实现
代码
利用JSTL配合EL表达式,前端部分的跳 转栏的代码可以简单的写成:
<div>
<ul>
<c:forEach begin="1" end="${sessionScope.totalPage }" var = "i" >
<li>
<a href="ShowServlet?nowPage=${i}">${i}</a>
</li>
</c:forEach>
</ul>
</div>
说明
简单解释一下,首先从后端接受到总页数(totalPage),然后逐个打印,动态生成对应的超链接。其中每个超链接会向后端传递自己对应的页数。
就这样
没了!