1

我是 servlet 的新手,我正在关注教程,一切正常,但是当我从请求中删除一个属性时,它不会触发正确的事件,这是我的代码。
我在 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

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

4

1 回答 1

1

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

request.removeAttribute("User");

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

ctx.removeAttribute("User");

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

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

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

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

  1. ServletContextListener - 在 ServletContext 初始化或销毁时接收通知事件。
  2. ServletRequestListener - 接收有关进出请求的通知事件
  3. HttpSessionListener - 在创建或销毁 HttpSession 时接收通知事件。
于 2013-11-10T09:23:39.320 回答