SpringMVC学习历程04-SSM实战02增删改查
查询全部书籍
1.在controller编写查询方法(@Qualifier注入实现类的bean)
// Controller调用Service层
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;
//查询所有的书籍,并返回一个书籍的展示页面
@RequestMapping("/allBook")
public String allBook(Model model){
List<Books> list = bookService.queryAllBook();
model.addAttribute("list",list);
return "allBook";
}
2.编写首页的index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<style>
a{
text-decoration: none;
color: black;
font-size: 18px;
}
h3{
width: 180px;
height: 38px;
margin: 100px auto;
}
</style>
</head>
<body>
<h3>
<a href="${pageContext.request.contextPath}/book/allBook">进入书籍页面</a>
</h3>
</body>
</html>
4.编写查询到的书籍的跳转页面allbook.jsp(这里有着其他方法的跳转链接)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书籍展示页面</title>
<%-- BootStrap美化界面 --%>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
</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 class="row">
<div class="col-md-4 column">
<%--toAddBook--%>
<a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增书籍</a>
</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>
<th>操作</th>
</tr>
</thead>
<%--书籍从数据库中国查询出来,从这个list中遍历出来:foreach--%>
<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="${Context.request.contextPath}/book/toUpdateBook?id=${book.bookID}">修改</a>
<a href="#">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
添加书籍(要写一个页面和两个方法)
1.同第一步一样,在controller里编写方法,先编写跳转页面的方法,再写增加方法
//跳转到添加书籍页面
@RequestMapping("/toAddBook")
public String toAddBook(Books books){
return "addBook";
}
//添加书籍的请求
@RequestMapping("/addBook")
public String addBook(Books books){
System.out.println("addBook=>"+books);
bookService.addBook(books);
return "redirect:/book/allBook";//重定向我们的@RequestMapping("/allBook")请求:实现请求复用
}
2.添加书籍页面的addbook.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>新增</title>
<%-- BootStrap美化界面 --%>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
</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>书籍数量:</label>
<input type="text" name="bookCounts" class="form-control" required>
</div>
<div class="form-group">
<label>书籍描述:</label>
<input type="text" name="detail" class="form-control" required>
</div>
<div class="from-group">
<input type="submit" class="from-control" value="添加">
</div>
</form>
</div>
</body>
</html>
修改书籍
1.步骤同上
@RequestMapping("/toUpdateBook")
//跳转到修改页面
public String toUpdateBook(Model model,int id){
Books books = bookService.queryBookById(id);
model.addAttribute("books", books);
return "updateBook";
}
@RequestMapping("/updateBook")
//修改书籍的请求
public String updateBook(Books books){
System.out.println("updateBook=>"+books);
bookService.updateBook(books);
return "redirect:/book/allBook";
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>修改书籍</title>
<%-- BootStrap美化界面 --%>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css">
</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">
<div class="form-group">
<label for="bkname">书籍名称:</label>
<input type="text" name="bookName" class="form-control" id="bkname" value="${books.bookName}" required>
</div>
<div class="form-group">
<label>书籍数量:</label>
<input type="text" name="bookCounts" class="form-control" value="${books.bookCounts}" required>
</div>
<div class="form-group">
<label>书籍描述:</label>
<input type="text" name="detail" class="form-control" value="${books.detail}" required>
</div>
<div class="from-group">
<input type="submit" class="from-control" value="修改">
</div>
</form>
</div>
</body>
</html>
注意:修改和添加不同,修改需要提交事务,不提交数据就无法更改,可以用AOP来横切进去(可以看前几集的声明式事务讲解)
在spring-service里加入
<!-- 结合AOP实现事务的注入 -->
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- aop事务支持,声明式事务 -->
<aop:config>
<aop:pointcut id="txPointCut" expression="execution(* com.lzy.dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>
但是事务没问题,无法修改值,可以考虑是否是SQL语句的问题
因此,我们去看一下sql语句的代码,发现它是根据id来查然后修改,但是我们没有在前端给它Id值
所以,在updateBook.jsp中加一句
<%--出现的问题,已经写了声明式事务,但还是传不进去值,因为根据bookID查找,
所以要隐藏域传值,隐藏域的值是bookID的值,这样修改的时候,bookID的值不变,其他值可以修改,
修改成功后,跳转到allBook页面,--%>
<input type="hidden" name="bookID" value="${books.bookID}">
好,重启,修改成功!!!
删除
同理
//删除书籍的请求
@RequestMapping("/deleteBook")
public String deleteBook(int id){
bookService.deleteBookById(id);
return "redirect:/book/allBook";
}
直接在allBook.jsp里面写就行,不需要额外的界面