※HttpSessionBindingListener
Servlet的內鍵觸發程式,也就是做了什麼事後,會自動做某件事可以想成javascript的onXXX,譬如onClick,當使用者按一下滑鼠後,會自動做某件事
這裡的Binding是挷setAttribute(還要呼叫建構子)和removeAttribute
public class TestListener implements HttpSessionBindingListener { PrintWriter out; public TestListener(PrintWriter out){ this.out = out; } @Override public void valueBound(HttpSessionBindingEvent e) { out.println("valueBound"); out.println(e.getName()); out.println(e.getValue()); } @Override public void valueUnbound(HttpSessionBindingEvent e) { out.println("valueUnbound"); out.println(e.getName()); out.println(e.getValue()); } }
※寫一支class,實作HttpSessionBindingListener讓session觸發
resp.setContentType("text/plain"); req.getSession().setAttribute("out", new TestListener(resp.getWriter()));
※在doXXX加入這兩行就會觸發
※第一行不打也可以,只是不會換行,會變成空格,所以不寫的話也可以改成在listener那一支加<br />
※觸發的是valueBound,如果想觸發valueUnbound,就按一下重整或上一頁再下一頁,就會看到了,所以valueUnbound在reload、重整、呼叫removeAttribute、contain的預設30分session失效都會觸發
※ServletContextListener
container啟動和關閉時會觸發的listener@WebListener @WebInitParam(name = "p1", value = "ppp") public class TestListener implements ServletContextListener { // PrintWriter out; // // public TestListener(PrintWriter out) { // this.out = out; // } @Override public void contextInitialized(ServletContextEvent e) { System.out.println("contextInitialized"); ServletContext sc = e.getServletContext(); System.out.println(sc.getContextPath()); System.out.println(sc.getInitParameter("p1")); System.out.println(sc.getInitParameter("abc")); System.out.println(sc.getInitParameter("def")); } @Override public void contextDestroyed(ServletContextEvent e) { System.out.println("contextDestroyed"); } }
※如果將out註解打開,程式無法啟動,會出現兩個錯誤
InstantiationException: listener.TestListener
NoSuchMethodException: listener.TestListener.<init>()
程式才剛啟動,當然是抓不到了
※這是annotation寫法,@WebListener有一個參數,是描述,很少人在寫
※@WebInitParam沒有作用,要設定初始參數只能寫在web.xml了
<listener> <listener-class>listener.TestListener</listener-class> </listener> <context-param> <param-name>abc</param-name> <param-value>111</param-value> </context-param> <context-param> <param-name>def</param-name> <param-value>222</param-value> </context-param>
※listener包住listener-class,等同@WebListener,擇一使用
※在reload和關閉container時,會觸發contextDestroyed方法,注意和之前一樣,要按Servers的紅鈕,按Console的紅鈕和按右上角的X是不會執行到contextDestroyed方法的
※ServletContextAttributeListener
ServletContext在新增、取代、移除屬性時觸發@WebListener public class TestListener implements ServletContextAttributeListener { @Override public void attributeAdded(ServletContextAttributeEvent e) { System.out.println("attributeAdded"); System.out.println(e.getName()); System.out.println(e.getValue()); System.out.println(e.getServletContext()); } @Override public void attributeRemoved(ServletContextAttributeEvent e) { System.out.println("attributeRemoved"); System.out.println(e.getName()); System.out.println(e.getValue()); System.out.println(e.getServletContext()); } @Override public void attributeReplaced(ServletContextAttributeEvent e) { System.out.println("attributeReplaced"); System.out.println(e.getName()); System.out.println(e.getValue()); System.out.println(e.getServletContext()); } }
※比較奇怪的是,我一run到jsp頁面,就會觸發added了,如下訊息:
attributeAdded
org.apache.jasper.runtime.JspApplicationContextImpl
org.apache.jasper.runtime.JspApplicationContextImpl@6f1943a6
org.apache.catalina.core.ApplicationContextFacade@4373821f
※測試
resp.setContentType("text/plain"); ServletContext sc = req.getServletContext(); sc.setAttribute("k", "v"); sc.setAttribute("k", "v"); sc.removeAttribute("k");
※取代時,就算value一樣也能觸發;移除時,一定要有key被移除才會觸發
※HttpSessionAttributeListener
HttpSession在新增、取代、移除屬性時觸發@WebListener public class TestListener implements HttpSessionAttributeListener { @Override public void attributeAdded(HttpSessionBindingEvent e) { System.out.println("attributeAdded"); System.out.println(e.getName()); System.out.println(e.getValue()); System.out.println(e.getSession().getId()); } @Override public void attributeRemoved(HttpSessionBindingEvent e) { System.out.println("attributeRemoved"); System.out.println(e.getName()); System.out.println(e.getValue()); System.out.println(e.getSession().getId()); } @Override public void attributeReplaced(HttpSessionBindingEvent e) { System.out.println("attributeReplaced"); System.out.println(e.getName()); System.out.println(e.getValue()); System.out.println(e.getSession().getId()); } }
※因為是HttpSession,所以沒有getServletContext方法了
※測試
resp.setContentType("text/plain"); HttpSession session = req.getSession(); session.setAttribute("k", "v"); session.setAttribute("k", "v"); session.removeAttribute("x");
※和ServletContextAttributeListener一樣,但執行頁面時不會觸發
※HttpSessionListener
@WebListener public class TestListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent e) { System.out.println("sessionCreated"); System.out.println(e.getSession().getId()); } @Override public void sessionDestroyed(HttpSessionEvent e) { System.out.println("sessionDestroyed"); System.out.println(e.getSession().getId()); } }
※測試
HttpSession session = req.getSession(); session.invalidate();
HttpSessionActivationListener參考良葛格的網站,總之就是JVM搬到另一個JVM的觸發程式
※ServletRequestListener、ServletRequestAttributeListener
@WebListener public class TestListener implements ServletRequestListener, ServletRequestAttributeListener { @Override public void requestDestroyed(ServletRequestEvent e) { System.out.println("requestDestroyed"); System.out.println(e.getServletContext().getServletContextName()); System.out.println(e.getServletRequest().getLocalName()); } @Override public void requestInitialized(ServletRequestEvent e) { System.out.println("requestInitialized"); System.out.println(e.getServletContext().getServletContextName()); System.out.println(e.getServletRequest().getLocalName()); } @Override public void attributeAdded(ServletRequestAttributeEvent e) { System.out.println("attributeAdded"); System.out.println(e.getName()); System.out.println(e.getValue()); } @Override public void attributeRemoved(ServletRequestAttributeEvent e) { System.out.println("attributeRemoved"); System.out.println(e.getName()); System.out.println(e.getValue()); } @Override public void attributeReplaced(ServletRequestAttributeEvent e) { System.out.println("attributeReplaced"); System.out.println(e.getName()); System.out.println(e.getValue()); } }
※測試
resp.setContentType("text/plain"); req.setAttribute("k", "v"); req.setAttribute("k", "v"); req.removeAttribute("k");
※和之前的大同小異
沒有留言:
張貼留言