添加图书的时候图书的图片路径报空
# 具体遇到的问题
添加图书的时候,没有获得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>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">保存</button>
</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、BookController中imagePath写错了,应该是imgPath
参考代码如下:
2、批量新增图书是将多个表单的数据都存放到了到List<FileItem> list中,而且是按照表单从上到下,从左到右的顺序,顺序存放到list中的。
也就是批量添加数据时的多条数据都在list中,那就需要知道循环遍历到什么地方是第一条数据,遍历到什么地方是第二条数据。如果表单中的需要取得的book元素有5个,分别是名称、分类、星级、价格、图片,那么就在循环中加一个整型变量进行计数,当总数%5==0时,说明一条数据遍历完毕,也就是一个表单中数据遍历完毕。数字5与增加几本书无关,5代表一个表单提交了5项数据。
在for循环中需要增加count的值。
参考代码如下:
祝学习愉快~
- 参与学习 人
- 提交作业 357 份
- 解答问题 8016 个
本阶段将带你学习MySQL数据库,JDBC接口,MyBatis框架等,带你掌握的数据的存放和管理。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星