step1 . 编写一个Controller功能,实现查询图书列表
通过注解定义使其成为一个控制器,类请求路径为 /book
,内置了一个 BookService
对象以执行业务,这个对象通过自动装配的方式注入!
@Controller
@RequestMapping("/book")
public class BooksController {
/*
service层持有Dao层
*Controller层持有Service层
* */
// 自动装配 bean
@Autowired
@Qualifier("BookServiceImpl")
private BookService bookService;
/*查询全部书籍并且返回到一个书籍列表页面*/
@RequestMapping("/allbook")
public String list(Model model){
List<Books> books = bookService.queryAllBook();
model.addAttribute("list", books);
return "booksList";
}
}
此处需要记住:
1 service层持有dao层
2、controller层持有service层
持有的都是接口
Step 2 .在web/WEB-INF/jsp/创建booksList.jsp
先编写首页 index.jsp
,从首页可以进入书籍列表的页面(简单设置了一下样式)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
首页
点击进入列表页
在web/WEB-INF/jsp/创建booksList.jsp,然后是 booksList.jsp
页面,展示所有书籍并提供选项进行新增书籍、删除书籍、修改书籍操作(用到了 jstl 标签,需要导入 jstl 包和 standard 包!),这个页面是可以复用的
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
书籍列表
step3 在测试可以跳转,我们引入bootstrap优化效果
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
书籍列表
新增书籍的业务流程:
step 1 ,我们需要有一个新增图书的按钮,在booksList.jsp里面,增加一个新增按钮
<%--操作按钮--%>
<div class="row">
<div class="col-md-4 column">
<%--toAddPaper--%>
<a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBookPage">新增a>
div>
div>
step 2. 编写跳转新增图书页面的功能
public class BooksController {
.....
/*跳转到增加书籍页面*/
@RequestMapping("/toAddBookPage")
public String toAddPaper(Model model) {
return "addBook";
}
....
}
step 3. 在/web-inf/jsp/下面新建一个addBook.jsp页面,可以添加图书
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
allBook
<%--bootstrap美化界面--%>
新增书籍
<%--书籍表单--%>
输入书籍信息并点击添加后,发起 addBook
请求;控制器处理请求,获取表单数据并调用业务层的新增方法将数据保存到持久层
public class BookController {
...
@RequestMapping("/addBook")
// 实体类做参数,控制器会用反射获取表单中对应实体类属性的数据
public String addBook(Book book){
System.out.println("addBook: "+book);
bookService.addBook(book);
// 添加完 返回列表(会自动补上项目路径)
return "redirect:/book/booksList";
}
}
注意点
1、 name必须和实体类Books属性字段一一匹配,不然后端读取不到
修改书籍的业务流程:
step 1. 首先,在书籍列表,增加 修改删除的连接, 我们要实现先能跳进到修改页面
<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/toUpdateBookPage?id=${book.bookID}">修改</a> |
<a href="#">删除</a>
</td>
</tr>
</c:forEach>
</tbody>
step2 . 进入/WEB-INF/jsp/,添加我们的jsp页面 updateBook.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
修改书籍
修改书籍信息
注意:修改是要根据 id 进行修改的,所以需要在 input 隐藏域中保存 id 的值,与其他修改信息一起提交给后端!
Step3.先在controller里面,添加一个跳转到修改页面的功能
/*跳转到修改书籍页面*/
@RequestMapping("/toUpdateBookPage")
public String toUpdatePaper(Model model, int id) {
Books books = bookService.queryBookById(id);
model.addAttribute("books",books);
return "updateBook";
}
step4 . 在controller,编写处理修改删除书籍的信息
/*修改书籍*/
@RequestMapping("/updateBook")
public String updateBook(Model model, Books book) {
System.err.println("updateBook=>"+book);
// 修改书籍信息
bookService.updateBook(book);
// 修改完 返回列表
return "redirect:/book/booksList";
}
在做这个的时候碰到两个错误
1、BookMapper.xml里面配置错误
<update id="updateBook" parameterType="books">
update ssmbuild.books
set bookName =#{bookName},bookCounts=#{bookCounts},detail=#{detail}
where bookID=#{bookID};
update>
刚开始 where bookID=#{bookId}; 导致一直报错,先查看接口文件的参数写的是什么,若写的是
int deleteBookById(@Param("bookId") int id);就不用修改
2.添加事务处理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
bean>
<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(* com.kuang.dao.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
aop:config>
我们修改页面,前台未传递BookID,导致无法更新
配置mybatis-conf.xml的日志, 不能有空格,刚开始写的有空格,导致启动报错
删除图书,我们使用restFule风格
step1 controller里面
/*删除数据*/
/*复习一下restFul风格*/
//@RequestMapping("/deleteBook")
@RequestMapping("/deleteBook/{bookID}")
public String deleteBook(@PathVariable("bookID") int id) {
System.out.println("deleteBook: "+id);
// 删除书籍
bookService.deleteBookById(id);
// 删除完 返回列表
return "redirect:/book/booksList";
}
step2 在前端调用里面
删除
当给SSM框架搭建好了以后,进行Web的开发就含简单了,只用关注controller类和jsp前端即可,以修改书籍为例,流程如下:
用户点修改按钮——>跳转修改页面——>页面呈现要修改的书的内容——>用户修改内容——>提交返回主菜单。
我们要做的事情: