gpt4 book ai didi

Java Servlets attributeRemoved() 不会触发

转载 作者:行者123 更新时间:2023-11-28 22:20:57 25 4
gpt4 key购买 nike

我是 servlet 的新手,我正在关注 this教程一切正常,但是当我从请求中删除属性时,它不会触发正确的事件,这是我的代码。
我在 SO 上找不到类似的案例。

小服务程序

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
ServletContext ctx = request.getServletContext();
ctx.setAttribute("User", "Pankaj");
String user = (String) ctx.getAttribute("User");
System.out.println("removing attr");
ctx.removeAttribute("User");
HttpSession session = request.getSession();
session.invalidate();
PrintWriter out = response.getWriter();
out.write("Hi "+user);
}

听众

@WebListener
public class AppContextAttributeListener implements
ServletRequestAttributeListener
{

public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("ServletContext attribute added::{"
+ arg0.getName() + ","
+ arg0.getValue() + "}");

}
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("here");
System.out.println("ServletContext attribute removed::{"
+ arg0.getName() + ","
+ arg0.getValue() + "}");
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("ServletContext attribute replaced::{"
+ arg0.getName() + ","
+ arg0.getValue() + "}");
}
}

预期输出

ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
ServletContext attribute added::{User,Pankaj}
removing attr
here
ServletContext attribute removed::{User,Pankaj}
Session Created:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
Session Destroyed:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0

我的输出

ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
ServletContext attribute added::{User,Pankaj}
removing attr
Session Created:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
Session Destroyed:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0

虽然 attributeAdded() 正在打印,但我无法触发 attributeRemoved(),这意味着监听器定义明确!
这里出了什么问题?我正在使用 tomcat 7 和 servlets 3

最佳答案

当您在请求中添加、删除或替换属性时调用 ServletRequestAttributeListener 的方法,例如:

request.removeAttribute("User");

当您从 servletContext 中删除属性时,它们不会被调用:

ctx.removeAttribute("User");

所以你应该使用ServletContextAttributeListener ,因为在将属性添加/删除/替换到 ServletContext 时调用此过滤器的方法。

Thera 是三种类型的过滤器来监听属性变化:

  1. ServletContextAttributeListener - 收到通知属性已添加/删除/替换到 ServletContext。
  2. ServletRequestAttributeListener - 收到通知属性已添加/删除/替换到 ServletRequest。
  3. HttpSessionAttributeListener - 收到通知已从 session 中添加/删除/替换属性。

还有另外三个过滤器来监听生命周期变化 ServletContext、ServletRequest 和 HttpSession:

  1. ServletContextListener - 在初始化或销毁时接收有关 ServletContext 的通知事件。
  2. ServletRequestListener - 接收关于进入和离开的请求的通知事件
  3. HttpSessionListener - 在创建或销毁 HttpSession 时接收有关 HttpSession 的通知事件。

关于Java Servlets attributeRemoved() 不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19888002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com