監聽聽器概念
監聽對象:作用域對象servletContext,servletSeesion,servletRequest、
Application
Session
Request
監聽內容:
對象的創建,銷燬,屬性改變事件。
監聽作用:
在事件發生之前,之後進行一些處理。比如統計在線人數。Session的客戶的登入退出。
使用:
監聽request
監聽session
監聽application
部署:創建一個實現servletRequestListener接口的實現類。
Web.xml部署該監聽request的實現類。
實現類路徑名提示tomcat創建request時調用該監聽器類。
有初始方法:servletRequestEvent sre。通過sre方法調用獲取被創建的request對象。
獲取監聽對象作用域的值:
- Sre.GetName();
- Sre.Getvalue();
- Application的不同
Src.getServletContext();
監聽事件:接口可以多實現。
-
servletRequestListener監聽request對象的創建和銷燬
-
servletRequestAttributeListener:監聽域對象數值的修改,添加,移除。變更
-
HttpSessionListener:監聽session的創建和銷燬。接口有兩個方法。
-
HttpSessionAttributeListener;監聽session的數據變更;
-
ServletContextListener:監聽appliation的創建和銷燬;
-
ServletContextAttributeListener:監聽對象的數據的變更;
項目實踐:提要獲取servletContext對象的方法3種
- This.getServleContext();
- getSession().getServleContext();
- servletConfig. getServleContext();
統計在線人數;不同用戶都能訪問到的數據存儲在application中。
封裝用戶登入數據與實體類對象–實體類user
package com.entry;
public class user {
private String name;
private String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "user [name=" + name + ", password=" + password + "]";
}
}
servlet處理
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.entry.user;
public class test_count extends HttpServlet {
//這屬於登入數據的提取--登入人數的封裝在線
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//獲取表單提交參數
String name = request.getParameter("name");
String password = request.getParameter("password");
//參數注入實體類中
user u = new user();
u.setName(name);
u.setPassword(password);
//即是創建又是獲取
HttpSession session = request.getSession();
//存儲
System.out.println("test_count.doGet()"+u);
System.out.println("test_count.doGet()中的session被實現了。。。");
System.out.println("test_count.doGet()"+session.getId());
session.setAttribute("user", u);
//重定向
response.sendRedirect("index02.jsp");
}
}
監聽器-listener
建立一個普通類繼承兩個接口,實現事件的監聽。
下面可以看出兩個接口實現的方法其實差不多(一個初始化(創建),一個銷燬)–當相應作用作用域被創建或被銷燬時就會執行相應方法中的內容。如果有不懂得術語可以看上面的理論加以理解。
package com.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class test_listener implements HttpSessionListener,ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context = sce.getServletContext();
context.setAttribute("count", 0);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void sessionCreated(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
int count = (int) context.getAttribute("count");
context.setAttribute("count", ++count);
System.out.println("session被創建了");
System.out.println("test_listener.sessionDestroyed()"+se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ServletContext context = se.getSession().getServletContext();
int count = (int) context.getAttribute("count");
context.setAttribute("count", --count);
System.out.println("session被創建了");
}
}
過濾器–創建一個普通類實現Filter實現其接口內方法。
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class test_filter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
注意配置文件內web.xml中的過濾器,監聽器,servlet等相關配置。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>servlet_listener1</display-name>
<servlet>
<servlet-name>test_count</servlet-name>
<servlet-class>com.servlet.test_count</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test_count</servlet-name>
<url-pattern>/test_count</url-pattern>
</servlet-mapping>
<filter>
<filter-name>test_filter</filter-name>
<filter-class>com.filter.test_filter</filter-class>
</filter>
<filter-mapping>
<filter-name>test_filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>com.listener.test_listener</listener-class>
</listener>
</web-app>
效果就是:
session被創建了
test_listener.sessionDestroyed()2C8C413853BFDE2422175C2317C58055
test_count.doGet()user [name=某某, password=123]
test_count.doGet()中的session被實現了。。。
test_count.doGet()2C8C413853BFDE2422175C2317C58055
網頁效果