多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 添加示例数据 假设我们每页显示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/)进行测试。 > 官方文档: