添加图书的时候图书的图片路径报空

添加图书的时候图书的图片路径报空

# 具体遇到的问题
添加图书的时候,没有获得imgPath的值

BookController是参考问答区写出来的,add方法中
这段是什么意思喃?是必须要增加6本书的数据?还是可以只增加一本?
if (count%5==0) {

Timestamp createTime = new Timestamp(System.currentTimeMillis());
Timestamp updateTime =createTime;
book.setCreateTime(createTime);
book.setUpdateTime(updateTime);
books.add(book);
book = new Book();
}

# 报错信息的截图

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】突出显示

package com.imooc.ibook.entity;

import java.sql.Timestamp;

public class Book {
   private int id;
private String name;
private int level;
private int price;
private int categoryId;
private String imgPath;
private Timestamp createTime;
private Timestamp updateTime;


@Override
   public String toString() {
       return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", level=" + level +
", price=" + price +
", imgPath='" + imgPath + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
", categoryId=" + categoryId +
'}';
}

   public int getId() {
       return id;
}

   public void setId(int id) {
       this.id = id;
}

   public int getCategoryId() {
       return categoryId;
}

   public void setCategoryId(int categoryId) {
       this.categoryId = categoryId;
}


   public String getName() {
       return name;
}

   public void setName(String name) {
       this.name = name;
}

   public int getLevel() {
       return level;
}

   public void setLevel(int level) {
       this.level = level;
}

   public int getPrice() {
       return price;
}

   public void setPrice(int price) {
       this.price = price;
}

   public String getImgPath() {
       return imgPath;
}

   public void setImgPath(String imgPath) {
       this.imgPath = imgPath;
}

   public Timestamp getCreateTime() {
       return createTime;
}

   public void setCreateTime(Timestamp createTime) {
       this.createTime = createTime;
}

   public Timestamp getUpdateTime() {
       return updateTime;
}

   public void setUpdateTime(Timestamp updateTime) {
       this.updateTime = updateTime;
}


   public Book(int id, String name, int level, int price, String imgPath, Timestamp createTime, Timestamp updateTime, int categoryId) {
       this.id = id;
this.name = name;
this.level = level;
this.price = price;
this.imgPath = imgPath;
this.createTime = createTime;
this.updateTime = updateTime;
this.categoryId = categoryId;
}

   public Book() {
   }
}
package com.imooc.ibook.dao;

import com.imooc.ibook.entity.Book;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface BookDao {

   //查询所有图书的方法

   @Select("select * from book")
   @Results(id = "all", value = {
           @Result(column = "id", property = "id", id = true),
@Result(column = "category_id", property = "categoryId"),
@Result(column = "name", property = "name"),
@Result(column = "level", property = "level"),
@Result(column = "price", property = "price"),
@Result(column = "img_path", property = "imgPath"),
@Result(column = "create_time", property = "createTime"),
@Result(column = "update_time", property = "updateTime"),
})
   List<Book> findAll();


//通过图书类,查询该类下的所有图书findById
   @Select("select * from book where category_id=#{categoryId}")
   @ResultMap("all")
//输入为图书类的id
   List<Book> findById(int categoryId);


//批量新增图书
   @Insert("<script>" +
"insert into book(category_id,name,level,price,img_path,create_time,update_time) values" +
"<foreach collection='list' item='book' separator=','>" +
"(#{book.categoryId},#{book.name},#{book.level},#{book.price},#{book.imgPath},#{book.createTime},#{book.updateTime})" +
"</foreach>" +
"</script>")
   @Options(useGeneratedKeys = true, keyProperty = "id")
   void batchInsert(List<Book> list);

/* 根据分类id删除*/
   @Delete("delete from book where id=#{id}")
   void delete(int id);
}
package com.imooc.ibook.biz;

import com.imooc.ibook.entity.Book;
import com.sun.org.apache.xml.internal.resolver.Catalog;

import java.util.List;

public interface BookBiz {

   List<Book> findAll();
List<Book> findById(int categoryId);
void add(List<Book> list);
void remove(int id);
}
package com.imooc.ibook.biz.impl;

import com.imooc.ibook.biz.BookBiz;
import com.imooc.ibook.dao.BookDao;
import com.imooc.ibook.entity.Book;
import com.imooc.ibook.global.DaoFactory;

import java.util.List;

public class BookBizImpl implements BookBiz {
   private BookDao bookDao = DaoFactory.getInstence().getDao(BookDao.class);

public List<Book> findAll(){
       return bookDao.findAll();
}
   public List<Book> findById(int categoryId) {
       return bookDao.findById(categoryId);
}

   public void add(List<Book> list) {

       bookDao.batchInsert(list);
}

   public void remove(int id) {
       bookDao.delete(id);

}
}
package com.imooc.ibook.controller;

import com.imooc.ibook.biz.BookBiz;
import com.imooc.ibook.biz.impl.BookBizImpl;
import com.imooc.ibook.entity.Book;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

public class BookController {

   private BookBiz bookBiz = new BookBizImpl();
//    private CategoryBiz categoryBiz = new CategoryBizImpl();

   //查询所有图书信息
   public void findAll(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
       List<Book> list = bookBiz.findAll();
request.setAttribute("booklist", list);
request.getRequestDispatcher("/admin/book.jsp").forward(request, response);
}


   //根据书类id查询图书的信息
   public void findById(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       int id = Integer.parseInt(request.getParameter("id"));
List<Book> list = bookBiz.findById(id);
request.setAttribute("booklist", list);
request.getRequestDispatcher("/admin/book.jsp").forward(request, response);
}

   //跳转至新增加图书页面
   public void toAdd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        List<Category> categoryList = categoryBiz.selectAll();
//        request.getServletContext().setAttribute("categoryList", categoryList);
       request.getRequestDispatcher("/admin/add_book.jsp").forward(request, response);
}

   //批量增加图书
   public void add(HttpServletRequest request, HttpServletResponse response) throws FileUploadException, IOException, ServletException {
       Book book = new Book();
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> list = upload.parseRequest(request);
List<Book> books = new ArrayList<Book>();
int count = 0;
for (FileItem item : list) {
           if (item.isFormField()) {
               if (item.getFieldName().equals("name")) {
                   book.setName(item.getString("UTF-8"));
}
               if (item.getFieldName().equals("categoryId")) {
                   book.setCategoryId(Integer.parseInt(item.getString("UTF-8")));
}
               if (item.getFieldName().equals("level")) {
                   book.setLevel(Integer.parseInt(item.getString("UTF-8")));
}
               if (item.getFieldName().equals("price")) {
                   book.setPrice(Integer.parseInt(item.getString("UTF-8")));
}
           } else {
               if (item.getFieldName().equals("imagePath")) {
                   if (item.getSize() < 100) {
                       continue;
}
                   String rootPath = request.getServletContext().getRealPath("/");
String path = item.getName();
String type = ".jpg";
if (path.indexOf(".") != -1) {
                       type = path.substring(path.lastIndexOf("."));
}
                   path = "/download/images/" + System.currentTimeMillis() + type;
try {
                       item.write(new File(rootPath + path));
book.setImgPath(path);
} catch (Exception e) {
                       e.printStackTrace();
}


               }
           }
           if (count%5==0) {

               Timestamp createTime = new Timestamp(System.currentTimeMillis());
Timestamp updateTime =createTime;
book.setCreateTime(createTime);
book.setUpdateTime(updateTime);
books.add(book);
book = new Book();
}
       }

       bookBiz.add(books);
request.getRequestDispatcher("findAll.do").forward(request,response);
}

   //删除图书的方法
   public void remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       int id = Integer.parseInt(request.getParameter("id"));
bookBiz.remove(id);
request.getRequestDispatcher("findAll.do").forward(request,response);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>图书列表</title>
   <link rel="stylesheet" href="${pageContext.request.contextPath}/admin/css/index.css">
   <link rel="stylesheet" href="${pageContext.request.contextPath}/admin/css/bootstrap.min.css">
</head>

<body>
<header>
   <div class="container">

       <c:forEach items="${categoryList}" var="category">
           <nav>
               <a href="/admin/Book/findById.do?id=${category.id}" >${category.name}</a>
           </nav>
       </c:forEach>
<%--        <nav>--%>
<%--            <a href="" >Java</a>--%>
<%--        </nav>--%>
<%--        <nav>--%>
<%--            <a href="" >前端</a>--%>
<%--        </nav>--%>
<%--        <nav>--%>
<%--            <a href="" >分类</a>--%>
<%--        </nav>--%>

   </div>
</header>
<section class="banner">
   <div class="container">
       <div>
           <h1>图书</h1>
           <p>图书列表</p>
       </div>
   </div>
</section>
<section class="main">
   <div class="container">
       <table class="table table-striped">
           <thead>
           <tr>
               <th>名称</th>
               <th>分类</th>
               <th>创建时间</th>
               <th>最后修改时间</th>
               <th>操作</th>
           </tr>
           </thead>
           <tbody>
           <c:forEach items="${booklist}" var="book">
               <tr>
                   <td>${book.name}</td>
                   <td>${book.category.id}</td>
                   <td>${book.imgPath}</td>
                   <td>${book.createTime}</td>
                   <td>${book.updateTime}</td>
                   <td><a href="/admin/Book/remove.do?id=${book.id}">删除</a></td>



               </tr>
           </c:forEach>
           </tbody>
       </table>
   </div>
</section>
<section class="page">
   <div class="container">
       <div id="fatie">
           <a href="/admin/Book/toAdd.do"><button>图书新建</button></a>
       </div>
   </div>
</section>
<footer>
   copy@慕课网
</footer>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>新建</title>
   <link rel="stylesheet" href="${pageContext.request.contextPath}/admin/css/bootstrap.min.css">
   <link rel="stylesheet" href="${pageContext.request.contextPath}/admin/css/add.css">
</head>
<body>
<nav class="navbar navbar-default">
   <div class="container">
       <div class="navbar-header">
           <a class="navbar-brand" href="/admin/Book/findAll.do">
               慕课网图书管理
</a>
       </div>
   </div>
</nav>
<div class="container">
   <div class="jumbotron">
       <h1>Hello,Admin!</h1>
       <p>请小心的新增图书记录,要是建了一个错误的就不好了。。。</p>
   </div>
   <div class="page-header">
       <h3><small>新建</small></h3>
   </div>
   <form class="form-horizontal" action="/admin/Book/add.do" method="post" enctype="multipart/form-data">
       <div id="content">
           <div class="form-group">
               <label for="name" class="col-sm-2 control-label">名称 :</label>
               <div class="col-sm-8">
                   <input name="name" class="form-control" id="name">
               </div>
           </div>
           <div class="form-group">
               <label class="col-sm-2 control-label">分类 :</label>
               <select name="categoryId" class="col-sm-2 form-control" style="width: auto">
                   <!-- 此处数据需要从数据库中读取 -->
                   <c:forEach items="${categoryList}" var="category">
                       <option id="${category.id}" value="${category.id}">${category.name}</option>
                   </c:forEach>
                   <%--                    <option id="1" value="Java">Java</option>--%>
                   <%--                    <option id="2" value="Java">前端</option>--%>

               </select>
           </div>
           <div class="form-group">
               <label class="col-sm-2 control-label">星级 :</label>
               <select name="level" class="col-sm-2 form-control" style="width: auto">
                   <c:forEach begin="1" end="5" var="i">
                       <option id="${i}" name="level" value="${i}">${i}</option>
                   </c:forEach>
<%--                    <option id="1" value="1">1星</option>--%>
<%--                    <option id="2" value="2">2星</option>--%>
<%--                    <option id="3" value="3">3星</option>--%>
<%--                    <option id="4" value="4">4星</option>--%>
<%--                    <option id="5" value="5">5星</option>--%>
               </select>
           </div>
           <div class="form-group">
               <label class="col-sm-2 control-label">价格 :</label>
               <div class="col-sm-8">
                   <input name="price" type="number" class="form-control" id="price">
               </div>
           </div>
           <div class="form-group">
               <label class="col-sm-2 control-label">图片 :</label>
               <div class="col-sm-8">
                   <input name="imgPath" class="file-loading"
                          type="file" multiple accept=".jpg,.jpeg,.png" data-min-file-count="1"
                          data-show-preview="true">
               </div>
           </div>

       </div>
       <div align="right">
           <button type="button" onclick="addContent()" class="btn btn-primary">增加</button>&nbsp;&nbsp;&nbsp;
       </div>
       <div class="form-group">
           <div class="col-sm-offset-2 col-sm-10">
               <button type="submit" class="btn btn-primary">保存</button>&nbsp;&nbsp;&nbsp;
           </div>
       </div>
   </form>
</div>
<footer class="text-center">
   copy@imooc
</footer>
<script type="text/javascript">
   var index = 1;

function addContent() {
       var html =
'           <h5 class="page-header"></h5>\n' +
'           <div id="_div_"' + index + '>\n' +
'               <div class="form-group">\n' +
'                    <label for="name" class="col-sm-2 control-label">名称 :</label>\n' +
'                    <div class="col-sm-8">\n' +
'                        <input name="name" class="form-control" id="name">\n' +
'                    </div>\n' +
'                </div>\n' +
'                <div class="form-group">\n' +
'                    <label class="col-sm-2 control-label">分类 :</label>\n' +
'                    <select name="categoryId" class="col-sm-2 form-control" style="width: auto">\n' +
'                        <c:forEach var="item" items="${categoryList}">\n' +
'                            <option id="${item.id}" value="${item.id}">${item.name}</option>\n' +
'                        </c:forEach>\n' +
'                    </select>\n' +
'                </div>\n' +
'                <div class="form-group">\n' +
'                    <label class="col-sm-2 control-label">星级 :</label>\n' +
'                    <select name="level" class="col-sm-2 form-control" style="width: auto">\n' +
'                        <option id="1" value="1">1星</option>\n' +
'                        <option id="2" value="2">2星</option>\n' +
'                        <option id="3" value="3">3星</option>\n' +
'                        <option id="4" value="4">4星</option>\n' +
'                        <option id="5" value="5">5星</option>\n' +
'                    </select>\n' +
'                </div>\n' +
'                <div class="form-group">\n' +
'                    <label class="col-sm-2 control-label">价格 :</label>\n' +
'                    <div class="col-sm-8">\n' +
'                        <input name="price" type="number" class="form-control" id="price">\n' +
'                    </div>\n' +
'                </div>\n' +
'                <div class="form-group">\n' +
'                    <label class="col-sm-2 control-label">图片 :</label>\n' +
'                    <div class="col-sm-8">\n' +
'                        <input name="imgPath" class="file-loading"\n' +
'                               type="file" multiple accept=".jpg,.jpeg,.png" data-min-file-count="1"\n' +
'                               data-show-preview="true">\n' +
'                    </div>\n' +
'                </div>\n' +
'             </div>\n';

var newDiv = document.createElement('div');
newDiv.id = '_' + index++;
newDiv.innerHTML = html;
document.getElementById('content').appendChild(newDiv);
}
</script>
</body>
</html>

报错如下

D:\apache-tomcat-8.5.55\bin\catalina.bat run

[2020-12-28 10:31:09,921] Artifact IDEAibook:war exploded: Waiting for server connection to start artifact deployment...

Using CATALINA_BASE:   "C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\Unnamed_IDEAibook"

Using CATALINA_HOME:   "D:\apache-tomcat-8.5.55"

Using CATALINA_TMPDIR: "D:\apache-tomcat-8.5.55\temp"

Using JRE_HOME:        "D:\JDK8"

Using CLASSPATH:       "D:\apache-tomcat-8.5.55\bin\bootstrap.jar;D:\apache-tomcat-8.5.55\bin\tomcat-juli.jar"

Connected to the target VM, address: '127.0.0.1:51103', transport: 'socket'

28-Dec-2020 22:31:11.693 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/8.5.55

28-Dec-2020 22:31:11.698 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器构建:        May 5 2020 22:10:54 UTC

28-Dec-2020 22:31:11.699 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 服务器版本号(:     8.5.55.0

28-Dec-2020 22:31:11.699 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 操作系统名称:      Windows 7

28-Dec-2020 22:31:11.699 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.版本:           6.1

28-Dec-2020 22:31:11.699 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 架构:              amd64

28-Dec-2020 22:31:11.699 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 环境变量:     D:\JDK8\jre

28-Dec-2020 22:31:11.700 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java虚拟机版本:    1.8.0_251-b08

28-Dec-2020 22:31:11.700 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.供应商:        Oracle Corporation

28-Dec-2020 22:31:11.700 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:     C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\Unnamed_IDEAibook

28-Dec-2020 22:31:11.700 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:     D:\apache-tomcat-8.5.55

28-Dec-2020 22:31:11.701 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.config.file=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\Unnamed_IDEAibook\conf\logging.properties

28-Dec-2020 22:31:11.701 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager

28-Dec-2020 22:31:11.701 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51103,suspend=y,server=n

28-Dec-2020 22:31:11.701 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-javaagent:C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\captureAgent\debugger-agent.jar

28-Dec-2020 22:31:11.701 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcom.sun.management.jmxremote=

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcom.sun.management.jmxremote.port=1099

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcom.sun.management.jmxremote.ssl=false

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcom.sun.management.jmxremote.password.file=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\Unnamed_IDEAibook\jmxremote.password

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcom.sun.management.jmxremote.access.file=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\Unnamed_IDEAibook\jmxremote.access

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.rmi.server.hostname=127.0.0.1

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djdk.tls.ephemeralDHKeySize=2048

28-Dec-2020 22:31:11.702 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.protocol.handler.pkgs=org.apache.catalina.webresources

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dignore.endorsed.dirs=

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.base=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\Unnamed_IDEAibook

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Dcatalina.home=D:\apache-tomcat-8.5.55

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log 命令行参数:-Djava.io.tmpdir=D:\apache-tomcat-8.5.55\temp

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 使用APR版本[1.7.0]加载了基于APR的Apache Tomcat本机库[1.2.24]。

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR功能:IPv6[true]、sendfile[true]、accept filters[false]、random[true]。

28-Dec-2020 22:31:11.703 信息 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL配置:useAprConnector[false],useOpenSSL[true]

28-Dec-2020 22:31:11.710 信息 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL成功初始化 [OpenSSL 1.1.1g  21 Apr 2020]

28-Dec-2020 22:31:11.952 信息 [main] org.apache.coyote.AbstractProtocol.init 初始化协议处理器 ["http-nio-8080"]

28-Dec-2020 22:31:11.983 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read

28-Dec-2020 22:31:12.018 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1119 ms

28-Dec-2020 22:31:12.089 信息 [main] org.apache.catalina.core.StandardService.startInternal 正在启动服务[Catalina]

28-Dec-2020 22:31:12.089 信息 [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.55

28-Dec-2020 22:31:12.109 信息 [main] org.apache.coyote.AbstractProtocol.start 开始协议处理句柄["http-nio-8080"]

28-Dec-2020 22:31:12.136 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 117 ms

Connected to server

[2020-12-28 10:31:12,268] Artifact IDEAibook:war exploded: Artifact is being deployed, please wait...

28-Dec-2020 22:31:14.037 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。

[2020-12-28 10:31:14,163] Artifact IDEAibook:war exploded: Artifact is deployed successfully

[2020-12-28 10:31:14,164] Artifact IDEAibook:war exploded: Deploy took 1,895 milliseconds

28-Dec-2020 22:31:22.114 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.55\webapps\manager]

28-Dec-2020 22:31:22.244 信息 [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。

28-Dec-2020 22:31:22.257 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.55\webapps\manager]的部署已在[142]毫秒内完成

java.lang.reflect.InvocationTargetException

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at com.imooc.ibook.global.GlobalController.service(GlobalController.java:66)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at com.imooc.ibook.global.EncodingFilter.doFilter(EncodingFilter.java:30)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1627)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:748)

Caused by: org.apache.ibatis.exceptions.PersistenceException: 

### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'img_path' cannot be null

### The error may exist in com/imooc/ibook/dao/BookDao.java (best guess)

### The error may involve com.imooc.ibook.dao.BookDao.batchInsert-Inline

### The error occurred while setting parameters

### SQL: insert into book(category_id,name,level,price,img_path,create_time,update_time) values  (?,?,?,?,?,?,?) , (?,?,?,?,?,?,?) , (?,?,?,?,?,?,?) , (?,?,?,?,?,?,?) , (?,?,?,?,?,?,?)

### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'img_path' cannot be null

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:199)

at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184)

at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:62)

at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)

at com.sun.proxy.$Proxy19.batchInsert(Unknown Source)

at com.imooc.ibook.biz.impl.BookBizImpl.add(BookBizImpl.java:22)

at com.imooc.ibook.controller.BookController.add(BookController.java:104)

... 30 more

Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'img_path' cannot be null

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117)

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)

at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)

at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)

at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370)

at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:47)

at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74)

at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50)

at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)

at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)

at com.sun.proxy.$Proxy16.update(Unknown Source)

at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197)

... 36 more


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿慧 2020-12-29 11:13:17

同学你好,

1、BookController中imagePath写错了,应该是imgPath

参考代码如下:

http://img1.sycdn.imooc.com//climg/5fea9d8a09a1545d05330195.jpg

2、批量新增图书是将多个表单的数据都存放到了到List<FileItem> list中,而且是按照表单从上到下,从左到右的顺序,顺序存放到list中的。

也就是批量添加数据时的多条数据都在list中,那就需要知道循环遍历到什么地方是第一条数据,遍历到什么地方是第二条数据。如果表单中的需要取得的book元素有5个,分别是名称、分类、星级、价格、图片,那么就在循环中加一个整型变量进行计数,当总数%5==0时,说明一条数据遍历完毕,也就是一个表单中数据遍历完毕。数字5与增加几本书无关,5代表一个表单提交了5项数据。

在for循环中需要增加count的值。

参考代码如下:

http://img1.sycdn.imooc.com//climg/5fea9ec10946743606010217.jpg

祝学习愉快~

  • 提问者 视线模糊 #1

    修改了还是没有获得图片路径啊,报错是一样的?

    2020-12-29 19:08:03
  • 提问者 视线模糊 #2

    java.io.FileNotFoundException: E:\IDEAibook\target\IDEAibook-1.0-SNAPSHOT\download\images\1609240446562.jpg (ϵͳ�Ҳ���ָ����·����)

    at java.io.FileOutputStream.open0(Native Method)

    at java.io.FileOutputStream.open(FileOutputStream.java:270)

    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)

    at java.io.FileOutputStream.<init>(FileOutputStream.java:162)

    at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:394)

    at com.imooc.ibook.controller.BookController.add(BookController.java:84)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at 

    Caused by: org.apache.ibatis.exceptions.PersistenceException: 

    ### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'img_path' cannot be null

    ### The error may exist in com/imooc/ibook/dao/BookDao.java (best guess)

    ### The error may involve com.imooc.ibook.dao.BookDao.batchInsert-Inline

    ### The error occurred while setting parameters

    ### SQL: insert into book(category_id,name,level,price,img_path,create_time,update_time) values  (?,?,?,?,?,?,?)

    ### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'img_path' cannot be null

    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)

    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:199)

    Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'img_path' cannot be null



    2020-12-29 19:17:41
  • 好帮手慕阿慧 回复 提问者 视线模糊 #3

    同学你好,可能是图片要上传的目录不存在,程序没有执行到book.setImgPath(path); ,在新增图书时报img_path为null。建议同学先判断要上传的目录是否存在,如果不存在,则创建目录,再上传文件。

    参考代码如下:

    http://img1.sycdn.imooc.com//climg/5febe4e3096723ac06430318.jpg

    祝学习愉快~

    2020-12-30 10:24:40
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师