MVC & 三层架构 & 分页-1月4日讲课内容
MVC & 三层架构
项目结构
--projectName
--src
--com
--fc
--dao
--impl
--bean
--filter
--service
--impl
--controller
--test
--util
--web
--WEB-INF
--classes
--lib
--after
--before
--css
--js
--fonts
--images
相关类别描述
类别 | 描述 |
---|---|
projectName | 项目名称 |
src | 存放Java代码 |
com.fc | 包名 |
bean | 存放实体类 |
dao | 数据层,用于执行与数据库相关的操作 |
dao.impl | 数据层的接口实现类 |
service | 业务层,用于业务的处理【都是接口】 |
service.impl | 业务层的接口实现类 |
controller | 控制层,用于和前端页面进行交互【Servlet】 |
util | 工具类 |
filter | 过滤器 |
listener | 监听器 |
test | 测试类 |
web | web 相关资源 |
WEB-INF | 无法通过 URL 访问的文件夹 |
classes | 存放编译过后的字节码文件 |
lib | 存放 jar 包 |
after | 存放台 html/jsp 页面 |
before | 存放前台 html/jsp 页面 |
css | 存放 css 文件资源 |
js | 存放 js 文件资源 |
fonts | 存放字体资源 |
images | 存放图片资源 |
没有涉及的可以不写
分页
分页相关参数
page | |
---|---|
pageNo | 当前页 |
pageCount | 总页数,总数据量除以每页显示的条数(不够再加1) |
pageSize | 每页显示多少条数据,用于限定查询中的条件 |
start | 每页中第一条数据(pageNo - 1 * pageSize),用于限定查询中的条件 |
totalCount | 总数据量,查询全部的结果 |
dataList | 每页中的所有数据,限定查询的结果 |
上一页 | 当前页 - 1,从第一页起 |
下一页 | 当前页 + 1,到最后一页为止 |
首页 | 当前页 = 1 |
尾页 | 总页数 pageCount |
分页信息实体类
/**
* 分页信息实体类,包含一些通用的参数
*
* @param <T> 泛型,对应实体类的类型
*/
public class PageInfo<T> {
// 总页数
private int pageCount;
// 数据总条数
private int totalCount;
// 每页显示的条数
private int pageSize;
// 当前页
private int pageNo;
// 当前页中的数据,可能有多条,声明一个List集合,泛型为对应实体类的类型
private List<T> list;
public PageInfo() {
}
public PageInfo(int totalCount, int pageSize, int pageNo, List<T> list) {
this.totalCount = totalCount;
this.pageSize = pageSize;
this.pageNo = pageNo;
this.list = list;
// 如果数据总数能够整除每页显示的条数
if (totalCount % pageSize == 0) {
// 总页数等于数据总条数除以每页显示多少条数据
this.pageCount = totalCount / pageSize;
} else {
// 无法整除,再增加一页
this.pageCount = totalCount / pageSize + 1;
}
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
@Override
public String toString() {
return "PageInfo{" +
"pageCount=" + pageCount +
", totalCount=" + totalCount +
", pageSize=" + pageSize +
", pageNo=" + pageNo +
", list=" + list +
'}';
}
}
dao 层接口
/**
* 学生数据操作接口,用来对数据库进行操作
*/
public interface StudentDao<T> {
/**
* 获取学生表中的数据的总量
*
* @return 数据总条数
*/
int getTotalCount();
/**
* 获取每页显示的数据
*
* @param start 从第几条数据开始
* @param pageSize 每页显示多少条数据
* @return 返回包含指定页中所有数据的集合
*/
List<T> getStudentsByPage(int start, int pageSize);
}
dao 层接口实现类
/**
* 学生数据操作接口实现类
*/
public class StudentDaoImpl implements StudentDao {
// 获取核心类对象
private QueryRunner queryRunner = new QueryRunner();
// 获取数据库连接
private Connection connection = JdbcUtilsOnC3P0.getConnection();
// 获取表中的总数量
@Override
public int getTotalCount() {
// 准备SQL语句
String sql = "select * from student";
// 提取结果集合
List<Student> list = null;
try {
// 执行SQL语句并获取List集合
list = queryRunner.query(connection, sql, new BeanListHandler<>(Student.class));
} catch (SQLException e) {
e.printStackTrace();
list = new ArrayList<>();
}
// 返回集合的长度
return list.size();
}
/**
* 获取每页中的数据
*
* @param start 从第几条数据开始
* @param pageSize 每页显示多少条数据
* @return 返回一个集合,包含一页中的所有数据
*/
@Override
public List<Student> getStudentsByPage(int start, int pageSize) {
// 准备SQL语句
String sql = "select * from student limit ?, ?";
// 准备参数
Object[] params = {start, pageSize};
// 提取集合
List<Student> list = null;
try {
// 执行SQL语句并获取包含数据的集合
list = queryRunner.query(connection, sql, new BeanListHandler<>(Student.class), params);
} catch (SQLException e) {
e.printStackTrace();
}
// 返回集合
return list;
}
}
业务层接口
/**
* 学生业务接口,用来实现业务逻辑
*/
public interface StudentService<T> {
/**
* 此方法用于获取分页信息
*
* @param pageNo 当前页码
* @param pageSize 每页显示多少条信息
* @return 返回分页信息实体类
*/
PageInfo<T> findStudentsByPage(String pageNo, int pageSize);
}
业务层接口实现类
/**
* 学生业务接口实现类
*/
public class StudentServiceImpl implements StudentService {
@Override
public PageInfo<Student> findStudentsByPage(String pageNo, int pageSize) {
// 获取学生数据层操作对象
StudentDao studentDao = new StudentDaoImpl();
// 通过数据层操作对象获取总数据量
int totalCount = studentDao.getTotalCount();
// 如果当前页码不存在
if (pageNo == null) {
// 默认使用第一页
pageNo = "1";
}
// String类型转化为int类型
int currentPage = Integer.parseInt(pageNo);
// 获取每一页中的第一条数据
int start = (currentPage - 1) * pageSize;
// 通过数据操作对象获取每一页要显示的数据
List<Student> students = studentDao.getStudentsByPage(start, pageSize);
// 声明分页信息对象,将总数据量,每页显示多少条数据,当前的页数,当前页的数据存入分页信息中
PageInfo<Student> studentPageInfo = new PageInfo<>(totalCount, pageSize, currentPage, students);
// 返回分页信息对象
return studentPageInfo;
}
}
控制层 Servlet
/**
* 控制层,通过Servlet与前端进行交互
*/
@WebServlet("/page")
public class FIndByPageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取显示的页数
String pageNo = req.getParameter("pageNo");
// 声明每页显示的条数
int pageSize = 5;
// 获取学生业务对象
StudentService studentService = new StudentServiceImpl();
// 通过业务对象执行获取分析信息对象
PageInfo<Student> pageInfo = studentService.findStudentsByPage(pageNo, pageSize);
// 设置请求对象的属性键值对
req.setAttribute("pageInfo", pageInfo);
// 转发到主页面
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
前端页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<%--固定高度--%>
<div style="height: 300px">
<%--学生信息表,居中边框1px--%>
<table border="1px" align="center">
<%--表头--%>
<caption><h1 align="center" style="color: greenyellow">学生信息表</h1></caption>
<%--标题栏--%>
<tr>
<th>学号</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>信息</th>
</tr>
<%--通过JSTL遍历学生信息--%>
<c:forEach var="student" items="${pageInfo.list}">
<%--通过EL表达式获取学生信息--%>
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.age}</td>
<td>${student.gender}</td>
<td>${student.info}</td>
</tr>
</c:forEach>
</table>
</div>
<%--form表单用来提交页码--%>
<form action="page" method="get">
<table align="right">
<tr>
<%--如果当前页为第一页,则首页和上一页设置无法选中--%>
<c:if test="${pageInfo.pageNo == 1}">
<td><a href="javascript:return false;" style="text-decoration: none; color: orangered">首页</a></td>
<td><a href="javascript:return false;" style="text-decoration: none; color: orangered">上一页</a></td>
</c:if>
<%--如果当前不为第一页--%>
<c:if test="${pageInfo.pageNo != 1}">
<%--设置首页直接跳转为第一页,传递pageNo为1--%>
<td><a href="page?pageNo=1" style="text-decoration: none">首页</a></td>
<%--设置上一页,传递pageNo为 当前页 - 1--%>
<td><a href="page?pageNo=${pageInfo.pageNo - 1}" style="text-decoration: none">上一页</a></td>
</c:if>
<%--遍历当前页数--%>
<c:forEach var="pageNo" varStatus="pageStatus" begin="1" end="${pageInfo.pageCount}">
<%--如果是当前页,就设置不可点击--%>
<c:if test="${pageNo == pageInfo.pageNo}">
<td><input type="submit" name="pageNo" value="${pageNo}" disabled></td>
</c:if>
<%--非当前页设置可点击--%>
<c:if test="${pageNo != pageInfo.pageNo}">
<td><input type="submit" name="pageNo" value="${pageNo}"></td>
</c:if>
</c:forEach>
<%--如果当前页为最后一页,则尾页和下一页设置无法选中--%>
<c:if test="${pageInfo.pageNo == pageInfo.pageCount}">
<td><a href="javascript:return false;" style="text-decoration: none; color: orangered">下一页</a></td>
<td><a href="javascript:return false;" style="text-decoration: none; color: orangered">尾页</a></td>
</c:if>
<%--如果当前不为最后一页--%>
<c:if test="${pageInfo.pageNo != pageInfo.pageCount}">
<%--设置下一页,传递pageNo为 当前页 + 1--%>
<td><a href="page?pageNo=${pageInfo.pageNo + 1}" style="text-decoration: none">下一页</a></td>
<%--设置尾页直接跳转为最后一页,传递pageNo为总页数--%>
<td><a href="page?pageNo=${pageInfo.pageCount}" style="text-decoration: none">尾页</a></td>
</c:if>
<%--从分页信息中获取数据总数和总页数--%>
<td>共${pageInfo.totalCount}条内容,共${pageInfo.pageCount}页</td>
</tr>
</table>
</form>
</body>
</html>