JavaEE框架技术

彭红伟、骆丽华、李康顺、聂鹏、袁大伟、孟雨、王诗雅、张新伟、聂军、谢备

目录

  • 1 初识MyBatis框架
    • 1.1 框架概述
    • 1.2 框架的优势
    • 1.3 当前主流框架
    • 1.4 传统JDBC的劣势
    • 1.5 MyBatis概述
    • 1.6 MyBatis环境搭建
    • 1.7 MyBatis入门程序
    • 1.8 MyBatis工作原理
    • 1.9 扩展阅读
    • 1.10 章节测试
  • 2 MyBatis的核心配置
    • 2.1 SqlSessionFactoryBuilder对象
    • 2.2 SqlSessionFactory对象
    • 2.3 SqlSession对象
    • 2.4 MyBatis配置文件的主要元素
    • 2.5 <properties>元素
    • 2.6 <settings>元素
    • 2.7 <typeAliases>元素
    • 2.8 <environments>元素
    • 2.9 <mappers>元素
    • 2.10 MyBatis映射文件中的常用元素
    • 2.11 <select>元素
    • 2.12 <insert>元素
    • 2.13 <update>元素
    • 2.14 <delete>元素
    • 2.15 <sql>元素
    • 2.16 <resultMap>元素
    • 2.17 案例:员工管理系统
    • 2.18 扩展阅读
    • 2.19 章节测试
  • 3 动态SQL
    • 3.1 动态SQL中的元素
    • 3.2 <if>元素
    • 3.3 <choose>、<when>、<otherwise>元素
    • 3.4 <where>元素
    • 3.5 <trim>元素
    • 3.6 更新操作
    • 3.7 <foreach>元素中的属性
    • 3.8 <foreach>元素迭代数组
    • 3.9 <foreach>元素迭代List
    • 3.10 <foreach>元素迭代Map
    • 3.11 案例:学生信息查询系统
    • 3.12 扩展阅读
    • 3.13 章节测试
  • 4 MyBatis的关联映射和缓存机制
    • 4.1 关联映射概述
    • 4.2 一对一查询
    • 4.3 一对多查询
    • 4.4 多对多查询
    • 4.5 一级缓存
    • 4.6 二级缓存
    • 4.7 案例:商品的类别
    • 4.8 扩展阅读
    • 4.9 章节测试
  • 5 MyBatis的注解开发
    • 5.1 @Select注解
    • 5.2 @Insert注解
    • 5.3 @Update注解
    • 5.4 @Delete注解
    • 5.5 @Param注解
    • 5.6 一对一查询
    • 5.7 一对多查询
    • 5.8 多对多查询
    • 5.9 案例:基于MyBatis注解的学生 管理程序
    • 5.10 扩展阅读
    • 5.11 章节测试
  • 6 初识Spring框架
    • 6.1 Spring概述
    • 6.2 Spring框架的优点
    • 6.3 Spring的体系结构
    • 6.4 Spring 5的新特性
    • 6.5 Spring的下载及目录结构
    • 6.6 Spring的入门程序
    • 6.7 控制反转的概念
    • 6.8 依赖注入的概念
    • 6.9 依赖注入的类型—构造方法注入
    • 6.10 依赖注入的类型—属性setter方法注入
    • 6.11 依赖注入的应用
    • 6.12 扩展阅读
    • 6.13 章节测试
  • 7 Spring中的Bean的管理
    • 7.1 BeanFactory接口
    • 7.2 ApplicationContext接口
    • 7.3 Bean的配置
    • 7.4 构造方法实例化
    • 7.5 静态工厂实例化
    • 7.6 实例工厂实例化
    • 7.7 singleton作用域
    • 7.8 prototype作用域
    • 7.9 基于XML的装配
    • 7.10 基于注解的装配
    • 7.11 自动装配
    • 7.12 Bean的生命周期
    • 7.13 扩展阅读
    • 7.14 章节测试
  • 8 Spring AOP
    • 8.1 Spring AOP概述
    • 8.2 Spring AOP术语
    • 8.3 JDK动态代理
    • 8.4 CGLib动态代理
    • 8.5 基于XML的AOP实现
    • 8.6 基于注解的AOP实现
    • 8.7 扩展阅读
    • 8.8 章节测试
  • 9 Spring的数据库编程
    • 9.1 JdbcTemplate概述
    • 9.2 Spring JDBC的配置
    • 9.3 excute()方法
    • 9.4 update()方法
    • 9.5 query()方法
    • 9.6 事务管理的核心接口
    • 9.7 事务管理的方式
    • 9.8 基于XML方式的声明式事务
    • 9.9 基于注解方式的声明式事务
    • 9.10 案例:实现用户登录
    • 9.11 扩展阅读
    • 9.12 章节测试
  • 10 初识Spring MVC框架
    • 10.1 Spring MVC概述
    • 10.2 Spring MVC特点
    • 10.3 Spring MVC入门程序
    • 10.4 Spring MVC工作原理
    • 10.5 扩展阅读
    • 10.6 章节测试
  • 11 Spring MVC的核心类和注解
    • 11.1 DispatcherServlet类
    • 11.2 @Controller注解
    • 11.3 @RequestMapping注解的使用
    • 11.4 @RequestMapping注解的属性
    • 11.5 请求映射方式
    • 11.6 扩展阅读
    • 11.7 章节测试
  • 12 Spring MVC数据绑定和相应
    • 12.1 数据绑定
    • 12.2 默认类型数据绑定
    • 12.3 简单数据类型绑定
    • 12.4 POJO绑定
    • 12.5 自定义类型转换器
    • 12.6 数组绑定
    • 12.7 集合绑定
    • 12.8 复杂POJO绑定—属性为对象类型的数据绑定
    • 12.9 复杂POJO绑定—属性为List类型的数据绑定
    • 12.10 复杂POJO绑定—属性为Map类型的数据绑定
    • 12.11 JSON数据绑定
    • 12.12 返回值为void类型的页面跳转
    • 12.13 返回值为String类型的页面跳转—不携带数据
    • 12.14 返回值为String类型的页面跳转—携带数据
    • 12.15 返回值为ModelAndView类型的页面跳转
    • 12.16 普通字符串的回写
    • 12.17 JSON数据的回写—对象数据转换成JSON数据后的回写
    • 12.18 JSON数据的回写—集合数据转换成JSON数据后的回写
    • 12.19 扩展阅读
    • 12.20 章节测试
  • 13 Spring MVC的高级功能
    • 13.1 简单异常处理器
    • 13.2 自定义异常处理器
    • 13.3 异常处理注解
    • 13.4 拦截器概述
    • 13.5 拦截器的配置
    • 13.6 拦截器的执行流程—单个拦截器
    • 13.7 拦截器的执行流程—多个拦截器
    • 13.8 案例:后台系统登录验证
    • 13.9 文件上传
    • 13.10 文件下载
    • 13.11 案例:文件上传和下载
    • 13.12 扩展阅读
    • 13.13 章节测试
  • 14 SSM框架整合
    • 14.1 常用方式整合思路
    • 14.2 项目基础结构搭建
    • 14.3 Spring和MyBatis整合
    • 14.4 Spring和Spring MVC整合
    • 14.5 纯注解方式整合思路
    • 14.6 纯注解SSM框架整合
    • 14.7 扩展阅读
    • 14.8 章节测试
  • 15 云借阅图书管理系统
    • 15.1 系统概述
    • 15.2 数据库设计
    • 15.3 系统环境搭建
    • 15.4 用户登录
    • 15.5 实现登录验证
    • 15.6 注销登录
    • 15.7 新书推荐
    • 15.8 图书借阅
    • 15.9 当前借阅
    • 15.10 借阅记录
    • 15.11 访问权限控制
    • 15.12 扩展阅读
    • 15.13 章节测试
当前借阅

★学习目标:

1、掌握云借阅系统的当前借阅

★思考任务:

1、当前借阅有那些功能?

★任务学习:

★知识要点:

1、查询图书

当前借阅模块的图书查询和图书借阅模块中的图书查询类似,可以按条件查询图书,如果不输入查询条件,就查询全部图书。对查询结果也进行分页显示。

step 1: 实现DAO层:由于普通用户和管理员用户查询出的当前借阅的图书信息并不相同,所以可以定义2个不同的方法来供Service层调用。在BookMapper接口中新增2个方法selectMyBorrowed()和selectBorrowed(),selectMyBorrowed()方法用于查询当前用户未归还的图书信息,selectBorrowed()方法用于查询当前用户未归还和所有待确认归还的图书信息。

step 2:实现Service层:在BookService接口中添加一个查询当前借阅图书的方法searchBorrowed(),具体代码如下所示。

// 查询当前借阅的图书

PageResult searchBorrowed(

Book book, 

User user, 

Integer pageNum, 

Integer pageSize);

step 3:BookServiceImpl类中重写BookService接口的searchBorrowed()方法,

public PageResult searchBorrowed(Book book, User user, Integer pageNum,

Integer pageSize) {

    PageHelper.startPage(pageNum, pageSize); // 设置分页查询的参数,开始分页

    Page<Book> page;

    book.setBorrower(user.getName()); //将当前登录的用户放入查询条件中

    //如果是管理员,查询当前用户借阅但未归还的图书和所有待确认归还的图书

    if("ADMIN".equals(user.getRole())) {

        page= bookMapper.selectBorrowed(book);

    } else {//如果是普通用户,查询当前用户借阅但未归还的图书

        page= bookMapper.selectMyBorrowed(book); }

    return new PageResult(page.getTotal(),page.getResult()); }

step 4:实现Controller:在BookController.java文件的BookController类中新增一个查询当前借阅图书的方法searchBorrowed()。(这个查询当前借阅图书的方法省略)

step 5:实现页面效果:在后台首页main.jsp的导航侧栏中,配置“当前借阅”超链接的目标路径。配置代码如下所示。 

<li>

    <a href="${pageContext.request.contextPath}/book/searchBorrowed"

target="iframe">

        <i class="fa fa-circle-o"></i>当前借阅

    </a>

</li>

step 6:启动项目,使用管理员账号登录系统,单击导航侧栏中的“当前借阅”超链接,页面显示效果如图所示。 



2、归还图书

在归还图书时,需要由借阅者先在系统中提交归还图书的申请,然后将图书归还到指定还书点,管理员确认图书归还后,图书才真正归还成功。

  当用户申请归还图书时,只需在当前借阅的图书列表中,单击右侧的“归还”按钮选择归还图书即可,申请归还后,图书的状态由借阅中变为归还中。 

step 1:实现DAO层:提交归还图书的申请,只是修改图书的借阅状态,因此复用BookMapper接口的editBook()方法即可。 (这个复用editBook()编辑图书信息的方法省略)

step 2:实现Service层:在BookService接口中添加一个归还图书的方法returnBook(),具体代码如下所示。

boolean returnBook(

String  id,

User user

);

step 3:在BookServiceImpl类中重写BookService接口的returnBook()方法,具体代码如下所示。

public boolean returnBook(String id,User user) {

    // 根据图书id查询出图书的完整信息

    Book book = this.findById(id);

    // 再次核验当前登录人员和图书借阅者是不是同一个人

    boolean rb=book.getBorrower().equals(user.getName());

    // 如果是同一个人,允许归还

    if(rb) { 

        // 将图书借阅状态修改为归还中

        book.setStatus("2");

        bookMapper.editBook(book);

    } return rb; }

step 4:实现Controller:在BookController类中新增一个归还图书的方法returnBook(),新增的代码如下所示。

@ResponseBody

@RequestMapping("/returnBook")

public Result returnBook(String id, HttpSession session) {

    // 获取当前登录的用户信息

    User user = (User) session.getAttribute("USER_SESSION");

    try { boolean flag = bookService.returnBook(id, user);

        if (!flag) { return new Result(false, "还书失败!"); }

        return new Result(true, "还书确认中,请先到行政中心还书!");

    } catch (Exception e) {e.printStackTrace();

        return new Result(false, "还书失败!");

    }}

step 5:实现页面效果:当前借阅图书列表中的“归还”按钮绑定了鼠标单击事件,当事件触发时,会执行文件my.js中的returnBook()方法。returnBook()方法将归还的图书id作为参数向映射路径为“/book/returnBook”的控制器发送异步请求,并将请求结果的信息展示在页面中,显示当前借阅列表最新的信息。book_borrowed.jsp页面中“归还”按钮的代码如下所示。

<c:if test="${book.status ==1}">

    <button type="button" class="btn bg-olive btn-xs"

onclick ="returnBook(${book.id})">归还

    </button>

</c:if>

step 6:启动项目,使用普通用户账号登录系统,单击后台首页导航侧栏中的“当前借阅”超链接,页面显示效果如图所示。


3、确认归还

用户在申请图书归还后,需要由图书管理员进行归还确认。

step 1:实现DAO层:归还确认的操作,只是将图书的借阅信息进行清除,所以复用BookMapper接口的editBook()方法即可。(这个复用editBook()编辑图书信息的方法省略)

step 2:实现Service层:在BookService接口中添加一个归还图书的方法returnConfirm(),具体代码如下所示。

Integer returnConfirm(

String id

);

step 3:在BookServiceImpl类中重写BookService接口的returnConfirm()方法,具体代码如下所示。

public Integer returnConfirm(String id) {

    // 根据图书id查询图书的完整信息

    Book book = this.findById(id);

    // 将图书的借阅状态修改为可借阅

    book.setStatus("0");

    book.setBorrower(""); // 清除当前图书的借阅人信息

    book.setBorrowTime(""); // 清除当前图书的借阅时间信息

    // 清除当前图书的预计归还时间信息

    book.setReturnTime("");

    return bookMapper.editBook(book);

}

step 4:实现Controller:在BookController类中新增一个图书归还确认的方法returnConfirm(),新增的代码如下所示。 

@ResponseBody

@RequestMapping("/returnConfirm")

public Result returnConfirm(String id) {

    try {

        Integer count=bookService.returnConfirm(id);

        if(count!=1) { return new Result(false, "确认失败!"); }

        return new Result(true, "确认成功!");

    } catch (Exception e) {

        e.printStackTrace();

        return new Result(false, "确认失败!");

    }}

step 5:实现页面效果:当前借阅数据列表中的“归还确认”按钮绑定了鼠标单击事件,当事件触发时,会执行文件my.js中的returnConfirm()方法。returnConfirm()方法将待归还确认的图书id作为参数向映射路径为“/book/returnConfirm”的控制器发送异步请求,并将请求结果的信息展示在页面中,显示最新的当前借阅列表信息。book_borrowed.jsp页面中“归还确认”按钮的代码如下所示。 

<c:if test="${USER_SESSION.role =='ADMIN'}">

    <button type="button" class="btn bg-olive btn-xs"

onclick ="returnConfirm(${book.id})"> 归还确认

    </button>

</c:if>

step 6: