【问题标题】:Java Servlets attributeRemoved() doesn't triggerJava Servlets attributeRemoved() 不会触发
【发布时间】:2013-11-10 09:08:46
【问题描述】:

我是 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 和 servlet 3

【问题讨论】:

    标签: java tomcat servlets listener


    【解决方案1】:

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

    request.removeAttribute("User");
    

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

    ctx.removeAttribute("User");
    

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      相关资源
      最近更新 更多