web開發事件程式設計
web開發事件程式設計三要素:
事件源: ServletContext 、ServletRequest、HttpSession
事件:
(監聽以上三個對象的 建立,銷毀和 操作屬性的行為,來觸發方法)
對象建立或銷毀:ServletContextEvent、ServletRequestEvent、 HttpSessionEvent
操作屬性: ServletContextAttributeEvent、ServletRequestAttributeEvent、 HttpSessionBindingEvent
事件監聽器: ServletContextListener 、 ServletRequestListener......
web開發監聽器: 開發者在web開發的過程中,會頻繁使用到三個對象。ServletContext、ServletRequest、HttpSession。在建立或銷毀這些對象時,或者對這些對象進行屬性操作時,觸發一些事件,就可以使用web監聽器去監聽這些事件。
事件源 | web事件對象 | web事件監聽器 |
ServletContext對象 | ServletContextEvent 建立或銷毀對象時觸發 | ServletContextListener |
ServletContext屬性 | ServletContextAttributeEvent 屬性操作(增加屬性,修改屬性,删除屬性) | ServletContextAttributeListener |
ServletRequest對象 | ServletRequestEvent 建立或銷毀對象時觸發 | ServletRequestListener |
ServletRequest屬性 | ServletRequestAttributeEvent 屬性操作(增加屬性,修改屬性,删除屬性) | ServletRequestAttributeListener |
HttpSession對象 | HttpSessionEvent 建立或銷毀對象時觸發 | HttpSessionListener |
HttpSession屬性 | HttpSessionBindingEvent 屬性操作(增加屬性,修改屬性,删除屬性) | HttpSessionAttributeLisener |
ServletContextListener
ServletContextListener主要用于監聽ServetContext對象的建立和銷毀。
ServletContext對象:代表整個web應用。
建立:web應用加載
銷毀:web應用重新加載或web服務停止。
步驟:
1)建立java類,實作ServletContextListener接口,實作其中的方法
2)監聽器要交給tomcat伺服器運作。
需要在web.xml檔案中進行配置
<!-- 注冊監聽器 -->
<listener>
<!-- 監聽器程式全名 -->
<listener-class>com.joinlabs.a_context.MyContextListener</listener-class>
</listener>
ServletContextAttributeListener
ServletContextAttributeListener用于監聽ServletContext對象的屬性操作(增加屬性,修改屬性,删除屬性)
增加屬性: setAttribute(name,Object); 第一次就是增加屬性
修改屬性: setAttribute(name,Object); 如果前面有增加了同名的屬性,則修改。
删除屬性: removeAttribute(name);
public class MyContextListener implements ServletContextListener,ServletContextAttributeListener{
StudentDao stuDao = new StudentDao();
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext對象建立了");
//建立學生表
stuDao.initTable();
System.out.println("表建立成功!");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext對象銷毀了");
//删除學生表
stuDao.dropTable();
System.out.println("表删除成功!");
}
public void attributeAdded(ServletContextAttributeEvent scab) {
//1.得到屬性名稱
String name = scab.getName();
//2.得到屬性值
Object value = scab.getValue();
System.out.println("屬性添加:"+name+"="+value);
}
public void attributeReplaced(ServletContextAttributeEvent scab) {
//1.得到屬性名稱
String name = scab.getName();
//2.得到修改前的屬性值
//Object value = scab.getValue();
//2.得到修改後的屬性值
ServletContext context = scab.getServletContext();
Object value = context.getAttribute(name);
System.out.println("屬性修改:"+name+"="+value);
}
public void attributeRemoved(ServletContextAttributeEvent scab) {
//1.得到屬性名稱
String name = scab.getName();
//2.得到屬性值
Object value = scab.getValue();
System.out.println("屬性删除:"+name+"="+value);
}
}
ServletRequestListener
ServletRequestListener用于監聽ServletRequest對象的建立和銷毀。
ServletRequest對象:封裝請求資訊
建立:每次送出請求時
銷毀:請求完畢後
ServletRequestAttributeListener
ServletRequestAttributeListener用于監聽ServletRequest屬性操作
增加屬性: setAttribute(name,Object); 第一次就是增加屬性
修改屬性: setAttribute(name,Object); 如果前面有增加了同名的屬性,則修改。
删除屬性: removeAttribute(name);
public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request對象建立了"+sre.getServletRequest());
//得到客戶的IP位址
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
String ip = request.getRemoteHost();
//把ip位址放入到session域中
HttpSession session = request.getSession();
session.setAttribute("ip", ip);
}
*
*
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request對象銷毀了"+sre.getServletRequest());
}
public void attributeAdded(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object value = srae.getValue();
System.out.println("屬性增加: "+name+"="+value);
}
public void attributeReplaced(ServletRequestAttributeEvent srae) {
String name = srae.getName();
//修改後的值
ServletRequest request = srae.getServletRequest();
Object value = request.getAttribute(name);
System.out.println("屬性修改: "+name+"="+value);
}
public void attributeRemoved(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object value = srae.getValue();
System.out.println("屬性删除: "+name+"="+value);
}
}
HttpSessionListener
HttpSessionListener用于監聽HttpSession對象的建立和銷毀
HttpSession對象:
建立:調用request.getSession()方法
銷毀:
1)預設情況下,30分鐘伺服器自動回收
2)設定有效時長: setMaxActiveInterval(秒);
3)web.xml配置全局的過期時間
<session-config>
<session-timeout>分鐘</session-timeout>
</session-config>
4)手動銷毀: invalidate()方法
案例: 粗略統計線上訪客人數
public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{
int count = 0;
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session對象建立了"+se.getSession());
synchronized (MySessionListener.class) {
count++;
System.out.println("目前訪客人數:"+count);
//儲存到context域中
ServletContext context = se.getSession().getServletContext();
context.setAttribute("visit", count);
}
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session對象銷毀了"+se.getSession());
synchronized (MySessionListener.class) {
count--;
//儲存到context域中
ServletContext context = se.getSession().getServletContext();
context.setAttribute("visit", count);
}
}
public void attributeAdded(HttpSessionBindingEvent se) {
String name = se.getName();
Object value = se.getValue();
System.out.println("屬性增加: "+name+"="+value);
}
public void attributeReplaced(HttpSessionBindingEvent se) {
String name = se.getName();
//得到修改後的值
HttpSession session = se.getSession();
Object value = session.getAttribute(name);
System.out.println("屬性修改: "+name+"="+value);
}
public void attributeRemoved(HttpSessionBindingEvent se) {
String name = se.getName();
Object value = se.getValue();
System.out.println("屬性删除: "+name+"="+value);
}
}
HttpSessionAttributeLisener
HttpSessionAttributeLisener用于監聽HttpSession的屬性操作
增加屬性: setAttribute(name,Object); 第一次就是增加屬性
修改屬性: setAttribute(name,Object); 如果前面有增加了同名的屬性,則修改。
删除屬性: removeAttribute(name);
案例:顯示目前網站的登入使用者資訊
需求:
1)提供使用者登入的功能,提供登出功能。
2)顯示目前網站的所有登入使用者資訊
3)管理者可以踢除指定的登入用