zoukankan      html  css  js  c++  java
  • 监听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。

  • 相关阅读:
    避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动
    红包功能的开发总结
    App启动时间分析
    第三方动画库 Lottie嵌入记录
    加入一个新的团队需要做什么
    OC 面向对象的特性
    为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
    adb pull 和 adb push
    《重构:改善既有代码的设计》重构的方法整理
    《重构:改善既有代码的设计》(二) 代码的坏味道
  • 原文地址:https://www.cnblogs.com/sky230/p/5756159.html
Copyright © 2011-2022 走看看