欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

jsp之监听器

程序员文章站 2022-07-05 23:00:19
(1)什么是监听器? 是servlet规范当中定义的一种特殊的组件,用来监听容器产生的事件并且进行相应的处理。 容器会产生两大类事件: a,生命周期相关的事件:容器创建或者销毁...

(1)什么是监听器?
是servlet规范当中定义的一种特殊的组件,用来监听容器产生的事件并且进行相应的处理。
容器会产生两大类事件: a,生命周期相关的事件:容器创建或者销毁request,session,ServletContext(servlet上下文)这些对象时产生的事件。b,绑订相关的事件:
对request,session,ServletContext(servlet上下文)调用了setAttribute,removeAttribute产生的事件。
(2)如何写一个监听器?
step1, 写一个java类,实现相应的监听器接口(要看监听的事件类型: HttpSessionListener)。
step2, 在监听器接口对应的方法里面,实现监听的处理逻辑。
step3,注册(web.xml)
(3)ServletContext
1)什么是Servlet上下文?
容器在启动的时候,会为每一个应用创建唯一的一个
符合ServletContext接口的一个对象。该对象会一直存在,
除非关闭容器。
2)如何获得servlet上下文?
a,GenericServlet提供了getServletContext方法。
b,ServletConfig提供了getServletContext方法。
c, FilterConfig提供了getServletContext方法。
d, HttpSession提供了getServletContext方法。
3)servlet上下文的作用?
a,绑订相关的方法
setAttribute,removeAttribute,getAttribute
request,session,ServletContext这三个对象都有绑订
相关的方法,应该优先使用生命周期短(request<session
<servlet上下文)的。
b, 访问全局的初始化参数
step1, 使用<context-param>来配置,该参数可以被
所有的servlet,filter访问。
step2, 使用ServletContext提供的getInitParameter方法
来获取参数值。
c, 获得实际部署时的物理路径。

String getRealPath(String path);

通过代码先了解一下servletContext,即servlet上下文。  


[java]  //获得ServletContext  
      ServletContext sctx=getServletContext(); 
      sctx.setAttribute("username","user1"); 
      out.println("已经将username绑定"+"到了ServletContext上面"); 

 //获得ServletContext
       ServletContext sctx=getServletContext();
       sctx.setAttribute("username","user1");
       out.println("已经将username绑定"+"到了ServletContext上面");输出通过servletContext得到的内容:


[java]  ServletContext sctx=getServletContext(); 
           String username=(String)sctx.getAttribute("username"); 

ServletContext sctx=getServletContext();
           String username=(String)sctx.getAttribute("username");
配置web.xml:


[html]   <!-- 全局初始化参数 --> 
<context-param> 
    <param-name>version</param-name> 
    <param-value>1.0</param-value> 
</context-param> 
<listener> 
    <listener-class>web.CountListener</listener-class> 
</listener> 

  <!-- 全局初始化参数 -->
 <context-param>
     <param-name>version</param-name>
     <param-value>1.0</param-value>
 </context-param>
 <listener>
     <listener-class>web.CountListener</listener-class>
 </listener>
在servlet中得到该数据:


[java] String version=sctx.getInitParameter("version"); 
          out.println("version:"+version); 

String version=sctx.getInitParameter("version");
       out.println("version:"+version);
最后写一个统计在线人数的程序,利用到监听器知识,即触发某个事件时,对应的方法自动触发执行:

step1

编写servlet

[java]  import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpSession; 
import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 
 
public class CountListener implements HttpSessionListener { 
     //session对象一旦创建成功,会执行该方法  
    private int count=0; 
    public void sessionCreated(HttpSessionEvent arg0) { 
        // TODO Auto-generated method stub  
        count++; 
        HttpSession session=arg0.getSession(); 
        ServletContext sctx=session.getServletContext(); 
        sctx.setAttribute("count", count); 
    } 
     //session对象被销毁会执行该方法  
    public void sessionDestroyed(HttpSessionEvent arg0) { 
        // TODO Auto-generated method stub  
        count--; 
        HttpSession session=arg0.getSession(); 
        ServletContext sctx=session.getServletContext(); 
        sctx.setAttribute("count", count); 
    } 
      

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class CountListener implements HttpSessionListener {
     //session对象一旦创建成功,会执行该方法
 private int count=0;
 public void sessionCreated(HttpSessionEvent arg0) {
  // TODO Auto-generated method stub
  count++;
  HttpSession session=arg0.getSession();
  ServletContext sctx=session.getServletContext();
  sctx.setAttribute("count", count);
 }
     //session对象被销毁会执行该方法
 public void sessionDestroyed(HttpSessionEvent arg0) {
  // TODO Auto-generated method stub
  count--;
  HttpSession session=arg0.getSession();
  ServletContext sctx=session.getServletContext();
  sctx.setAttribute("count", count);
 }
    
}step2

配置全局化参数:


[html]  <listener> 
        <listener-class>web.CountListener</listener-class> 
    </listener> 

<listener>
     <listener-class>web.CountListener</listener-class>
 </listener>

 

step3,编写jsp文件


[html]  <body style="font-size:30px;"> 
      当前系统在线人数是: 
      <%=application.getAttribute("count") %>      
      <%=application.getAttribute("username") %> 
    </br> 
    <a href="logout.jsp">退出系统</a> 
  </body> 

<body style="font-size:30px;">
      当前系统在线人数是:
      <%=application.getAttribute("count") %>    
      <%=application.getAttribute("username") %>
    </br>
    <a href="logout.jsp">退出系统</a>
  </body>
step4,编写logout.jsp文件


[html] <body> 
   <% 
      session.invalidate(); 
    %> 
 </body> 

 <body>
    <%
       session.invalidate();
     %>
  </body>