目录
一、前端设计
二、分页功能
①创建实体层
②在DAO层新建两个方法
③编写业务层
④实现Servlet层
⑤修改前端页面
⑥测试
⑦思路
⑧扩展
一、前端设计
原来的前端非常简陋,没有明显的突出其功能,下面将对前端页面进行新的完善。
写一个标题模板,
head.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,com.qf.entity.*,java.text.*"
pageEncoding="utf-8"%>
<div id="header">
<div id="rightheader">
<p>
<%
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
out.println(sdf.format(date));
%>
<br />
</p>
</div>
<div id="topheader">
<h1 id="title">
<a href="#">主页</a>
</h1>
</div>
<div id="navigation">
</div>
</div>
然后将这个模板在其他页面进行引用
<%@ include file="head.jsp" %>
显示效果:
这种写法能帮我省去很多重复性的代码,将重复的页面模块写在一个jsp文件中,然后通过一句代码直接调用即可。
<%@ include file="xxx.jsp" %>
二、分页功能
当学生信息存入过多时,一张页面中数据往往是显示不全的,为此我们使用分页功能,可以更好的显示数据。
①创建实体层
package sams.ck.entity;
public class stuPage {
private int currentPage=1;//当前页 默认值为1
private int pageSize=5;//每页显示的最大记录条数
private int begin;//每页的起始位置
private int totalPage;//总页数
private int rows;//总记录行数
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getBegin() {
begin=(this.currentPage-1)*pageSize;
return begin;
}
public void setBegin(int begin) {
this.begin = begin;
}
public int getTotalPage() {
//总页数 =总行数%每页最大记录行数
totalPage=rows%pageSize==0?rows/pageSize:rows/pageSize+1;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
}
②在DAO层新建两个方法
//分页查询
public List<Student>findByPage(stuPage page) throws SQLException{
List<Student>stus=new ArrayList<Student>();
//链接数据库
Connection conn=DBUtil.getConnection();
//定义sql语句
String sql="select * from students limit ?,?";
try {
PreparedStatement prep=conn.prepareStatement(sql);
prep.setInt(1, page.getBegin());
prep.setInt(2, page.getPageSize());
ResultSet rs=prep.executeQuery();
//迭代结果集对象 将查询输出的数据封装到Stus对象当中
while(rs.next()){
Student stu=new Student();
stu.setStuId(rs.getString("number"));
stu.setStuName(rs.getString("name"));
stu.setStuClass(rs.getString("class"));
stu.setChineseScore(rs.getDouble("chinese"));
stu.setEnglisScore(rs.getDouble("english"));
stu.setMathScore(rs.getDouble("math"));
//将封装好的stu对象 添加到list集合中
stus.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}
return stus;
}
//查询总记录行数
public int findRows(stuPage page) throws SQLException {
int count=0;
Connection conn=DBUtil.getConnection();
String sql="select count(*) c from students";//给查询结果count(*)起别名为c
try {
PreparedStatement prep=conn.prepareStatement(sql);
ResultSet rs=prep.executeQuery();
if(rs.next()){
count=rs.getInt("c");
}
} catch (SQLException e) {
e.printStackTrace();
}
return count;
}
③编写业务层
//查询分页信息
public List<Student> findByPage(stuPage page) throws SQLException{
return dao.findByPage(page);
}
//查询总记录行数
public int findRows(stuPage page) throws SQLException{
return dao.findRows(page);
}
④实现Servlet层
//根据处理后的字符串来判断用户的请求
if(path.equals("/stuList")){
// 获取浏览器端传递的参数 要查询的页数
String current = request.getParameter("current");
// 创建一个分页信息
stuPage page = new stuPage();
try {
// 查询总记录行数
int rows = service.findRows(page);
// 将查询出的总行数 添加到 page当中
page.setRows(rows);
// 判断current的值是否为null值 如果不是 null
if (current != null) {
int cur = Integer.parseInt(current);
page.setCurrentPage(cur);
}
} catch (SQLException e) {
e.printStackTrace();
}
//调用业务层的代码 获取所有的员工信息
List<Student> stus;
try {
stus = service.findByPage(page);
request.setAttribute("stus", stus);
} catch (SQLException e) {
e.printStackTrace();
}
//将查询到的数据 传递给视图页面 由视图页面将数据返回给浏览器 展示在用户面前
//step1 先将数据绑定到request对象上
request.setAttribute("page", page);
//step2 获取转发器
RequestDispatcher dis=request.getRequestDispatcher("stuList.jsp");
//step3 转发
dis.forward(request, response);
}
⑤修改前端页面
<%
stuPage p=(stuPage)request.getAttribute("page");
int cur=p.getCurrentPage();
int totalPage=p.getTotalPage();
%>
<p>
<%
if(cur!=1){
%>
<a href="stuList.do?current=<%=cur-1%>">上一页</a>
<%
}
%>
<%
for(int i=1;i<=totalPage;i++){
%>
<a href="stuList.do?current=<%=i%>"><%=i %></a>
<%
}
%>
<%
if(cur!=totalPage){
%>
<a href="stuList.do?current=<%=cur+1%>">下一页</a>
<%
}
%>
</p>
⑥测试
⑦思路
我们要分页查看数据,分页查看和整体查看本质区别是什么?
整体查看sql:
select * from students;
分页查看sql:
select * from students limit 1,2
分页其实就是带有限制条件的查询全部数据。limit(a,b)就是显示数据表中的a到b条数据。那么b-a就是每页显示的内容数量。
我们通过创建实体类, 定义了以下属性
private int currentPage=1;//当前页 默认值为1
private int pageSize=5;//每页显示的最大记录条数
private int begin;//每页的起始位置
private int totalPage;//总页数
private int rows;//总记录行数
可以方便我们调整设置显示数量和起始位置。
比如获取当前页数:
public int getBegin() {
begin=(this.currentPage-1)*pageSize;
return begin;
}
获取总页数
public int getTotalPage() {
//总页数 =总行数%每页最大记录行数
totalPage=rows%pageSize==0?rows/pageSize:rows/pageSize+1;
return totalPage;
}
有了实体类我们就可以通过实体属性来操作数据库了。在dao层,我们查询出每页的数据信息和全部数据条数。此方法可直接在业务层使用。
在前端页面和Servlet层中,我们通过request传递前端返回的数据,通过setAtrribute绑定实体
request.setAttribute("page", page);
从而动态实现前后端数据的交互。根据点击前端的翻页按钮,改变当前所在页,Servlet再获取到当前页后,通过调用业务层的方法实现显示正确的分页内容。
⑧扩展
在上述例子里,我们的搜索功能是在一个新的页面显示的结果,如果我们想在当前列表页面显示结果,那就一定也会使用分页功能。那么就需要定义一个新的变量,用来定义搜索内容。然后根据这个定义的搜索变量来判断是否需要分页,如何分页。
代码实现:
根据上述案例对搜索进行修改,假设搜索结果显示在当前列表界面,搜索条件是学号,那么代码如下:
实体层:
package sams.ck.entity;
public class stuPage {
private int currentPage=1;//当前页 默认值为1
private int pageSize=5;//每页显示的最大记录条数
private int begin;//每页的起始位置
private int totalPage;//总页数
private int rows;//总记录行数
//搜过功能的条件
private String number=null;
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getBegin() {
begin=(this.currentPage-1)*pageSize;
return begin;
}
public void setBegin(int begin) {
this.begin = begin;
}
public int getTotalPage() {
//总页数 =总行数%每页最大记录行数
totalPage=rows%pageSize==0?rows/pageSize:rows/pageSize+1;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
}
dao层:
//分页查询
public List<Student>findByPage(stuPage page) throws SQLException{
List<Student>stus=new ArrayList<Student>();
//链接数据库
Connection conn=DBUtil.getConnection();
if(page.getNumber()==null){
//定义sql语句
String sql="select * from students limit ?,?";
try {
PreparedStatement prep=conn.prepareStatement(sql);
prep.setInt(1, page.getBegin());
prep.setInt(2, page.getPageSize());
ResultSet rs=prep.executeQuery();
//迭代结果集对象 将查询输出的数据封装到Stus对象当中
while(rs.next()){
Student stu=new Student();
stu.setStuId(rs.getString("number"));
stu.setStuName(rs.getString("name"));
stu.setStuClass(rs.getString("class"));
stu.setChineseScore(rs.getDouble("chinese"));
stu.setEnglisScore(rs.getDouble("english"));
stu.setMathScore(rs.getDouble("math"));
//将封装好的stu对象 添加到list集合中
stus.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}
return stus;
}else {
//定义sql语句
String sql="select * from students where number=? limit ?,?";
try {
PreparedStatement prep=conn.prepareStatement(sql);
prep.setString(1, page.getNumber());
prep.setInt(2, page.getBegin());
prep.setInt(3, page.getPageSize());
ResultSet rs=prep.executeQuery();
//迭代结果集对象 将查询输出的数据封装到Stus对象当中
while(rs.next()){
Student stu=new Student();
stu.setStuId(rs.getString("number"));
stu.setStuName(rs.getString("name"));
stu.setStuClass(rs.getString("class"));
stu.setChineseScore(rs.getDouble("chinese"));
stu.setEnglisScore(rs.getDouble("english"));
stu.setMathScore(rs.getDouble("math"));
//将封装好的stu对象 添加到list集合中
stus.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}
return stus;
}
}
//查询总记录行数
public int findRows(stuPage page) throws SQLException {
int count=0;
Connection conn=DBUtil.getConnection();
if(page.getNumber()==null){
String sql="select count(*) c from students";//给查询结果count(*)起别名为c
try {
PreparedStatement prep=conn.prepareStatement(sql);
ResultSet rs=prep.executeQuery();
if(rs.next()){
count=rs.getInt("c");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return count;
}else {
String sql="select count(*) c from students where number=?";
try {
PreparedStatement prep=conn.prepareStatement(sql);
prep.setString(1, page.getNumber());
ResultSet rs=prep.executeQuery();
if(rs.next()){
count=rs.getInt("c");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return count;
}
}
service层:
//查询分页信息
public List<Student> findByPage(stuPage page) throws SQLException{
return dao.findByPage(page);
}
//查询总记录行数
public int findRows(stuPage page) throws SQLException{
return dao.findRows(page);
}
servlet层:
//根据处理后的字符串来判断用户的请求
if(path.equals("/stuList")){
String number = request.getParameter("stuId");
// 获取浏览器端传递的参数 要查询的页数
String current = request.getParameter("current");
// 创建一个分页信息
stuPage page = new stuPage();
if (number != null) {
// 说明用户搜索时 提交了数据
// 将搜索条件 放入到stuPage对象中
if (number.length() != 0) {
page.setNumber(number);
}
}
try {
// 查询总记录行数
int rows = service.findRows(page);
// 将查询出的总行数 添加到 page当中
page.setRows(rows);
// 判断current的值是否为null值 如果不是 null
if (current != null) {
int cur = Integer.parseInt(current);
page.setCurrentPage(cur);
}
} catch (SQLException e) {
e.printStackTrace();
}
//调用业务层的代码 获取所有的员工信息
List<Student> stus;
try {
stus = service.findByPage(page);
request.setAttribute("stus", stus);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将查询到的数据 传递给视图页面 由视图页面将数据返回给浏览器 展示在用户面前
//step1 先将数据绑定到request对象上
request.setAttribute("page", page);
//step2 获取转发器
RequestDispatcher dis=request.getRequestDispatcher("stuList.jsp");
//step3 转发
dis.forward(request, response);
前端:
<%@page import="sams.ck.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.List,sams.ck.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Student List</title>
<%@ include file="head.jsp" %>
</head>
<body>
<table width='500px' border='5px' class="table" >
<form action="toInquiryStu.do" method="post">
<input placeholder="请输入您的学号" name="stuId" ><input type="submit" value="查询">
</form>
 
<input type="button" class="button" value="添加" onclick="location='addStu.jsp'"/>
<tr>
<td>学号</td>
<td>姓名</td>
<td>班级</td>
<td>语文</td>
<td>数学</td>
<td>英语</td>
<td>总分</td>
<td>操作</td>
</tr>
<%
//java代码
//到request中取出 绑定的数据
List<Student>stus=(List<Student>)request.getAttribute("stus");
//循环迭代 数据并显示
for(Student stu:stus){
%>
<tr>
<td>
<%=stu.getStuId() %>
</td>
<td>
<%=stu.getStuName() %>
</td>
<td>
<%=stu.getStuClass() %>
</td>
<td>
<%=stu.getChineseScore() %>
</td>
<td>
<%=stu.getMathScore() %>
</td>
<td>
<%=stu.getEnglisScore() %>
</td>
<td>
<%=stu.getEnglisScore()+stu.getMathScore()+stu.getChineseScore() %>
</td>
<td>
<input type="button" class="button" value="删除" onclick="location='delStu.do?stuId=<%=stu.getStuId() %>'"/>
<input type="button" class="button" value="修改" onclick="location='toUpdateStu.do?stuId=<%=stu.getStuId() %>'"/>
</td>
</tr>
<%} %>
</table>
<%
stuPage p=(stuPage)request.getAttribute("page");
int cur=p.getCurrentPage();
int totalPage=p.getTotalPage();
%>
<p>
<%
if(cur!=1){
%>
<a href="stuList.do?current=<%=cur-1%>">上一页</a>
<%
}
%>
<%
for(int i=1;i<=totalPage;i++){
%>
<a href="stuList.do?current=<%=i%>"><%=i %></a>
<%
}
%>
<%
if(cur!=totalPage){
%>
<a href="stuList.do?current=<%=cur+1%>">下一页</a>
<%
}
%>
</p>
</body>
</html>