SSM框架整合项目实战-业务实现

SSM框架整合项目实战-业务实现

本文延续上篇: SSM框架整合项目实战-框架搭建


1. 查询书籍

1. Controller

新增一个接口用于查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package zone.yiqing.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import zone.yiqing.pojo.Books;
import zone.yiqing.service.BookService;

import java.util.List;

/**
* @Author Yiqing Zhang
* @Date 2020-11-12 1:28 p.m.
* @Version 1.0
*/
@Controller
@RequestMapping("/book")
public class BookController {
// controller调service层
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;

// 查询全部的书籍, 并且返回到一个书籍展示页面
@RequestMapping("/allBook")
public String list(Model model){
List<Books> list = bookService.queryAllBook();
model.addAttribute("list",list);
return "allBook";
}
}

2. 创建查询页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书籍展示</title>
<%--bootstrap--%>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="page-header">
<h1>
<small>书籍列表 ------ 显示所有书籍</small>
</h1>
</div>
</div>
</div>

<div class="row clearfix">
<div class="col-md-12 column">
<table class="table table-hover table-striped">
<thead>
<tr>
<th>书籍编号</th>
<th>书籍名称</th>
<th>书籍数量</th>
<th>书籍详情</th>
</tr>
</thead>
<%--书籍从数据库中取出,遍历--%>
<tbody>
<c:forEach var="book" items="${list}">
<tr>
<td>${book.bookID}</td>
<td>${book.bookName}</td>
<td>${book.bookCounts}</td>
<td>${book.detail}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>

3. 首页

首页新增调转

为了项目发布之后也能稳定运行:取绝对地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
<style>
a{
text-decoration: none;
color:black;
font-size: 18px;
}
h3{
width:180px;
height: 38px;
margin: 100px auto;
text-align: center;
line-height: 38px;
background: deepskyblue;
border-radius: 5px;
}
</style>
</head>
<body>
<h3>
<a href="${pageContext.request.contextPath}/book/allBook">进入书籍页面 </a>
</h3>
</body>
</html>

页面效果

image-20201113105530777


2. 添加书籍

1. Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
// 跳转到增加书籍页面
@RequestMapping("/toAddBook")
public String toAddPage() {
return "addBook";
}

// 添加书籍的请求
@RequestMapping("/addBook")
public String addBook(Books books) {
System.out.println("add book" + books);
bookService.addBook(books);
return "redirect:/book/allBook"; //重定向到@RequestMapping("/allBook")
}

2. 修改书籍展示页面

1
2
3
4
5
6
<div class="row">
<div class="col-md-4 column">
<%--toAddBook--%>
<a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增书籍</a>
</div>
</div>

3. 新建添加书籍页面 addBook.jsp

  • 注意表单的name要和实体类的字段名一致
  • 如果字段为空上传会报错,所以在表单中添加required属性
  • 表单label的for是为了点击label跳转到input框的
  • 表单的action地址注意写绝对地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%--
Created by IntelliJ IDEA.
User: Yiqing
Date: 2020-11-13
Time: 11:01 a.m.
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>新增书籍</title>
<%--bootstrap--%>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="page-header">
<h1>
<small>新增书籍</small>
</h1>
</div>
</div>
</div>

<form action="${pageContext.request.contextPath}/book/addBook" method="post">
<div class="form-group">
<label for="bkname">书籍名称:</label>
<input type="text" name="bookName" class="form-control" id="bkname" required>
</div>
<div class="form-group">
<label for="bknumber">书籍数量:</label>
<input type="text" name="bookCounts" class="form-control" id="bknumber" required>
</div>
<div class="form-group">
<label for="bkdesc">书籍描述:</label>
<input type="text" name="detail" class="form-control" id="bkdesc" required>
</div>
<div class="form-group">
<input type="submit" class="form-control" value="添加">
</div>
</form>
</div>
</body>
</html>

3. 修改书籍

1. Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 跳转到修改页面
@RequestMapping("/toUpdateBook")
public String toUpdatePage(int id, Model model) {
Books books = bookService.queryBookById(id);
model.addAttribute("QBook",books);
return "updatePage";
}

// 修改书籍
@RequestMapping("/updateBook")
public String updateBook(Books books){
System.out.println("updateBook=>"+books);
bookService.updateBook(books);
return "redirect:/book/allBook";
}

2. 修改书籍展示页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<table class="table table-hover table-striped">
<thead>
<tr>
<th>书籍编号</th>
<th>书籍名称</th>
<th>书籍数量</th>
<th>书籍详情</th>
<th>操作</th>
</tr>
</thead>
<%--书籍从数据库中取出,遍历--%>
<tbody>
<c:forEach var="book" items="${list}">
<tr>
<td>${book.bookID}</td>
<td>${book.bookName}</td>
<td>${book.bookCounts}</td>
<td>${book.detail}</td>
<td>
<a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.bookID}">修改</a> &nbsp;
<a href="">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>

3. 新建修改书籍页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<%--
Created by IntelliJ IDEA.
User: Yiqing
Date: 2020-11-13
Time: 11:37 a.m.
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改书籍</title>
<%--bootstrap--%>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<div class="page-header">
<h1>
<small>修改书籍</small>
</h1>
</div>
</div>
</div>

<form action="${pageContext.request.contextPath}/book/updateBook" method="post">
<%--提交要上传id,否则无法查找修改,前端传递隐藏域--%>
<input type="hidden" name="bookID" value="${QBook.bookID}">
<div class="form-group">
<label for="bkname">书籍名称:</label>
<input type="text" name="bookName" class="form-control" id="bkname" value="${QBook.bookName}" required>
</div>
<div class="form-group">
<label for="bknumber">书籍数量:</label>
<input type="text" name="bookCounts" class="form-control" id="bknumber" value="${QBook.bookCounts}"
required>
</div>
<div class="form-group">
<label for="bkdesc">书籍描述:</label>
<input type="text" name="detail" class="form-control" id="bkdesc" value="${QBook.detail}" required>
</div>
<div class="form-group">
<input type="submit" class="form-control" value="添加">
</div>
</form>
</div>
</body>
</html>


4. 删除书籍

1. Controller

1
2
3
4
5
6
// 删除书籍
@RequestMapping("/deleteBook/{bookID}")
public String deleteBook(@PathVariable("bookID") int id) {
bookService.deleteBookById(id);
return "redirect:/book/allBook";
}

2. 修改书籍展示页面

1
<a href="${pageContext.request.contextPath}/book/deleteBook/${book.bookID}">删除</a>

5. 配置日志和事务

1. 开启日志

在mybatis的配置中添加setting

1
2
3
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

2. 配置事务切面织入

spring-service.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!--结合AOP实现事务的织入-->
<!--配置事务通知-->
<tx:advice id="txADVICE" transaction-manager="transactionManager">
<!--给哪些方法配置事务-->
<!--配置事务的传播特性-->
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<!--<tx:method name="*" propagation="REQUIRED"/>-->
</tx:attributes>
</tx:advice>
<!--配置事务切入-->
<aop:config>
<!--切入点-->
<aop:pointcut id="txPointCut" expression="execution(* zone.yiqing.dao.*.*(..))"/>
<!--切入方法-->
<aop:advisor advice-ref="txADVICE" pointcut-ref="txPointCut"/>
</aop:config>

6. 搜索功能

1. Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 查询书籍
@RequestMapping("/queryBook")
public String queryBook(String queryBookName, Model model){
Books books = bookService.queryBookByName(queryBookName);

List<Books> list = new ArrayList<>();
if(books == null){
list = bookService.queryAllBook();
model.addAttribute("error","未查到");
}else{
list.add(books);
}
model.addAttribute("list",list);
return "allBook";
}

2. 页面新增查询表单

1
2
3
4
5
6
7
8
9
<div class="col-md-8 column">
<%--查询书籍--%>
<form action="${pageContext.request.contextPath}/book/queryBook" method="post" style="float: right"
class="form-inline">
<span style="color: #ff0000; font-weight: bold">${error}</span>
<input type="text" placeholder="请输入要查询的书籍名称" class="form-control" name="queryBookName">
<input type="submit" value="查询" class="btn btn-primary">
</form>
</div>

3. dao层

3.1 interface

1
2
// 搜索
Books queryBookByName(@Param("bookName") String bookName);

3.2 mapper.xml

1
2
3
<select id="queryBookByName" resultType="Books">
select * from books where bookName=#{bookName};
</select>

4. service层

4.1 interface

1
2
// 搜索
Books queryBookByName(String bookName);

4.2 实现类impl

1
2
3
4
@Override
public Books queryBookByName(String bookName) {
return bookMapper.queryBookByName(bookName);
}