SpringMVC11-CRUD

7.1查询功能

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" %>



    书籍列表
    
    
    



书籍编号 书籍名字 书籍数量 书籍详情 操作
${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除

step3 在测试可以跳转,我们引入bootstrap优化效果

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>



    书籍列表
    
    
    



书籍编号 书籍名字 书籍数量 书籍详情 操作
${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除

7.2 添加书籍功能

新增书籍的业务流程:

  1. 用户点击新增书籍选项发起请求
  2. 控制器处理请求跳转到新增书籍页面
  3. 输入新增书籍信息,提交信息
  4. 控制器调用业务层保存信息

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属性字段一一匹配,不然后端读取不到

7.3 修改书籍

修改书籍的业务流程:

  1. 用户点击某书籍的修改选项,前端携带该书籍的 id 发起请求
  2. 控制器根据 id 查询要修改的书籍信息,跳转到修改书籍页面并显示修改前的书籍信息
  3. 输入修改后的书籍信息,提交信息
  4. 控制器调用业务层保存信息

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> &nbsp; | &nbsp;
		<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 传给后端,才能根据 id 修改! --%> 书籍名称: 书籍数量: 书籍详情:

注意:修改是要根据 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>
  1. 我们修改页面,前台未传递BookID,导致无法更新

  2. 配置mybatis-conf.xml的日志, 不能有空格,刚开始写的有空格,导致启动报错

    
        
    
    

7.4删除书籍

删除图书,我们使用restFule风格

  1. 用户点击某书籍的删除选项,前端携带该书籍的 id 发起请求
  2. 控制器通过 id 调用业务层执行删除操作

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前端即可,以修改书籍为例,流程如下:

​ 用户点修改按钮——>跳转修改页面——>页面呈现要修改的书的内容——>用户修改内容——>提交返回主菜单。

我们要做的事情:

  1. 再前端页面添加“修改”按钮,并将要修改的书的ID传给后端;
  2. 在controller类中,实现查找和跳转的方法:
    1. 接收前端传来的ID(根据前端和方法上相同的url),
    2. 根据前端的ID查询要修改的书
    3. 并将该书写入到Model中,跳转到修改页面;
  3. 创建书籍的修改前端页面,并且显示要修改的信息(再model中),这个前端页面再指向一个修改的实现方法(通过url)
  4. 再controller中实现修改方法:
    1. 更新book对象(再前端中直接就修改了对象的属性)
    2. 重定向会主菜单.

你可能感兴趣的:(SpringMVC,java)