1

私はサーブレットを初めて使用します。このチュートリアルに従っていますが、すべて正常に動作しますが、リクエストから属性を削除すると、適切なイベントがトリガーされません。これが私のコードです。
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 とサーブレット 3 を使用しています

4

1 に答える 1

1

リクエストの属性を追加、削除、または置換すると、ServletRequestAttributeListener のメソッドが呼び出されます。

request.removeAttribute("User");

servletContext から属性を削除すると、これらは呼び出されません。

ctx.removeAttribute("User");

したがって、属性が ServletContext に追加/削除/置換されたときにこのフィルターのメソッドが呼び出されるため、ServletContextAttributeListenerを使用する必要があります。

属性の変更をリッスンする 3 種類のフィルターがあります。

  1. ServletContextAttributeListener - 属性が ServletContext に追加/削除/置換されたという通知を受け取ります。
  2. ServletRequestAttributeListener - 属性が ServletRequest に追加/削除/置換されたという通知を受け取ります。
  3. HttpSessionAttributeListener - セッションから属性が追加/削除/置換されたという通知を受け取ります。

Thera は、ライフサイクルの変更をリッスンするための別の 3 つのフィルター ServletContext、ServletRequest、および HttpSession です。

  1. ServletContextListener - 初期化または破棄されたときに ServletContext に関する通知イベントを受け取ります。
  2. ServletRequestListener - リクエストの出入りに関する通知イベントの受信
  3. HttpSessionListener - HttpSession が作成または破棄されたときに、HttpSession に関する通知イベントを受け取ります。
于 2013-11-10T09:23:39.320 に答える