Servletcontext 相关监听器实例

时间:2022-12-20 20:56:23

1、ServletContext这个类代表的是整个应用,他的监听有两个: 整个应用生命周期的监听,以及属性值变更的监听

2、servletContext 的第一个监听:即生命周期的监听

(1)、实现ServletContextListener这个接口以及未实现方法

(2)、配置这个监听器,配置方式有两种:第一种就是使用javax.servlet.annotation.WebListener 这个类来注释

即:

@WebListener()

public classServletConL implements ServletContextListener{

 

第二种就是web.xml 中配置监听:

<listener>

<listener-class>soufun.com.ServletConL</listener-class>

</listener>

 

这样在这个 应用启动或停止的时候都会调用这个类的contextInitialized(ServletContextEvent arg0)方法和contextDestroyed(ServletContextEventarg0)这个方法。通过这个方法的两个参数可以获取ServletContext 对象

(3)、实例:

package soufun.com;

 

importjava.io.IOException;

importjava.util.logging.Logger;

 

importjavax.servlet.ServletContext;

importjavax.servlet.ServletContextEvent;

importjavax.servlet.ServletContextListener;

importjavax.servlet.annotation.WebListener;

 

/**

 *@author WHD

 */

@WebListener()

public classServletConL implements ServletContextListener{

 

@Override

publicvoid contextDestroyed(ServletContextEvent arg0) {

//TODO Auto-generated method stub

ServletContextcon=arg0.getServletContext();

Strings1=con.getInitParameter("con1");

Strings2=con.getInitParameter("con2");

con.setAttribute("DATA","WHD");

System.out.print(s1+"   "+s2);

System.out.println("这个监听器就是这个应用生命周期的监听-结束");

}

 

@Override

publicvoid contextInitialized(ServletContextEvent arg0) {

LogFactory  factory=null;

Loggerlog=null;

try{

  factory = new LogFactory();

  log=factory.getLog("logs");

}catch (SecurityException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}catch (IOException e) {

//TODO Auto-generated catch block

e.printStackTrace();

}

 

// 通过servletcontextEvent可以获取 servletcontext 对象

System.out.println("这个监听器就是这个应用生命周期的监听-开始");

log.info("web容器启动,context对象建立");

ServletContextcon=arg0.getServletContext();

log.info("beginget the  init param");

Strings1=con.getInitParameter("con1");

Strings2=con.getInitParameter("con2");

System.out.print(s1+"   "+s2);

//TODO Auto-generated method stub

log.info("beginset attribute in context");

con.setAttribute("DATA","WHD");

 

}

}

 

**************  日志文件****************

package soufun.com;

/**

 *@author WHD

 *data 2015年8月4日

 */

 

importjava.util.Date;

importjava.util.logging.*;

importjava.io.IOException;

importjava.text.SimpleDateFormat;

 

public classLogFactory {

// 在web容器启动的时候就创建日志

private  Logger log;

SimpleDateFormats= new SimpleDateFormat("yyyy-MM-dd");

Stringdata=s.format(new Date());

publicLogFactory(){}

publicLogFactory(String name) throws SecurityException, IOException{

log=Logger.getLogger(name+data+".log");

// 设置日志级别

log.setLevel(Level.INFO);

FileHandlerfhandler= new FileHandler("G:/test.log");

log.addHandler(fhandler);

}

public  Logger getLog(String name) throwsSecurityException, IOException{

if(null==log){

log=Logger.getLogger(name+data+".log");

log.setLevel(Level.INFO);

FileHandlerfhandler= new FileHandler("G:/test.log");

fhandler.setLevel(Level.INFO);

fhandler.setFormatter(newmyformat());

log.addHandler(fhandler);

}

returnlog;

}

}

 

class myformatextends Formatter{

@Override

publicString format(LogRecord record) {

//TODO Auto-generated method stub

return "级别"+record.getLevel()+" 信息"+record.getMessage()+"\n";

}

}

 

3、servletContext 的第二个监听:也就是属性变化的监听,当servletContext 中添加属性,替换属性或移除属性的时候会触发这个监听器

(1)、实现ServletContextAttributeListener 这个接口以及未实现的接口的方法

(2)、同上面一样配置监听有两种方式:第一种 使用javax.servlet.annotation.WebListener 这个类来注释:

@WebListener()

public classServletConAL  implementsServletContextAttributeListener {

 

第二种方式就是使用web.xml 配置

<listener>

<listener-class>soufun.com.ServletConAL</listener-class>

</listener>

 

(3)、实例:

package soufun.com;

 

importjavax.servlet.ServletContextAttributeEvent;

importjavax.servlet.ServletContextAttributeListener;

importjavax.servlet.annotation.WebListener;

/**

 *@author WHD

 */

public classServletConAL  implementsServletContextAttributeListener {

@Override

publicvoid attributeAdded(ServletContextAttributeEvent arg0) {

Stringdata=String.valueOf(arg0.getServletContext().getAttribute("DATA"));

// 修改servletcontext属性的值来替换原有属性的值

arg0.getServletContext().setAttribute("DATA","whd");

// 删除这个属性值,触发下面的值

arg0.getServletContext().removeAttribute("DATA");

}

 

@Override

publicvoid attributeRemoved(ServletContextAttributeEvent arg0) {

//TODO Auto-generated method stub

System.out.println("context删除了属性");

}

@Override

publicvoid attributeReplaced(ServletContextAttributeEvent arg0) {

//TODO Auto-generated method stub

System.out.println("修改原来的值,触发这个函数");

}

}