这篇内容是在上一次的SSM框架速成4也就是SSM实战的项目中新增一个功能,由于新增一个功能会修改源代码所以单独写出来。其实主要还是培养一下写功能的思路和流程咋样最好。
没有怎么用bootstrap那些,很多还是简单的页面布局。
当我们在写一个功能的时候,可以想象用户在前端先进行一个请求,后端的controller层收到请求后开始写业务service,而service的实现需要去调用dao层,dao层的东西需要访问数据库。
而我们在实现这么一次查询功能的时候,肯定要先修改前端,让前端有这么一个表单用于让用户提交请求,接着我们就知道要开始写前端传过来的数据了,controller层接收到数据开始要进行处理。
接下里的service层和dao层,也就是开发是从底层写好还是从高层写好。实际上我认为先写dao层更好,否则高层的先写了以后出了毛病以后排查就会瞻前顾后,过于麻烦。
所以我的设计思路如下:
1、前端页面的修改
2、写controller层的大致框架
3、写数据库(这里没有涉及到修改数据库)
4、写dao层
5、写service层
6、完善controller层
当然了,并不一定要严格按照这样的顺序去做一个项目,很多还是要看个人习惯,比如并不一定要像我一样先写controller的大致框架,当然这些都是无关紧要的。总体还是要做到自底向上来写项目。
首先我们要修改前端的页面,在allBook.jsp页面中要新增表单用于提交请求,这个请求也就是我们需要的搜索图书的功能请求。
<div class="col-md-4 column col-md-offset-4">
<%--查询书籍--%>
<form action="${pageContext.request.contextPath}/book/queryBook" method="post" style="float: right">
<input type="text" name="queryBookName" class="form-control" placeholder="请输入要查询的书籍名称">
<input type="submit" value="查询" class="btn btn-primary">
</form>
</div>
这个项目是比较简单的,好像一下就知道要干啥,但是当项目比较复杂的时候,最好还是就写一下大致框架即可:
(1)用RequestMapping进行映射。
(2)根据请求设置函数的参数,即String类型的queryBookName。
(3)返回的视图层,我们查询得到的书籍是要返回到allBook页面的。
//查询书籍
@RequestMapping("/queryBook")
public String queryBook(String queryBookName,Model model){
return "allBook";
}
分为两步,第一步是在dao层的接口中封装查询书籍的方法,第二步是在.xml中实现对应的SQL语句。
BookMapper.java:
//通过书名查找书
Books queryBookByName(@Param("bookName") String bookName);
BookMapper.xml:
<select id="queryBookByName" resultType="Books">
select * from ssmbuild.books where bookName=#{bookName}
select>
service层的实现也分为两部,先在接口封装方法,最好对标dao层的方法;接着在接口的实现类中调用dao层的方法,实现SQL调用
BookService.java:
//根据书名查找书
Books queryBookByName(String bookName);
BookServiceImpl:
@Override
public Books queryBookByName(String bookName) {
return bookMapper.queryBookByName(bookName);
}
我们首先知道根据书名查询返回的是一个集合,那么就需要用集合来装,那么问题就简化很多了,也就是说我们只需要返回到allBook.jsp,和之前一样处理list集合即可。
@RequestMapping("/queryBook")
public String queryBook(String queryBookName,Model model){
Books books = bookService.queryBookByName(queryBookName);
//System.err.println(books);
List<Books> list = new ArrayList<>();
list.add(books);
model.addAttribute("list",list);
return "allBook";
}
接下来这个功能大体是实现了。
我们分析一下,看看直观感受上整个项目有哪些缺陷:
(1)当我们查询了相关书籍以后,页面就这么定死在那里了,至少当我们要能够通过按钮重新访问全部书籍。
(2)当用户一不小心输入了一个空就按了回车或者输入的书籍为空的时候,那么页面仍旧会跳转,但是跳转出来的结果确是空的结果,我们可以避免这一情况。也就是说,当我们没有查询到相关的书籍的时候我们应该保持当前页面,并且要给用户一个反馈。
BookController:
@RequestMapping("/queryBook")
public String queryBook(String queryBookName,Model model){
Books books = bookService.queryBookByName(queryBookName);
//System.err.println(books);
List<Books> list = new ArrayList<>();
if(books==null){
list=bookService.queryAllBooks();
model.addAttribute("error","未查到");
}else{
list.add(books);
}
model.addAttribute("list",list);
return "allBook";
}