案例:图书管理

news2025/3/22 0:50:48

掌握图书管理案例的实现,能够使用Spring Boot整合Thymeleaf完成图书管理案例。

1.任务需求

 (1)项目使用Spring Boot整合Thymeleaf,项目展示的页面效果全部通过Thymeleaf的模板文件实现。

(2)查询所有图书。访问http://localhost:8080/book/list时,查询所有图书,并展示在页面中。

(3)选择性显示按钮。当Session中存在用户角色为“ADMIN”时,显示“新增”按钮,否则不显示该按钮。

(4)按条件查询图书。单击“查询”按钮时,根据搜索框中的查询条件查询对应的图书信息。

(5)借阅图书。当图书状态为可借阅时,对应的“借阅”按钮为可用状态,并且单击“借阅”按钮时,将当前申请借阅图书的编号异步发送到后台。

2.任务实现

(1)Spring Boot整合Thymeleaf

SpringBoot为Thymeleaf 提供了一系列默认配置,Spring Boot项目中只要引入Thymeleaf 的启动器,项目启动时就会自动进行对应配置,因此Spring Boot整合Thymeleaf只需在创建的Spring Boot项目中添加Thymeleaf 启动器即可。

(2)创建实体类

图书管理页面中包含2个实体对象,分别为用户实体和图书实体,并且当前还没有学习Spring Boot和持久层技术的整合,在此,选择通过一个类封装一些图书数据,页面展示的图书信息都从这个类中获取数据。需要创建用户类、图书类和数据类,具体代码如下所示。

import  java.io.Serializable;
public  class  User implements  Serializable {
private  String name; //用户名称
private  String role; //用户角色
public  User(String name, String role) {
this .name = name;
this .role = role;
}
public  String getName() {
return  name;
}
public  void  setName(String name) {
this .name = name;
}
public  String getRole() {
return  role;
}
public  void  setRole(String role) {
this .role = role;
}
}
import  java.io.Serializable;
public  class  Book {
private  Integer id; //图书编号
private  String name; //图书名称
private  String author; //图书作者
private  String press; //图书出版社

private  String status; //图书状态

public  Book(Integer id, String name, String author,String press, String status) {
this .id = id;
this .name = name;
this .press = press;
this .author = author;
this .status = status;
}

public  Integer getId() {
return  id;
}

public  void  setId(Integer id) {
this .id = id;
}

public  String getName() {
return  name;
}

public  void  setName(String name) {
this .name = name;
}

public  String getPress() {
return  press;
}

public  void  setPress(String press) {
this .press = press;
}

public  String getAuthor() {
return  author;
}

public  void  setAuthor(String author) {
this .author = author;
}

public  String getStatus() {
return  status;
}

public  void  setStatus(String status) {
this .status = status;
}

@Override
public  String toString() {
return  "Book{" +
"id=" + id +
", name='" + name + ''' +
", author='" + author + ''' +
", press='" + press + ''' +
", status='" + status + ''' +
'
}';
}
}
import  java.util.ArrayList;
public  class  Data {
public  static  ArrayList<Book> getData(){
ArrayList<Book> books=new  ArrayList<>();
books.add(new  Book(1,"楚辞","屈原","中国文联出版社","0"));
books.add(new  Book(2,"纳兰词","纳兰性德","中国文联出版社","1"));
books.add(new  Book(3,"西游记","吴承恩","中国文联出版社","2"));
return  books;
}
}

 (3)创建控制器类

在控制器类中创建对应的方法接收和响应页面发送的请求,具体代码如下所示。

import  org.springframework.stereotype.Controller;
import  org.springframework.ui.Model;
import  org.springframework.web.bind.annotation.PathVariable;
import  org.springframework.web.bind.annotation.RequestMapping;
import  javax.servlet.http.HttpSession;
import  java.util.ArrayList;
@Controller
@RequestMapping("book")
public  class  BookController {
//获取所有图书信息
ArrayList<Book> books = Data.getData();
/**
* 查询所有图书
*/
@RequestMapping("list")
public  String findBook(Model model, HttpSession session){
session.setAttribute("user",new  User("zhangsan","ADMIN"));
model.addAttribute("books",books);
return  "books";
}
/**
*按条件查询图书
*/
@RequestMapping("search")
public  String searchBook(Book book,Model model,HttpSession session){
ArrayList<Book> bs=new  ArrayList<>();
String bname=book.getName();
String bauthor=book.getAuthor();
if (bname.isEmpty()&&bauthor.isEmpty()){
bs=books;
}else {
for  (Book b : books) {
if ((!bname.isEmpty()&&b.getName().contains(bname))||
(!bauthor.isEmpty()&&b.getAuthor().contains(bauthor))){
bs.add(b);
}
}
}
session.setAttribute("user",new  User("zhangsan","ADMIN"));
model.addAttribute("books",bs);
return  "books";
}
/**
*获取借阅图书的编号
*/
@RequestMapping("find/{id}")
public  String findBook(@PathVariable("id") Integer id){
System.out.println("申请借阅图书的id:"+id);
return  "books";
}
}

(4)创建模板文件

在resources\templates目录下创建名称为books的HTML文件作为模板文件,并将模板文件中通过Thymeleaf的属性和标准表达式引入样式文件,以及获取数据进行展示,具体代码如下所示。

<!DOCTYPE HTML>

<html xmlns:th="http://www.thymeleaf.org">

<head>

<meta charset="utf-8">

<title>图书管理</title>

<link rel="stylesheet" th:href="@{/css/bootstrap.css}">

<link rel="stylesheet" th:href="@{/css/AdminLTE.css}">

<link rel="stylesheet" th:href="@{/css/pagination.css}">

<script th:src="@{/js/jquery.min.js}"></script>

</head>

<body>

<div class="box-body">

<div class="pull-left" th:if="${#session.getAttribute('user').role =='ADMIN'}">

<div class="btn-group">

<button type="button" class="btn btn-default"> 新增

</button>

</div>

</div>

<!--数据搜索 -->

<div class="pull-right">

<div class="has-feedback">

<form th:action="@{/book/search}" method="post">

图书名称:<input name="name">&nbsp&nbsp&nbsp&nbsp

图书作者:<input name="author">&nbsp&nbsp&nbsp&nbsp

<input class="btn btn-default" type="submit" value="查询">

</form>

</div>

</div>

<div class="table-box">

<!-- 数据表格 -->

<table id="dataList" class="table table-bordered table-striped table-hover text-center">

<thead>

<tr>

<th>图书名称</th>

<th>图书作者</th>

<th>出版社</th>

<th>图书状态</th>

<th>操作</th>

</tr>

</thead>

<tbody>

<th:block th:each="book : ${books}">

<tr>

<td th:text="${book.name}"/>

</td>

<td th:text="${book.author}"></td>

<td th:text="${book.press}"></td>

<td>

<th:block th:if="${book.status == '0'}">

可借阅

</th:block>

<th:block th:if="${book.status =='1'}">

借阅中

</th:block>

<th:block th:if="${book.status =='2'}">

归还中

</th:block>

</td>

<td class="text-center">

<button th:if="${book.status =='0'}" type="button" class="btn bg-olive btn-xs"

th:onclick="findBookById([[${book.id}]]);"> 借阅

</button>

<button th:if="${book.status =='1' ||book.status =='2'}" type="button"

class="btn bg-olive btn-xs"

disabled="true">借阅

</button>

</td>

</tr>

</th:block>

</tbody>

</table>

</div>

</div>

</body>

<script>

function findBookById(id) {

$.get("/book/find/" + id)

}

</script>

</html>

 (5)测试图书管理

启动项目,在浏览器中访问http://localhost:8080/book/list查询所有图书信息。

 

在搜索框中输入查询条件后单击“查询”按钮,按条件查询图书信息,以查询图书名称中包含“辞”字的图书信息为例。

单击图书《楚辞》的“借阅”按钮,此时IDEA控制台中输出图书对应的id。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2319260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker和Dify学习笔记

文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…

【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计

欢迎来到Java集合框架系列的第一篇文章&#xff01;&#x1f339; 本系列文章将以通俗易懂的语言&#xff0c;结合实际开发经验&#xff0c;带您深入理解Java集合框架的设计智慧。&#x1f339; 若文章中有任何不准确或需要改进的地方&#xff0c;欢迎大家指出&#xff0c;让我…

线性代数(1)用 excel 计算鸡兔同笼

线性代数excel计算鸡兔同笼 案例&#xff1a;鸡兔同笼问题的三种解法&#xff08;递进式教学&#xff09;一、问题描述二、方程式解法&#xff08;基础版&#xff09;步骤解析 三、线性代数解法&#xff08;进阶版&#xff09;1. 方程组转化为矩阵形式2. 矩阵求解&#xff08;逆…

Grokking System Design 系统设计面试问题

《Grokking the System Design Interview》列举了多个经典的系统设计题目,通常按照 不同的业务场景和技术难点 进行分类。以下是一些常见的分类和题目示例: 1. 社交网络类 设计 Twitter(支持关注/取关、推文、Feed 流) 设计 Facebook Messenger(即时聊天,支持在线/离线状…

hubilder打包ios app, 并上传TestFlight

目录 一 前提条件 不是该项目成员解决 1. 直接找到该项目的管理人员去设置你的账号 2. 直接重新生成APPID(一般不建议的&#xff0c;可以查看) 3. 如果是离职人员&#xff0c;可以让他将项目权限转让出来 - 如何转让应用 - DCloud问答 未申请ios证书和描述文件 APP ID 的…

Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统

Java集成MQTT和Kafka实现高可用方案 1. 概述 在物联网(IoT)和分布式系统中,消息传递的可靠性和高可用性至关重要。本文将详细介绍如何使用Java集成MQTT和Kafka来构建一个高可用的消息处理系统。 MQTT(消息队列遥测传输)是一种轻量级的发布/订阅协议,适用于资源受限的设备和…

【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势

java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…

剑指 Offer II 107. 矩阵中的距离

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20107.%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E8%B7%9D%E7%A6%BB/README.md 剑指 Offer II 107. 矩阵中的距离 题目描述 给定一个由 0 和 1 组成的矩阵 mat …

雅可比行列式

定义和推导 雅可比行列式&#xff0c;它是以n个n元函数的偏导数为元素的行列式。以下是雅可比式的推导过程&#xff1a; 二阶雅可比式的推导以二重积分中的极坐标变换为例&#xff0c;设 &#xff1a; &#xff0c;则 x 和 y 的全微分分别为&#xff1a; 可以将 dx 与 dy 视作…

【大模型基础_毛玉仁】3.2 上下文学习

目录 3.2 上下文学习3.2.1 上下文学习的定义3.2.2 演示示例选择1&#xff09;直接检索2&#xff09;聚类检索3&#xff09;迭代检索 3.2.3 性能影响因素 3.2 上下文学习 随模型训练数据规模和参数量的扩大&#xff0c;大语言模型涌现出了上下文学习&#xff08;In-Context Lea…

Oraclelinux问题-/var/log/pcp/pmlogger/目录超大

有套19c rac环境&#xff0c;操作系统是oracle linux 8.10&#xff0c;日常巡检时发现/var/log/pcp/pmlogger/目录超大&#xff0c;如下 [rootdb1 ~]# du -sh /var/log/pcp/pmlogger/* 468G /var/log/pcp/pmlogger/db 1.3G /var/log/pcp/pmlogger/oracle06-106 754M /…

【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证

背景&#xff1a; vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现&#xff1a; rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

Microsoft Edge浏览器的取证分析(基于Chromium)

概述 早在2019年&#xff0c;微软就用Chromium替换了EdgeHTML浏览器引擎&#xff0c;这是微软支持谷歌Chrome浏览器的一个开源项目。通过切换到Chromium&#xff0c;Edge与Chrome浏览器共享一个共同的架构&#xff0c;这意味着用于Chrome浏览器调查的取证技术也适用于Edge。 …

汽车一键启动系统使用方便,舒适出行,轻松匹配

汽车一键启动系统 系统定义 移动管家汽车一键启动系统是装置在智能汽车上的一部分&#xff0c;是实现简约打火和熄火过程的一个按钮装置。它可以在原车钥匙锁头的位置改装&#xff0c;也能独立面板改装&#xff0c;现在很多高低配置的车辆都可安装。 功能特点 基本功能 启…

C语言复习笔记--数组

今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始. 数组的概念 数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组. 下面从一维数组说起. 一维数组的创建和…

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…

腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践

项目背景与发展历程 在金融科技快速发展的今天&#xff0c;股票分析作为投资决策的核心环节&#xff0c;正面临数据量激增和复杂性提升的挑战。传统股票分析依赖人工处理&#xff0c;效率低下且成本高昂&#xff0c;而人工智能&#xff08;AI&#xff09;的引入为这一领域带来…

【工具】C#防沉迷进程监控工具使用手册

一、软件简介 本工具用于监控指定进程的运行时长&#xff0c;当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒&#xff0c;帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…

【docker】--- 详解 WSL2 中的 Ubuntu 和 Docker Desktop 的区别和关系!

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【WSL 】--- Windows11 迁移 WSL 超详细指南 —— 给室友换一个宿舍! 开发环境一、引…