# 添加示例数据
假设我们每页显示2条,一共5条信息。使用navicat,向数据表中添加5条信息。
# 将当前页传入C层,并在V层中获取
采用分页字段page
## C层
```
package teacher;
...
public class Index {
...
// 当前页
private int page = 1;
// 每页大小
private int pageSize = 2;
// 显示接收到的page信息
public int getPage() {
return page;
}
// 接收请求的page信息
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
...
}
```
文件完整代码如下:
```
package teacher;
import java.util.List;
import entity.Teacher;
public class Index {
// 教师列表 类型为List,每项均为Teacher。
private List<Teacher> teachers;
// 当前页
private int page = 1;
// 每页大小
private int pageSize = 2;
// 显示接收到的page信息
public int getPage() {
return page;
}
// 接收请求的page信息
public void setPage(int page) {
this.page = page;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
// V层在展示数据teachers的时候,将自动调用该方法
public List<Teacher> getTeachers() {
return teachers;
}
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
// 获取教师列表
teachers = Teacher.all();
return "success";
}
}
```
## V层
/jsp/teacher/index.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="s" uri="/struts-tags"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>教师管理</title>
</head>
<body>
<h2>
当前页码:
<s:property value="page" />
<br />
每页大小:
<s:property value="pageSize" />
</h2>
<table>
<tr>
<th>序号</th>
<th>姓名</th>
<th>用户名</th>
<th>性别</th>
<th>邮箱</th>
</tr>
<!-- s为我们在文件头定位的标签前缀。iterator是struts用于循环输出List的标签 -->
<!-- teachers:自动调用C层的getTeachers();var=teacher:在循环体中使用的变量名 -->
<s:iterator value="teachers" var="teacher" status="status">
<tr>
<td><s:property value="#status.count" /></td>
<!-- property输出变量 teacher为内部变量,前面加入# -->
<td><s:property value="#teacher.name" /></td>
<td><s:property value="#teacher.username" /></td>
<td><s:property value="#teacher.sexAttr" /></td>
<td><s:property value="#teacher.email" /></td>
</tr>
</s:iterator>
</table>
<h4>
每页1条:<a href="?page=1&pageSize=1">1</a> <a href="?page=2&pageSize=1">2</a> <a href="?page=3&pageSize=1">3</a><br/>
每页2条:<a href="?page=1&pageSize=2">1</a> <a href="?page=2&pageSize=2">2</a> <a href="?page=3&pageSize=2">3</a><br />
每页3条:<a href="?page=1&pageSize=3">1</a> <a href="?page=2&pageSize=3">2</a> <a href="?page=3&pageSize=3">3</a><br />
</h4>
</body>
</html>
```
## 测试
d
# 建立分页方法
d
```
package entity;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Index;
import db.MysqlJavaee;
// 声明主体
@Entity
public class Teacher {
...
/**
* 分页数据
* @param page 第几页
* @param pageSize 每页大小
* @return
*/
static public List<Teacher> paginate(int page, int pageSize) {
// 实例化列表 teachers
List<Teacher> teachers = new ArrayList<Teacher>();
// 创建会话(这里的session也是会话的意思,我们以前接触的http中的session,处理的是用户与服务器的对话)
Session session = MysqlJavaee.getCurrentSession();
// 开启事务(使用缓冲池进行数据库的连接)
Transaction transaction = session.beginTransaction();
// 在这里,必须使用try catch finally语句。来确定会话正常关闭.
// 否则,当操作数据库产生错误时,你可能需要重启mysql服务
try {
// 查询Teacher表,注意:是Teacher ,而不是 teacher
Query query = session.createQuery("from Teacher");
// 计算并设置第一条记录的位置
int index = (page - 1) * pageSize;
query.setFirstResult(index);
// 每页大小
query.setMaxResults(pageSize);
teachers = query.list();
// 提交事务
transaction.commit();
// 捕获异常
} catch (HibernateException e) {
// 如果事务执行异常,则回滚事务
if (null != transaction) {
transaction.rollback();
}
// 打印异常
e.printStackTrace();
} finally {
// 如果session处于开启状态,则关闭session
if (session.isOpen()) {
// 关闭会话
session.close();
}
}
return teachers;
}
}
```
## 单元测试
```
package teacher;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import db.MysqlJavaee;
import entity.Teacher;
public class IndexTest {
@Test
public void paginate() {
List<Teacher> teachers = Teacher.paginate(1, 2);
for (Teacher teacher : teachers) {
System.out.println(teacher.toString());
}
}
```
测试结果:
```
Teacher [id=1, name=张三, username=zhangsan, email=zhangsan@yunzhiclub.com, sex=true, password=123]
Teacher [id=2, name=李四, username=lisi, email=lisi@yunzhiclub.com, sex=false, password=456]
```
> 自本节开始,我们在M层中,每建立一个新的方法,都会使用单元测试来进行验证。这是一个好习惯,也是一个必须要保持住的习惯。
# 调用分页方法
删除原来使用的all方法,改为我们刚刚建立的paginate方法。
```
// 该execute方法将被自动调用, 方法的返回类型必须为String
public String execute() {
// 获取教师列表
teachers = Teacher.paginate(page, pageSize);
return "success";
}
```
# 集成测试
我们再次刷新[http://localhost:8080/javaee/teacher/](http://localhost:8080/javaee/teacher/)进行测试。
> 官方文档:
- README
- 第一章:准备
- 第二章:Hello World!
- 第一节:查看工程文件
- 第二节:JDK、JRE与环境变量
- 第三节:index.jsp
- 第三章:Hello Struts
- 第一节:Web.xml
- 第二节:单入口
- 第三节:Hello Struts
- 第四节:触发C层
- 第四章:建立数据表
- 第一节:建立实体类
- 第二节:测试一
- 第三节:测试二
- 第四节:引入Hibernate
- 第五节:配置Hibernate
- 第六节:建立连接
- 第七节:实体类映射数据表
- 第八节:完善数据表
- 第五章:教师管理
- 第一节:增加数据--add
- 第二节:增加数据--save
- 1 获取传入数据数据
- 2 数据写入测试
- 3 对接C层
- 第三节:数据列表
- 1 获取数据
- 2 重构代码
- 3 C层对接--初始化
- 4 C层添加数据
- 5 V层显示数据
- 6 获取数据库中数据
- 7 显示性别
- 8 分页
- 9 条件查询
- 第四节:修改数据
- 1 edit
- 2 update
- 第五节:删除数据
- 第六节:总结
- 第六章:重构C层
- 第一节:继承ActionSupport类
- 第二节:数据验证
- 第七章:前台分离(前台)
- 第一节:环境搭建
- 第二节:运行环境
- 第三节:共享开发环境
- 第四节:生产环境
- 第八章:前台开发(前台)
- 第一节:本地化
- 第二节:教师列表
- 1 引入M层
- 2 模拟后台返回数据
- 3 C与M对接
- 4 C与V对接
- 第九章:前后台对接(前后台)
- 第一节:后台输出json(后台)
- 第二节:对接前台(全栈)
- 第二节:对接API(前台)
- 第二节:跨域请求(后台)
- 第三节:重构代码(前台)
- 第十章:重构后台M层
- 第一节:数据访问DAO层
- 第二节:项目整体重构
- 第十一章:用户登陆(前后台)
- 第一节:制定规范
- 第二节:定制测试用例
- 第三节:后台输入测试代码(后台)
- 第四节:postman(后台)
- 第五节:新建用户登陆模块(前台)
- 第六节:代码重构(前台)
- 第十二章:班级管理(前后台)
- 第一节:班级列表
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第二节:Add
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第三节:Save
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第四节:Edit
- 1 原型开发
- 2 制定规范
- 3 后台对接开发
- 4 前台对接开发
- 第五节:Update
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第六节:Delete
- 1 制定规范
- 2 后台对接开发
- 3 前台对接开发
- 第七节:小结
- 第十三章:班级管理(API)
- 第一节:ER图
- 第二节:create
- 1 实体层
- 2 dao层
- 3 service(server)层
- 4 action层
- 第三节:ManyToOne
- 第四节:Read
- 1 service(server)层
- 2 action层
- 第五节:update
- 1 service(server)层
- 2 action层
- 第六节:update
- 第十四章:重构服务层