监听tomcat服务器启动/关闭并从配置文件中读取参数进行初始化

监听tomcat服务器启动/关闭很简单(2步):

1. 建立一个类实现ServletContextListener接口,重写其中的方法(contextDestroyed和contextInitialized)。

package action;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class SystemListener implements ServletContextListener{
    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
    }
    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
    }
}

2. 在web.xml中注册该监听器。如下:

<listener>
      <description>监听tomcat</description>
      <display-name>test</display-name>
      <listener-class>listener.SystemListener</listener-class>
</listener>

监听tomcat启动和关闭就这么简单地完成了。可以把一些tomcat启动时就需要初始化的属性和需要完成的操作放到这步来完成。

下面是完整的项目代码:

1. 目录结构

2. 监听类

package listener;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import pub.SystemProperty;

/**
 * 系统上下文启动/关闭监听
 * 把需要初始化的数据放在contextInitialized方法里
 * 
 * @author Sky
 * @date 2016年8月10日 上午9:32:09 listener
 */
public class SystemListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("tomcat关闭了...");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("tomcat启动了...");

        /**
         * 读取系统运行基本参数
         * 读取静态参数
         */
        InputStream input = null;
        try {
            input = SystemListener.class.getClassLoader().getResourceAsStream(
                    "sqlProperty.properties");
            Properties p = new Properties();
            p.load(input);

            String sqlPort = p.getProperty("port", "3306");
            SystemProperty.port = (sqlPort == null || "".equals(sqlPort)) ? 3306
                    : Integer.parseInt(sqlPort);
            SystemProperty.password = p.getProperty("password");

            System.out.println("系统初始化成功");

        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("系统配置文件SystemProperty.properties不存在或读取错误");
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        /**
         * 读取时间配置
         * 读取其他配置文件,并把配置文件的数据加入静态容器中,以便通过类名取出使用
         */
        input = null;
        try {
            input = SystemListener.class.getClassLoader().getResourceAsStream(
                    "timeProperty.properties");
            Properties p = new Properties();
            p.load(input);
            //列举
            Enumeration<?> propNames = p.propertyNames();
            while (propNames.hasMoreElements()) {
                String key = (String) propNames.nextElement();
                String value = p.getProperty(key, "");
                SystemProperty.propList.put(key, value); //放入静态容器中
            }

            System.out.println("时间配置初始化成功");

        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("时间配置文件timeProperty.properties不存在或读取错误");
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

3. struts.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
    <package name="abc" namespace="/" extends="struts-default">
        <action name="test" class="action.TestAction">
            <result name="input">/index.jsp</result>
            <result name="success">/success.jsp</result>
            <result name="fail">/fail.jsp</result>
        </action>
    </package>
</struts>    

3. web.xml

<?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_3_0.xsd" version="3.0"> <listener> <description>监听tomcat</description> <display-name>test</display-name> <listener-class>listener.SystemListener</listener-class> </listener> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> </web-app>

4. 静态属性、容器类(方便使用类名直接调用)

package pub;

import java.util.HashMap;
import java.util.Map;

/**
 *  静态存储系统运行所需的基本参数,在启动的时候被初始化
 * 
 * @author Sky
 * @date 2016年8月10日 上午10:19:12
 * pub
 */
public class SystemProperty {
    /*
     * 设置为静态,直接使用类名调用
     */
    public static int port; //端口号
    public static String password; //密码
    //静态容器,用来存储后面扩展添加的配置(添加其他的配置文件,使得本类来调用)
    public static Map<String, String> propList = new HashMap<String, String>();
}

5. properties配置文件

sqlProperty.properties

#端口号
port=1234
#密码
password=6666

timeProperty.properties

#默认时间2秒
normalTime=2000
#一天
oneDay=86400000

6. 测试(使用)类

package action;

import pub.SystemProperty;
import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {
    private static final long serialVersionUID = 1L;

    @Override
    public String execute() throws Exception {

        // 因为是静态变量,所以直接从类名.变量的方式获取
        int port = SystemProperty.port;
        String password = SystemProperty.password;
        
        System.out.println("port=" + port);
        System.out.println("password=" + password);

        //从静态容器中取
        String normalTime = SystemProperty.propList.get("normalTime");
        String oneDay = SystemProperty.propList.get("oneDay");

        System.out.println("normalTime=" + normalTime);
        System.out.println("oneDay=" + oneDay);

        return SUCCESS;
    }
}

7. 输出结果如下:

如有问题,请联系QQ:409169399,答案:Sky。

 

posted @ 2016-08-10 11:46  Sky.宾桀锋  阅读(4079)  评论(0编辑  收藏  举报