5-2每次调用appendCategory()方法,整个web应用就会被重载,存在servletContext中变量值都被清空。是哪一步触发了web应用重载?

5-2每次调用appendCategory()方法,整个web应用就会被重载,存在servletContext中变量值都被清空。是哪一步触发了web应用重载?

# 具体遇到的问题
每次调用appendCategory()方法,整个web应用就会被重载,存在servletContext中变量值都被清空。是哪一步触发了web应用重载?

# 报错信息的截图
http://img1.sycdn.imooc.com//climg/5fb6a17b09669a7b09610680.jpg# 相关课程内容截图

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

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

/**

* 添加分类的方法

* 将添加的分类更新到xml文件中

*/

public static void appendCategory(Category category) {

SAXReader reader = new SAXReader();

Writer writer = null;

try {

Document document = reader.read(categoryDataFile);//对象的引用此前categoryDataFile中的转义符已在reload中处理

//创建新的category节点

Element root = document.getRootElement();

Element ca = root.addElement("category");

ca.addElement("category-id").setText(category.getCategoryId());

ca.addElement("category-name").setText(category.getCategoryName());

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();

}

}


正在回答

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

4回答

同学你好,在监听器中初始化用户和图书信息时,信息可以存储在ServletContext域中,项目初始化时获取xml中的信息,并存放域中;在登录的servlet中,登陆成功将用户信息存入session中;并且监听器初始化时只需将用户信息和图书信息存入域中即可;并且同学这样存储flag的值只是0;这里同学无需将flag进行存储,判断用户是否登录应该过滤器中进行判断

参考代码如下

InitListener

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

loginServlet

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

AuthFilter

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

祝学习愉快

好帮手慕阿园 2020-12-04 16:08:14

同学你好,是的,ServletContext对象全局唯一。ServletContext的作用域就是整个服务的开启到关闭,不过使用上下文设置属性,需要使用请求转发获取到内容,所以当在其他文件中没有在域中设置值时,就无法在其他页面中获取到相关数据。并且,当对xml文件进行修改时,web应用重载后就会重新加载ServletContext

而Session是保存在服务器上。当客户端浏览器访问服务器的时候,服务器为每个用户浏览器创建一个session对象;可以保存用户的信息,服务器程序可以把用户数据写到浏览器的session中,比如登录的保存用户信息,从一个网页跳转到另一个网页,用户信息就可以用session保存;session的作用域就是从你登陆这个账户到退出这个账户;所以一般建议将登录信息存在session中

祝学习愉快

  • 提问者 慕虎5485268 #1

    使用session作用域来存储用户数据后,提示如图错误,还有文字“从持久化存储加载会话发生异常”

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

    2020-12-04 22:29:30
好帮手慕阿园 2020-11-25 10:40:33

同学你好,老师测试同学贴出的添加分类的方法是没有问题的,添加分类方法中调用了reloadCategory方法,同学检查下该方法,或者可以debug调式下程序,看看是哪出现了问题

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

祝学习愉快

  • 提问者 慕虎5485268 #1
    reloadCategory()代码如如下: /** * 初始化分类的方法 */ private static void reloadCategory() { URLDecoder decoder = new URLDecoder(); try { System.out.println(categoryDataFile); decoder.decode(categoryDataFile,"utf-8"); SAXReader reader = new SAXReader(); Document document = reader.read(categoryDataFile); List<Node> nodes = document.selectNodes("/root/category"); categoryData.clear();//此处必须清空,不然会多了几个 for(Node node:nodes) { Element element = (Element)node; String categoryId = element.elementText("category-id"); String categoryName = element.elementText("category-name"); Category category = new Category(categoryId,categoryName); categoryData.add(category); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
    2020-11-25 22:15:09
  • 好帮手慕阿园 回复 提问者 慕虎5485268 #2
    同学你好,同学的代码是正确的,对分类图书等进行操作后代码自动重载是正常现象;同学现在是运行程序有什么影响吗,建议具体描述 祝学习愉快
    2020-11-26 10:07:50
  • 提问者 慕虎5485268 回复 好帮手慕阿园 #3

    代码自动重载后存在servletContext中的用于存储是否登陆的信息flag变化,被重置(原始flag是0,当登陆成功时flag变为1。但添加图书分类后会触发重动重载,flag值就变回0了)

    2020-12-03 23:59:46
好帮手慕阿园 2020-11-20 13:59:05

同学你好,测试代码同学的appendCategory()方法没有问题

根据同学贴出的日志显示,同学是否是进行修改代码后出现的此提示信息;这个信息表示tomcat热部署,热部署表示修改完代码后不需要重启服务器,可以自动进行加载,是不影响程序的运行的;

如下是老师热部署修改代码的提示信息

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

祝学习愉快


  • 提问者 慕虎5485268 #1
    是在运行时有提示,不是修改代码后。提示reload后servletContext中变量值都被清空
    2020-11-24 21:40:43
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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