监听听器概念
监听对象:作用域对象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
网页效果