• 中文
    • English
  • 注册
  • 赞助本站

    • 支付宝
    • 微信
    • QQ

    感谢一直支持本站的所有人!

    • 查看作者
    • SpringMVC:使用Restful完成简单的图书管理系统的增删改查

      一.  Rest风格的API与传统API的区别

      SpringMVC:使用Restful完成简单的图书管理系统的增删改查

      SpringMVC:使用Restful完成简单的图书管理系统的增删改查

      二.  添加依赖

      本项目共需要以下依赖:

      • commons-logging-1.2.jar

      • druid-1.1.6.jar

      • fastjson-1.2.47.jar

      • jstl.jar

      • mysql-connector-java-5.1.47.jar

      • spring-aop-5.1.8.RELEASE.jar

      • spring-beans-5.1.8.RELEASE.jar

      • spring-context-5.1.8.RELEASE.jar

      • spring-core-5.1.8.RELEASE.jar

      • spring-expression-5.1.8.RELEASE.jar

      • spring-jdbc-5.1.8.RELEASE.jar

      • spring-tx-5.1.8.RELEASE.jar

      • spring-web-5.1.8.RELEASE.jar

      • spring-webmvc-5.1.8.RELEASE.jar

      • standard.jar

      三.  Entity

      Book:

      package io.zhangjia.springmvc.entity;
      
      public class Book {
          private Integer bookId;
          private String name;
          private String author;
          private Double price;
      
          @Override
          public String toString() {
              return "Book{" +
                      "bookId=" + bookId +
                      ", name='" + name + '\'' +
                      ", author='" + author + '\'' +
                      ", price=" + price +
                      '}';
          }
      
          public Integer getBookId() {
              return bookId;
          }
      
          public void setBookId(Integer bookId) {
              this.bookId = bookId;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getAuthor() {
              return author;
          }
      
          public void setAuthor(String author) {
              this.author = author;
          }
      
          public Double getPrice() {
              return price;
          }
      
          public void setPrice(Double price) {
              this.price = price;
          }
      }

      四.  BookDao

      package io.zhangjia.springmvc.dao;   
      import io.zhangjia.springmvc.entity.Book;
      
      import java.util.List;
      
      public interface BookDao {
          int doInsert(Book book);
          int doDelete(Integer bookId);
          int doUpdate(Book book);
          List<Book> queryAll();
          Book queryById(Integer bookId);
      }}

      BookDaoImpl:

      这里不再使用xml文件配置,而是使用注解的方式

      package io.zhangjia.springmvc.dao.impl;
      
      import io.zhangjia.springmvc.dao.BookDao;
      import io.zhangjia.springmvc.entity.Book;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.jdbc.core.BeanPropertyRowMapper;
      import org.springframework.jdbc.core.JdbcTemplate;
      import org.springframework.stereotype.Repository;
      
      import java.util.List;
      
      @Repository("bookDao")
      public class BookDaoImpl implements BookDao {
      
          @Autowired
          private JdbcTemplate jdbcTemplate;
      
          @Override
          public int doInsert(Book book) {
              String sql = "INSERT INTO book (name, author, price) VALUES (?,?,?)";
              return jdbcTemplate.update(sql,book.getName(),book.getAuthor(),book.getPrice());
          }
      
          @Override
          public int doDelete(Integer bookId) {
              String sql = "DELETE FROM book WHERE book_id = ?";
              return jdbcTemplate.update(sql,bookId);
          }
      
          @Override
          public int doUpdate(Book book) {
              String sql = "UPDATE book SET name = ?, author = ?, price = ? WHERE book_id = ?";
              return jdbcTemplate.update(sql,book.getName(),book.getAuthor(),book.getPrice(),book.getBookId());
          }
      
          @Override
          public List<Book> queryAll() {
              String sql = "SELECT * FROM book";
              return jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(Book.class));
          }
      
          @Override
          public Book queryById(Integer bookId) {
              String sql = "SELECT * FROM book WHERE book_id = ?";
              return jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(Book.class),bookId);
          }
      }

      五.  Service

      BookService :

      package io.zhangjia.springmvc.service;
      
      import io.zhangjia.springmvc.entity.Book;
      
      import java.util.List;
      
      public interface BookService {
      
          List<Book> books();
      
          Book getBook(Integer bookId);
      
          boolean saveOrUpdate(Book book);
      
          boolean delete(Integer id);
      
      }

      BookServiceImpl :

      package io.zhangjia.springmvc.service.impl;
      
      import io.zhangjia.springmvc.dao.BookDao;
      import io.zhangjia.springmvc.entity.Book;
      import io.zhangjia.springmvc.service.BookService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      import java.util.List;
      
      @Service("bookService")
      public class BookServiceImpl implements BookService {
      
          @Autowired
          private BookDao bookDao;
      
          @Override
          public List<Book> books() {
              return bookDao.queryAll();
          }
      
          @Override
          public Book getBook(Integer bookId) {
              return bookDao.queryById(bookId);
          }
      
          @Override
          public boolean saveOrUpdate(Book book) {
              int result = 0;
              if (book.getBookId() == null){
                  //添加
                  result = bookDao.doInsert(book);
              }else {
                  //修改
                  result = bookDao.doUpdate(book);
              }
              return result == 1;
          }
      
          @Override
          public boolean delete(Integer id) {
              return bookDao.doDelete(id) == 1;
          }
      }

      六.  Controller

      BookController :

      package io.zhangjia.springmvc.;
      
      import com.alibaba.fastjson.JSON;
      import io.zhangjia.springmvc.entity.Book;
      import io.zhangjia.springmvc.service.BookService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      import org.springframework.ui.Model;
      import org.springframework.web.bind.annotation.*;
      
      import java.util.List;
      
      @Controller
      public class BookController {
      
          @Autowired
          private BookService bookService;
      
          @GetMapping("/books")
          public String books(Model model){
              List<Book> books = bookService.books();
              System.out.println(JSON.toJSONString(books));
              model.addAttribute("books",books);
              return "books";
          }
      
          @GetMapping("/book")
          public String addForm(){
              return "form";
          }
      
          @GetMapping("/book/{id}")
          public String editForm(@PathVariable Integer id, Model model){
              Book book = bookService.getBook(id);
              model.addAttribute("book",book);
              return "form";
          }
      
          @PostMapping(value = "/book",produces = "application/json;charset=utf-8")
          @ResponseBody
          public String save(Book book){
              boolean b = bookService.saveOrUpdate(book);
              return "{\"success\":"+b+"}";
          }
      
          @PutMapping(value = "/book",produces = "application/json;charset=utf-8")
          @ResponseBody
          public String update(Book book){
              System.out.println("put-book = " + book);
              boolean b = bookService.saveOrUpdate(book);
              return "{\"success\":"+b+"}";
          }
      
          @DeleteMapping(value = "/book/{id}",produces = "application/json;charset=utf-8")
          @ResponseBody
          public String delete(@PathVariable Integer id){
              boolean b = bookService.delete(id);
              return "{\"success\":"+b+"}";
          }
      
      }

      七.  spring-mvc.xml

      <?xml version="1.0" encoding="UTF-8"?>   
      <beans xmlns="http://www.springframework.org/schema/beans"   
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
      xmlns:context="http://www.springframework.org/schema/context"   
      xmlns:mvc="http://www.springframework.org/schema/mvc"   
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">   
      
      <!--配置扫描组件-->
      <!--在XML中配置了这个标签后,spring可以自动扫描base-package下面或者子包下面的java文件,如果扫描有@Component @Service @Controller等这些注解的类,则把这些类注册为bean。
       https://www.cnblogs.com/vanl/p/5733655.html
       -->
      <context:component-scan base-package="io.zhangjia.springmvc"/>  
       
      <!--读取properties文件-->
      <context:property-placeholder location="classpath:jdbc.properties"/> 
      
      
      <!--配置视图解析器-->  
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">   
      <property name="prefix" value="/WEB-INF/views/"/>   
      <property name="suffix" value=".jsp"/>   
      </bean>
      
      
      <!--静态资源的请求转由Web容器处理-->    
      <mvc:default-servlet-handler/>   
      
      
      <!--配置默认组件-->
          <mvc:annotation-driven/>  <!--如果不配置这个,那么静态资源可以访问,Controller无法访问-->
      
          
      <!--配置数据库连接池-->  
      <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">   
      <property name="driverClassName" value="${jdbc.driver}"/> <!--    OGNL-->    
      <property name="url" value="${jdbc.url}"/>   
      <property name="username" value="${jdbc.username}"/>   
      <property name="password" value="${jdbc.password}"/>   
      </bean>   
      
      <!--配置jdbcTemplate--> 
      <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">   
      <property name="dataSource" ref="dataSource"/>   
      </bean>   
      </beans>

      八.  web.xml

      web.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
              <!--解決中文乱码-->
          <filter>
              <filter-name>characterEncodingFilter</filter-name>
              <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
              <init-param>
                  <param-name>encoding</param-name>
                  <param-value>utf-8</param-value>
              </init-param>
          </filter>
          <filter-mapping>
              <filter-name>characterEncodingFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      
          
          <!--配置hiddenHttpMethodFilter-->
          <!--浏览器只支持Post和get的方式,想要实现delete和put的方式,需要使用过滤器HiddenHttpMethodFilter-->
          <filter>
              <filter-name>hiddenHttpMethodFilter</filter-name>
              <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>hiddenHttpMethodFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      
          
          <!--配置请求分配器开始-->
          <servlet>
              <servlet-name>dispatcherServlet</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <!--配置SpringMVC配置文件的路径-->
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:spring-mvc.xml</param-value>
              </init-param>
              <!--在web容器启动时完成初始化-->
              <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
              <servlet-name>dispatcherServlet</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      
      </web-app>

      九.  JSP

      books.jsp

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <c:set var="path" value="${pageContext.request.contextPath}"/>
      <html>
      <head>
          <title>图书列表</title>
          <link rel="stylesheet" href="${path}/static/css/bootstrap.min.css"/>
          <script type="text/javascript" src="${path}/static/js/jquery-1.8.3.min.js"></script>
          <script type="text/javascript">
              function del(e) {
                  var tr = $(e).parent().parent();
                  var id = tr.children(":first").text();
                  $.ajax({
                      url:"${path}/book/"+id,
                      type:"post",
                      data:{
                          _method:"delete"
                      },
                      success:function (res) {
                          if(res.success){
                              //删除tr
                              tr.remove();
                          }else {
                              alert("失败");
                          }
                      }
                  });
              }
          </script>
      </head>
      <body class="container">
          <h1>图书列表</h1>
          <a href="${path}/book" class="btn btn-success mb-2">添加</a>
          <table class="table table-striped">
              <tr>
                  <th>编号</th>
                  <th>书名</th>
                  <th>作者</th>
                  <th>价格</th>
                  <th>操作</th>
              </tr>
              <c:forEach items="${requestScope.books}" var="book">
                  <tr>
                      <td>${book.bookId}</td>
                      <td>${book.name}</td>
                      <td>${book.author}</td>
                      <td>${book.price}</td>
                      <td>
                          <a class="btn btn-sm btn-primary" href="${path}/book/${book.bookId}">修改</a>
                          <a class="btn btn-sm btn-danger" href="javascript:void (0)" onclick="del(this)">删除</a>
                      </td>
                  </tr>
              </c:forEach>
          </table>
      </body>
      </html>

      form.jsp:

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
      <c:set var="path" value="${pageContext.request.contextPath}"/>
      <html>
      <head>
          <c:if test="${requestScope.book == null}">
              <title>添加图书</title>
          </c:if>
          <c:if test="${requestScope.book != null}">
              <title>修改图书</title>
          </c:if>
          <link rel="stylesheet" href="${path}/static/css/bootstrap.min.css"/>
          <script type="text/javascript" src="${path}/static/js/jquery-1.8.3.min.js"></script>
          <script type="text/javascript">
              $(function () {
                  $(":submit").click(function () {
                      var data = $("#book-form").serialize();
                      $.ajax({
                          url:"${path}/book",
                          type:"post",
                          data:data,
                          success:function (res) {
                              if(res.success){
                                  location = "${path}/books";
                              }else{
                                  alert("失败");
                              }
                          }
                      });
                      return false;
                  });
              });
          </script>
      </head>
      <body class="container">
          <c:if test="${requestScope.book == null}">
              <h1>添加图书</h1>
          </c:if>
          <c:if test="${requestScope.book != null}">
              <h1>修改图书</h1>
          </c:if>
          <form id="book-form" role="form" action="" method="post">
              <c:if test="${requestScope.book != null}">
                  <input type="hidden" name="bookId" value="${requestScope.book.bookId}">
                  <input type="hidden" name="_method" value="put">
              </c:if>
              <div class="form-group">
                  <label for="name">名称</label>
                  <input type="text" class="form-control" name="name" id="name" value="${requestScope.book.name}"
                         placeholder="请输入名称">
              </div>
              <div class="form-group">
                  <label for="author">作者</label>
                  <input type="text" class="form-control" name="author" value="${requestScope.book.author}"
                         id="author"
                         placeholder="请输入作者">
              </div>
              <div class="form-group">
                  <label for="price">价格</label>
                  <input type="text" class="form-control" name="price" id="price" value="${requestScope.book.price}"
                         placeholder="请输入价格">
              </div>
              <input class="btn btn-primary" type="submit" value="提交">
          </form>
      </body>
      </html>

    • 0
    • 0
    • 0
    • 539
    • 请登录之后再进行评论

      登录
    • 做任务
    • 实时动态
    • 偏好设置
    • 返回顶部
    • 单栏布局 侧栏位置: