删除失败,

删除失败,

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>&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="" 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>&nbsp;&nbsp;&nbsp;
</div>
</div>
</form>
</div>
<footer class="text-center" >
copy@imooc
</footer>
</body>
</html>

老师我在删除分页的时候,删除不成功,总提示没有此id,请帮忙查看, 

还有过滤器有没有问题啊; 

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

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

2回答
好帮手慕阿满 2021-04-09 10:12:49

同学你好,关于同学的问题:

1、过滤器中的登录判断,同学可以参考一下如下的代码,

http://img1.sycdn.imooc.com//climg/606fb7170996c00106620309.jpg

如果是login登录,则直接放行,如果是其他的路径,则进行拦截,判断session中USER是否为空,如果为空,则表示没有登录,跳转到登录页面,如果不为空,则放行。在登录的Controller中,判断登录的用户名和密码是否正确,如果正确,则将USER存入session中。

2、本次作业没有要求删除分类后,该分类下的图书也要删除。如果同学要完成该功能,可以在删除分类时,先查询一下该分类下是否有图书信息,如果有,则遍历删除图书信息后,再删除分类。

祝学习愉快~

  • 提问者 rock221 #1

    过滤器这样写有个问题,登录后要跳转到后台页面进行session的set,这时候url里面就没有login了。也会被拦截了。 这样的话session还没有set成功阿就被拦截了。 session里面肯定是null啊啊 死循环啊。 

    2021-04-09 10:17:58
  • 好帮手慕阿满 回复 提问者 rock221 #2

    同学你好,登录的url是自己设置的,如果登录的url中不包括login,而是其他,可以在if判断中增加一个判断,例如if(path.toLowerCase.index("登录的url")!=-1),然后将其放行。这样登录时不会被拦截,可以在登录的Controller中将正确的用户信息存入Session。

    祝学习愉快~

    2021-04-09 14:55:55
  • 提问者 rock221 回复 好帮手慕阿满 #3
    那访问其他的内部信息,如果放心的话,就会造成没有登录直接进去的情况了啊,应该对所有的进行拦截吧,
    2021-04-09 14:58:30
好帮手慕阿满 2021-04-08 18:55:30

同学你好,同学提供的代码不完整,XMLDataSource中不存在getCategory()方法,无法具体测试。这里对同学的部分代码进行了检查,有如下问题:

1、过滤中建议只做是否登录的判断,判断session中的user是否为null,如果为空,表示没有登录,跳转到登录页面。获取用户名以及密码并登录的操作建议在登录的controller中完成,如果登录成功,将user信息存入session。

2、删除分类的代码也有问题,不能在for循环中直接抛出异常,

http://img1.sycdn.imooc.com//climg/606edfbb094996e309380287.jpg

如果要删除第2条数据,则第一次没有查询对应的分类,就会抛出异常。可以定义一个boolean类型值flag,并赋值为false,在循环中,如果查询到对应的分类,将flag的值改为true,在循环外对flag进行判断,如果为true,则表示查询到对应的分类,并进行删除,如果为false,则表示没有查询到对应的分类,抛出异常。

另外删除分类时,应该使用p.getParent().remove(p);,而不是nodes.remove(p);。

建议同学修改一下再试试。

祝学习愉快~

  • 提问者 rock221 #1

    过滤器我设置就是没有登录放行啊,但是我发现我有时候刷新的时候,就跳回登录页面了,这是为什么阿。

    2021-04-08 19:06:07
  • 提问者 rock221 #2

    老师还有一个问题, 在对图书分类删除之后, 对应该类的图书会被删除吗?如果会的话,怎么关联到一起阿。怎么删除分类后,对应该类的图书自动也消失啊。

    2021-04-08 19:18:38
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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