在添加时,添加新的数据,而是又重复添加xml里面的数据,这是为什么?

来源:5-3 项目作业

慕帅5138158

2021-04-01 13:26:06

问题描述:

在添加时,添加新的数据,而是又重复添加xml里面的数据,这是为什么?

相关代码:

ManagementController:

package com.pre.library.controller;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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 com.pre.library.entity.Books;
import com.pre.library.service.BookService;

/**
 * Servlet implementation class ManagementController
 */
@WebServlet("/management")
public class ManagementController extends HttpServlet {
private static final long serialVersionUID = 1L;
    private  BookService bookService=new BookService(); 
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ManagementController() {
        super();
        // TODO Auto-generated constructor stub
    }

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String method = request.getParameter("method");
if ("bookList".equals(method)) {
this.list(request, response);
}else if ("show_addBook".equals(method)) {
this.addBook(request, response);
    } else if ("createBook".equals(method)) {
        this.createBook(request, response);
    } 
}
//图书展示
private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 List<Books> list = bookService.bookList();
request.setAttribute("bookList", list);
request.getRequestDispatcher("/WEB-INF/jsp/bookList.jsp").forward(request, response);
}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
//显示新增页面
private void addBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/jsp/addBook.jsp").forward(request, response);
}
//新增图书信息
private void createBook(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 初始化FileUpload组件
FileItemFactory factory = new DiskFileItemFactory();
/**
 * FileItemFactory 用于将前端表单的数据转换为一个个FileItem对象
 * ServletFileUpload 则是为FileUpload组件提供Java web的Http请求解析
 */
ServletFileUpload sf = new ServletFileUpload(factory);
//2.遍历所有FileItem
try {
List<FileItem>formData=sf.parseRequest(request);
Books book=new Books();
for(FileItem fi:formData) {
if(fi.isFormField()) {
System.out.println("普通输入项:" + fi.getFieldName() + ":" + fi.getString("UTF-8"));
switch (fi.getFieldName()) {
case "bookId":
book.setBookId(Integer.parseInt(fi.getString("UTF-8")));
break;
case "bookName":
book.setBookName(fi.getString("UTF-8"));
break;
case "categoryId":
book.setCategoryId(fi.getString("UTF-8"));
break;
case "bookPrice":
book.setBookPrice(Integer.parseInt(fi.getString("UTF-8")));
break;
case "remarks":
book.setRemarks(fi.getString("UTF-8"));
break;
default:
break;
}
}else {
System.out.println("文件上传项:" + fi.getFieldName());
//3.文件保存到服务器目录
String path = request.getServletContext().getRealPath("/upload");
System.out.println("上传文件目录:" + path);
//String fileName = "test.jpg";
String fileName = UUID.randomUUID().toString();
//fi.getName()得到原始文件名,截取最后一个.后所有字符串,例如:wxml.jpg->.jpg
String suffix = fi.getName().substring(fi.getName().lastIndexOf("."));
//fi.write()写入目标文件
fi.write(new File(path,fileName + suffix));
book.setBookPic("/upload/" + fileName + suffix);
}
}
bookService.addBook(book);
response.sendRedirect("/management?method=bookList");//返回列表页
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();

}



}
}

相关代码:

BookDao:

package com.pre.library.dao;

import java.util.List;

import com.pre.library.entity.Books;
import com.pre.library.utils.XmlDataSource;

public class BookDao {
//图书信息的展示,通过XmlDataSource文件进行读取
public List<Books> bookList() {
List<Books> bookList = XmlDataSource.bookData();
return bookList;
}
//图书添加
public void addBook(Books book) {
XmlDataSource.appendBook(book);
}
}

相关代码:

Books:

package com.pre.library.entity;
/**
* 1.类型描述:图书id,图书名,图书分类,价格,图书封面,备注
* @author zhanzhimin
*
*/
public class Books {
private Integer bookId;//图书id
private String bookName;//图书名
private String categoryId;//图书分类分类1-计算机2-软件工程
private Integer bookPrice;//价格
private String bookPic;//图书封面
private String remarks;//备注
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getCategoryId() {
return categoryId;
}
public void setCategoryId(String categoryId) {
this.categoryId = categoryId;
}
public Integer getBookPrice() {
return bookPrice;
}
public void setBookPrice(Integer bookPrice) {
this.bookPrice = bookPrice;
}
public String getBookPic() {
return bookPic;
}
public void setBookPic(String bookPic) {
this.bookPic = bookPic;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}


}

相关代码:

BookService:

package com.pre.library.service;

import java.util.List;

import com.pre.library.dao.BookDao;
import com.pre.library.entity.Books;


public class BookService {
private BookDao bookDao=new BookDao();
//图书的展示
public List<Books> bookList() {
/*List<Books> bookList = XmlDataSource.bookData();
return bookList;*/
return bookDao.bookList();
}
//图书添加
public void addBook(Books book) {
bookDao.addBook(book);
}
public static void main(String[] arge) {
BookService bookService=new BookService();
List<Books> booklist=bookService.bookList();
for(Books books:booklist) {
System.out.println(books.getBookName());
}
}
}

相关代码:

XmlDataSource:

package com.pre.library.utils;



import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import com.pre.library.entity.Books;

/**
* 数据源类,用于XML文件解析为Java对象
*
* @author zhanzhimin
*/
public class XmlDataSource {
private static List<Books> data = new ArrayList<Books>();
private static String dataFile;
static {
// painting.xml文件完整物理地址
// c:\new style\book.xml
// c:\new%20style\book.xml
dataFile = XmlDataSource.class.getResource("/book.xml").getPath();
reloadBooks();
}

public static void reloadBooks() {
// 通过URLDecoder类将Base64转换成普通字符窜
URLDecoder decoder = new URLDecoder();
try {
dataFile = decoder.decode(dataFile, "utf-8");
System.out.println(dataFile);
// 利用dom4j对xml解析
SAXReader reader = new SAXReader();
Document document = reader.read(dataFile);
List<Node> list = document.selectNodes("/root/book");
for (Node node : list) {
Element element = (Element) node;
String bookId = element.elementText("bookId");
String bookName = element.elementText("bookName");
Books book = new Books();
book.setBookId(Integer.parseInt(bookId));
book.setBookName(bookName);
book.setCategoryId(element.elementText("categoryId"));
book.setBookPrice(Integer.parseInt(element.elementText("bookPrice")));
book.setBookPic(element.elementText("bookPic"));
book.setRemarks(element.elementText("remarks"));
data.add(book);
System.out.println(bookId + ":" + bookName);
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 添加图书的信息
* @param 实体对象Books book
*
*/
public static void appendBook(Books book) {
//通过SAXReader读取xml文档,得到Document
SAXReader reader=new SAXReader();
Writer writer=null;
try {
Document document=reader.read(dataFile);
//2.创建book.xml的book节点
Element root=document.getRootElement();
Element b=root.addElement("book");
//3.创建各个节点
b.addElement("bookId").setText(book.getBookId().toString());
b.addElement("bookName").setText(book.getBookName());
b.addElement("categoryId").setText(book.getCategoryId());
b.addElement("bookPrice").setText(book.getBookPrice().toString());
b.addElement("bookPic").setText(book.getBookPic());
b.addElement("remarks").setText(book.getRemarks());
//4.完成追加,写入xml
writer=new OutputStreamWriter(new FileOutputStream(dataFile),"UTF-8");
document.write(writer);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(writer!=null) {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
reloadBooks() ;
}
}
public static List<Books> bookData() {
return data;

}
public static void main(String[] args) {
/*new XmlDataSource();
List<Books> bk=XmlDataSource.bookData();
System.out.println(bk);*/
/*Books b=new Books();
b.setBookId(1000);
b.setBookName("软件更新");
b.setCategoryId("计算机");
b.setBookPrice(100);
b.setBookPic("/image/g1.jpg");
b.setRemarks("测试");
XmlDataSource.appendBook(b);*/
}
}

相关代码:

addBook.jsp:

<%@page contentType="text/html;charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新建图书信息</title>
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/add.css">
<script type="text/javascript" href="js/validation.js"></script>
<script>
function submit() {
var a = checkEmpty("#bookId");
var b = checkEmpty('#bookName');
var c = checkCategory('#categoryId');
var d = checkPrice('#bookPrice');
var e = checkFile('#bookPic');
var f = checkEmpty('#remarks');
if (a && b && c && d && e && f)) {
return true;
} else {
return false;
}
}
</script>
</head>
<body>
<nav class="navbar navbar-default">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/dept/list.do"> 图书信息管理 </a>
</div>
</div>
</nav>
<div class="container">
<div class="jumbotron">
<h1>Hello,${sessionScope.user.userName}!</h1>
<p>请小心地新增图书信息,要是建了一个错误的就不好了。。。</p>
</div>
<div class="page-header">
<h3>
<small>新建</small>
</h3>
</div>
<form class="form-horizontal" action="/management?method=createBook"
method="post" enctype="multipart/form-data"
onsubmit="return submit()">

<div class="form-group">
<label for="name" class="col-sm-2 control-label">图书编号 :</label>
<div class="col-sm-8">
<input name="bookId" class="form-control" id="bookId"
onblur="checkEmpty('#bookId')">
</div>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">图书名称 :</label>
<div class="col-sm-8">
<input name="bookName" class="form-control" id="bookName"
onblur="checkEmpty('#bookName')">
</div>
</div>
<div class="form-group">
<label for="categoryId" class="col-sm-2 control-label">分类 :</label>
<select id="categoryId" name="categoryId"
class="col-sm-2 form-control"
onchange="checkCategory('#categoryId')"
style="width: auto; margin-left: 15px">
<option value="ca001" selected="">计算机</option>
<option value="ca0002">文学</option>
<option value="ca0003">历史</option>
<!-- 下拉列表的内容要从分类中进行读取,value值是分类id -->
</select>
</div>

<div class="form-group">
<label for="name" class="col-sm-2 control-label">价格 :</label>
<div class="col-sm-8">
<input name="bookPrice" class="form-control" id="bookPrice"
onblur="checkPrice('#bookPrice')">
</div>
</div>

<div class="form-group">
<label for="name" class="col-sm-2 control-label">图书封面 :</label> <input
type="file" id="bookPic" name="bookPic" style="padding-left: 15px"
accept="image/*" onchange="checkFile('#bookPic')">
</div>

<div class="form-group">
<label for="name" class="col-sm-2 control-label">备注 :</label>
<div class="col-sm-8">
<input name="remarks" class="form-control" id="remarks"
onblur="checkEmpty('#remarks')">
</div>
</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>
</body>
</html>

相关代码:

bookList.jsp:

<%@page contentType="text/html;charset=utf-8"%>
<%@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="css/index.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
<script type="text/javascript" href="/js/jquery-3.4.1.js"></script>
</head>

<body>
<header>
<div class="container">
<nav>
<a href="/management?method=bookList">图书信息管理</a>
</nav>
<nav>
<a href="categoryList.html">分类管理</a>
</nav>

</div>
</header>
<section class="banner">
<div class="container">
<div>
<h1>图书管理系统</h1>
<p>图书信息管理</p>
</div>
</div>
</section>
<section class="main">


<div class="container">
<form class="form-horizontal" action="/searchBook" method="post">
<div class="form-group" style="float: right;">
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary">查询</button>
&nbsp;&nbsp;&nbsp;
</div>
</div>
<div class="form-group" style="float: right; width: 300px;">
<div class="col-sm-8">
<input name="searchContent" class="form-control"
id="searchContent" placeholder="输入要查询的分类" style="width: 250px">
</div>
</div>


</form>
</div>
<div class="container">

<table class="table table-striped">
<thead>
<tr>
<th>序号</th>
<th>图书编号</th>
<th>图书名称</th>
<th>分类</th>
<th>价格</th>
<th>图书封面</th>
<th>操作</th>

</tr>
</thead>
<tbody>
<c:forEach items="${bookList}" var="bookList" varStatus="idx">
<tr>
<td>${idx.index + 1}</td>
<td>${bookList.bookId}</td>
<td>${bookList.bookName}</td>
<td>${bookList.categoryId}</td>
<td><fmt:formatNumber pattern="¥0.00"
value="${bookList.bookPrice}"></fmt:formatNumber></td>
<td><img src="${bookList.bookPic}"></td>
<td><a href="/management?method=show_updateBook">修改</a> <a
href="/deleteBook?bookId=book0001">删除</a></td>
<!--在循环显示数据时,此处的book0001可以用EL表达式进行替换-->

</tr>
</c:forEach>
</tbody>
</table>
</div>
</section>
<section class="page">
<div class="container">
<div id="fatie">
<a href="/management?method=show_addBook"><button>新建</button></a>
</div>
</div>
</section>
<footer> copy@慕课网 </footer>
</body>
</html>

相关截图:

服务器:

http://img.mukewang.com/climg/6065592109683b5016130861.jpghttp://img.mukewang.com/climg/6065592109e1870c15600852.jpg

控制台:

http://img.mukewang.com/climg/606558b8095352b011850845.jpg

写回答

1回答

好帮手慕阿慧

2021-04-01

同学你好,

1、出现重复数据,是因为reloadBooks()方法中是往data集合中添加xml中的数据。建议同学在添加数据之前 清空data集合。

参考代码如下:

http://img.mukewang.com/climg/606577c8090592de05150302.jpg

2、报Adding text to an XML document must not be null错误,建议同学在提交表单之前看一下数据是否为空。如果为空,则不提交表单。

checkEmpty()方法需要传入两个参数,分别是表单域选择器和错误提示选择器。

参考代码如下:

http://img.mukewang.com/climg/60657cb009e1a13d08220454.jpg

http://img.mukewang.com/climg/60657d0809513c3506960454.jpg

祝学习愉快~

0

0 学习 · 16556 问题

查看课程