删除失败,
xml类:
package com.imooc.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.imooc.library.entity.Category;
import com.imooc.library.entity.User;
/**
* 数据源类,用于读取xml信息
* @author nieyafei
*
*/
public class XmlDataSource {
//创建userData对象,且唯一
private static List<User> userData=new ArrayList();
//创建图书分类对象,category,且唯一
private static List<Category> categoryData=new ArrayList();
//创建和xml文件进行交互的变量
private static String userDataFile; //用户账号文件读取
private static String categoryDataFile; //分类文件读取
//添加静态块,当类加载的时候读取文件,因为uesr类不存在更新信息,所以不用添加更新方法
static {
//获取当前类编译后存放classes类下对应的目录文件路径-user.xml;
userDataFile=XmlDataSource.class.getResource("/user.xml").getPath();
reloadUser();
}
//添加静态块,用来存放读取book和category.xml,已经需要新增改写,所以需要添加更新方法
static {
//获取当前类编译后存放classes类下对应的目录文件路径-category.xml;
categoryDataFile=XmlDataSource.class.getResource("/category.xml").getPath();
reloadCategory();
}
/**
* 初始化用户的方法,读取xml内用户信息
*/
public static void reloadUser() {
//获取的文件是base64格式,转换成字符串,通过核心类URLDecoder实现
URLDecoder decoder=new URLDecoder();
try {
//通过decoder.decode方法对其进行转换utf-8字符集
userDataFile=decoder.decode(userDataFile,"utf-8");
//dom4j读取文件,返回document对象
SAXReader reader=new SAXReader();
Document document=reader.read(userDataFile);
//通过xpath对根节点进行获取 ,返回Nodes的list集合
List<Node> nodes=document.selectNodes("/root/user");
//防止重复信息录入,清除之前的集合信息
userData.clear();
//进行遍历,并对元素进行获取并载入user对象内
for(Node node:nodes) {
//node是集合需转换成element对象
Element element=(Element)node;
//对user对象进行实例化,
User user=new User();
user.setName(element.elementText("name")); //用户名的文本
user.setPassword(element.elementText("password")); //密码的文本;
//存入集合中
userData.add(user);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 获取所有用户信息
* @return userData集合,也就是user对象;
*/
public static List<User> getUsers(){
return userData;
}
/**
* 初始化分类的方法
*/
private static void reloadCategory() {
//从base64格式转为字符串
URLDecoder decoder=new URLDecoder();
System.out.println(categoryDataFile);
try {
categoryDataFile=decoder.decode(categoryDataFile,"utf-8");
//dom4j读取文件
SAXReader reader=new SAXReader();
Document document=reader.read(categoryDataFile); //获取document对象
//xpath 多根节点下的子节点进行读取
List<Node> nodes=document.selectNodes("/root/catergory");
//对之前集合内信息清除
categoryData.clear();
//遍历nodes对象
for(Node node:nodes) {
//每个node转换成element对象
Element element=(Element)node;
//对category类进行实例化,把节点载入进去
Category category=new Category();
category.setId(Integer.parseInt(element.elementText("categoryId")));
category.setName(element.elementText("categoryName"));
categoryData.add(category); //封装到集合内;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 添加分类的方法
*/
public static void appendCategory(Category category) {
//通过dom4j对文件进行读取
SAXReader reader=new SAXReader();
Writer writer=null;
try {
//读取文件,返回dom对象
Document document=reader.read(categoryDataFile);
//得到原始文件的根节点
Element root=document.getRootElement();
//通过根节点创建子节点
Element p=root.addElement("catergory");
//在子节点中创建子节点+属性值
p.addElement("categoryId").addText(category.getId().toString()); //创建id节点+前端传来的p.属性值
p.addElement("categoryName").addText(category.getName());//名称节点+属性值
//将节点信息写入文件
writer=new OutputStreamWriter(new FileOutputStream(categoryDataFile),"utf-8");
//通过dom把p写入到文件内
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();
}
}
//更新信息
reloadCategory();
}
}
/**
* 删除分类方法
* @param categoryId 根据id删除
*/
public static void deleteCatgory(String categoryId) {
//通过dom4j读取文件
SAXReader reader=new SAXReader();
Writer writer=null;
try {
Document document=reader.read(categoryDataFile);
//通过xpath 对文件中节点读取
List<Node> nodes=document.selectNodes("/root/catergory");
//通过遍历
Element p=null;
for(Node node:nodes) {
Element element=(Element)node;
if(element.element("categoryId").getText().equals(categoryId)) {
p=element;
break;
}else {
throw new RuntimeException("无此id");
}
}
nodes.remove(p);
//写入
writer=new OutputStreamWriter(new FileOutputStream(categoryDataFile),"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();
}
}
reloadCategory();
}
}
用户类:
package com.imooc.library.entity;
//用户账号信息 javabean
public class User {
private String name; //账号
private String password; //密码
//构造方法
public User() {
}
//get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + "]";
}
}
用户实现类:
package com.imooc.library.service;
import java.util.List;
import com.imooc.library.entity.User;
/**
* 用户处理类
* @author nieyafei
*
*/
public class UserServiceImpl {
/**
* 用户账号密码匹配处理
* @param listUser 数据库已有的user对象
* @param user 前端传来的user属性
* @return 0代表登录失败,1代表登录成功
*/
public int login(List<User> listUser,User user) {
int n=0;
//对原有的数据库内的信息进行遍历,取出的值和现输入的值进行匹配,true返回1,false返回0
for(User oldUser:listUser) {
if(oldUser.getName().equals(user.getName())&&oldUser.getPassword().equals(user.getPassword())) {
System.out.println("--------------------------4");
n=1;
break;
}else{
System.out.println("--------------------------5");
n=0;
break;
}
}
return n;
}
}
分类实现:
package com.imooc.library.service;
import java.util.List;
import com.imooc.library.entity.Category;
import com.imooc.library.utils.XmlDataSource;
/**
* 图书分类处理类
* @author nieyafei
*
*/
public class CategoryServiceImpl {
/**
* 分类显示方法
* @return 所有分类数据
*/
public List<Category> showCategory(){
List<Category> showCategory=XmlDataSource.getCategory();
return showCategory;
}
/**
* 添加分类方法
* @param categoryId 分类id
* @param catgoryName 分类名称
*/
public void addCatgory(String categoryId, String catgoryName) {
//对前端信息进行封装
Category category=new Category();
category.setId(Integer.parseInt(categoryId));
category.setName(catgoryName);
XmlDataSource.appendCategory(category);
}
/**
* 通过id删除分类方法
* @param categoryId 分类的id
*/
public void deleteCategory(String categoryId) {
System.out.println("--------------------删除2");
XmlDataSource.deleteCatgory(categoryId);
}
}
分类:
package com.imooc.library.entity;
/**
* 图书分类javabean
* @author nieyafei
*
*/
public class Category {
private Integer id; //分类id
private String name; //分类名称
public Category() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "分类: [id=" + id + ", name=" + name + "]";
}
}
监听器:
package com.imooc.library.utils;
import java.io.IOException;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.imooc.library.entity.User;
import com.imooc.library.service.UserServiceImpl;
/**
* 判断用户是否登录的过滤器
*
* @author nieyafei
*
*/
public class AuthFilter implements Filter {
private UserServiceImpl userServiceImpl = new UserServiceImpl();
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 转换http
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
// 获取uri
String uri = req.getRequestURI();
// 获取前端的账号,密码属性
String userName = req.getParameter("username");
String userPassword = req.getParameter("password");
// 获取servletContext中的原始账号数据集合
ServletContext context = req.getServletContext();
List<User> userData = (List<User>) context.getAttribute("userData");
// 把前端参数封装到uesr对象内
User user = new User();
user.setName(userName);
user.setPassword(userPassword);
// 根据userServiceImpl中的方法判断,返回值1说明匹配成功,则转发到后台页面,返回0则登录失败,转发登录页面
if ((userServiceImpl.login(userData, user)) == 1) {
System.out.println("--------------------------2");
// 登录成功则把账号信息存入session中,方便过滤器判断
req.getSession().setAttribute("userName", user); // user则为当前请求中的账号参数
}
System.out.println(uri);
// 对当前请求的uri进行判断
if (uri.startsWith("/login")||uri.endsWith(".css")||uri.endsWith(".png")) {
// 放行
System.out.println("-----------------拦截登录过滤器1放行");
chain.doFilter(request, response);
} else if (req.getSession().getAttribute("userName") != null) { //判断登录是否输入密码
// 放行
System.out.println("-----------------拦截登录过滤器2放行");
chain.doFilter(request, response);
// }else if(request.getParameter("categoryId")!=null) { //判断分页输入信息后刷新是否放行;
// System.out.println("-----------------拦截登录过滤器3放行");
// chain.doFilter(request, response);
}
else {
System.out.println("-----------------拦截登录过滤器4转回登录页面");
res.sendRedirect("/login.jsp");
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
过滤器:
package com.imooc.library.utils;
import java.util.List;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.imooc.library.entity.User;
/**
* 监听器,把user的集合存放到ServletContext中;
* @author nieyafei
*
*/
public class InitListener implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent sce) {
//获取集合
List<User> userData=XmlDataSource.getUsers();
//把原始数据保存到servletContext中;
sce.getServletContext().setAttribute("userData", userData);
System.out.println("--------------------监听器初始化成功");
}
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 账号密码文件 -->
<root>
<user>
<name>admin</name>
<password>123456</password>
</user>
<user>
<name>张三</name>
<password>123</password>
</user>
<user>
<name>李四</name>
<password>123</password>
</user>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<catergory>
<categoryId>1</categoryId>
<categoryName>计算机类</categoryName>
</catergory>
<catergory>
<categoryId>2</categoryId>
<categoryName>历史类</categoryName>
</catergory>
<catergory>
<categoryId>3</categoryId>
<categoryName>学科类</categoryName>
</catergory>
</root>
jsp:
<%@page contentType="text/html;charset=utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="/css/login.css">
<script type="text/javascript" src="/js/jquery-3.6.0.js"></script>
<script type="text/javascript" src="/js/sweetalert2.js"></script>
<script type="text/javascript">
//账号校验事件
function checkEmpty(input,errSelector){
//获取value值
var val=$(input).val();
//判断val的值是否为空
if($.trim(val)==""){
$(errSelector).text("请输入账号");
return false;
}else{
$(errSelector).text("");
return true;
}
}
//密码效验事件
function checkPassword(input,errSelector){
//获取密码的value值
var val=$(input).val();
//用正则表达式设置密码
var regex=/^[a-z|A-Z|0-9]+$/;
//用来判断是否匹配
if(regex.test(val)==false){
$(errSelector).text("无效密码");
return false;
}else{
$(errSelector).text("");
return true;
}
}
//表单提交事件校验
function checkSubmit(){
var r1=checkEmpty('#name','#errName');
var r2=checkPassword('#pwd','#errPassword');
if(ri&&r2){
return true;
}else{
return false;
}
}
</script>
</head>
<body>
<div class="login">
<div class="header">
<h1>
<a href="/login.do">登录</a>
</h1>
<button></button>
</div>
<form action="/management?method=login" method="post" onsubmit="return checkSubmit()">
<div class="name">
<span id="errName" style="color:red"></span> <!-- 显示错误信息 -->
<input type="text" id="name" name="username" onblur="checkEmpty('#name','#errName')">
<p></p>
</div>
<div class="pwd">
<span id="errPassword" style="color:red"></span> <!-- 显示错误信息 -->
<input type="password" id="pwd" name="password" onblur="checkPassword('#pwd','#errPassword')">
<p></p>
</div>
<div class="btn-red">
<input type="submit" value="登录" id="login-btn">
</div>
</form>
</div>
</body>
</html>
<%@page language="java" contentType="text/html;charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书后台管理</title>
<link rel="stylesheet" type="text/css" href="/css/index.css">
<link rel="stylesheet" type="text/css" href="/css/bootstrap.min.css">
</head>
<body>
<header>
<div class="container">
<nav>
<a href="bookList.html" >图书信息管理</a>
</nav>
<nav>
<a href="management?method=category_list" >分类管理</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>
</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="" var="">
<tr id="tr1">
<td>1</td>
<td>book0001</td>
<td>Java基础</td>
<td>计算机类</td>
<td>¥29</td>
<td><img src="img/g1.jpg"></td>
<td>
<a href="/updateBook?bookId=book0001">修改</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="addBook.jsp"><button>新建</button></a>
</div>
</div>
</section>
<footer>
copy@慕课网
</footer>
</body>
</html>
<%@page contentType="text/html;charset=utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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">
</head>
<body>
<header>
<div class="container">
<nav>
<a href="bookList.html" >图书信息管理</a>
</nav>
<nav>
<a href="management?method=category_list" >分类管理</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>
</tr>
</thead>
<tbody>
<c:forEach items="${requestScope.category }" var="category" varStatus="idx">
<tr>
<td>${idx.index+1 }</td>
<td>${category.id }</td>
<td>${category.name }</td>
<td><a href="/management?method=delete_category&id=${category.id }">删除</a></td>
<!--在循环显示数据时,此处的ca0001可以用EL表达式进行替换-->
</tr>
</c:forEach>
</tbody>
</table>
</div>
</section>
<section class="page">
<div class="container">
<div id="fatie">
<a href="management?method=add_category"><button>新建</button></a>
</div>
</div>
</section>
<footer>
copy@慕课网
</footer>
</body>
</html>
<%@page language="java" contentType="text/html;charset=utf-8" %>
<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" src="../../js/jquery-3.6.0.js"></script>
<script type="text/javascript" src="../../js/category.js"></script>
<script type="text/javascript">
//表单验证
function checkSubmit(){
//所有的表单项校验通过,返回true,提交,否则false,不提交
var r1=checkId("#categoryId","#errId"); //获取r1的返回值
var r2=checkName("#categoryName","#errName"); //获取r2的返回值
//判断
if(r1&&r2){
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="">
图书分类管理
</a>
</div>
</div>
</nav>
<div class="container">
<div class="jumbotron">
<h1>Hello, XXX!</h1>
<p>请小心地新增图书分类,要是建了一个错误的就不好了。。。</p>
</div>
<div class="page-header">
<h3><small>新建</small></h3>
</div>
<form class="form-horizontal" action="/management?method=create_category" method="post" onsubmit="return checkSubmit()">
<div class="form-group">
<label for="name" class="col-sm-2 control-label">分类ID :</label>
<div class="col-sm-8">
<span id="errId" style="color:red"></span> <!-- 显示错误信息 -->
<input name="categoryId" class="form-control" id="categoryId" onblur="checkId('#categoryId','#errId')">
</div>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">分类名称 :</label>
<div class="col-sm-8">
<span id="errName" style="color:red"></span> <!-- 显示错误信息 -->
<input name="categoryName" class="form-control" id="categoryName" onblur="checkName('#categoryName','#errName')">
</div>
</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>
</body>
</html>
老师我在删除分页的时候,删除不成功,总提示没有此id,请帮忙查看,
还有过滤器有没有问题啊;
29
收起
正在回答 回答被采纳积分+1
2回答
好帮手慕阿满
2021-04-08 18:55:30
同学你好,同学提供的代码不完整,XMLDataSource中不存在getCategory()方法,无法具体测试。这里对同学的部分代码进行了检查,有如下问题:
1、过滤中建议只做是否登录的判断,判断session中的user是否为null,如果为空,表示没有登录,跳转到登录页面。获取用户名以及密码并登录的操作建议在登录的controller中完成,如果登录成功,将user信息存入session。
2、删除分类的代码也有问题,不能在for循环中直接抛出异常,
如果要删除第2条数据,则第一次没有查询对应的分类,就会抛出异常。可以定义一个boolean类型值flag,并赋值为false,在循环中,如果查询到对应的分类,将flag的值改为true,在循环外对flag进行判断,如果为true,则表示查询到对应的分类,并进行删除,如果为false,则表示没有查询到对应的分类,抛出异常。
另外删除分类时,应该使用p.getParent().remove(p);,而不是nodes.remove(p);。
建议同学修改一下再试试。
祝学习愉快~
java工程师2020版
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星