监听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。

时间: 2024-10-11 10:43:34

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

Oracle启动和关闭、监听服务的启动/关闭

一:sql*plus启动/关闭: 1.Sqlplus /nolog 启动sql*plus[不连接数据库的方式] 2.conn / as sysdba 以DBA的身份连接到 oracle 3.startup 启动数据库 数据库启动有三种方式及应用场景 1> 正常启动      startup  [open]  启动顺序:1.启动实例[参数文件],创建后台进程及服务   2.为实例加载数据库[控制文件].加载数据库将打开控制文件, 获取数据库名称.数据文件的位置和名称等关于数据库物理结构的信息,为打

Tomcat服务器启动常见问题

参考:http://www.cnblogs.com/xdp-gacl/p/3729033.html 学习web开发,需要先安装一台web服务器,然后再在web服务器中开发相应的web资源,供用户使用浏览器访问. 一.搭建JavaWeb应用开发环境——Tomcat服务器 1.1.疑问:学习web开发,为什么必须要先装一个WEB服务器? 在本地计算机上随便创建一个web页面,用户是无法访问到的,但是如果启动tomcat服务器,把web页面放在tomcat服务器中,用户就可以访问了.这说明什么问题?

oracle监听程序无法启动(TNS-12560: TNS: 协议适配器错误,TNS-00530: 协议适配器错误)

问题描述1: C:\Users\Administrator>lsnrctl start LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 12-12月-20144:50 Copyright (c) 1991, 2010, Oracle.  All rights reserved. 启动tnslsnr: 请稍候... Failed to start service, error 193.TNS-12560: TNS: 协议

oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序

15511477451 原文 oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序? 环境:win7 64位系统.oracle11g数据库 问题描述:在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错.错误提示内容如下. 错误分析: 经过查看警告中给出的日志文件 F:\develop\oracle_data\app\Administrator\cfgtoollog

Windows 平台监听程序无法启动 报TNS-12560 TNS-00530

问题现象--01: C:\Users\Administrator>lsnrctl start LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 12-12月-2014 4:50 Copyright (c) 1991, 2010, Oracle.  All rights reserved. 启动tnslsnr: 请稍候... Failed to start service, error 193. TNS-12560: TN

ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法

今天用PL/SQL连接虚拟机中的Oracle数据库,发现报了“ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务”错误,也许你也遇到过,原因如下: oracle安装成功后,一直未停止数据库(即数据库是启动的),客户端配置成功后,应该一直不会有什么问题. 有时把Oracle安装在虚拟机中,而且Oracle安装完毕后,没在进行任何监听的配置,则虚拟机再启动,则就会出现ORA-12514的问题. 如下是解决思路: 根据出错信息判断出客户端未监听到实例服务名 1.通过重启服务的方式启动

ORACLE11g ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

1.TNS连接错误 同事跟我说连接oracle数据库报错ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务,如下所示: 2.查看本地TNSPING 查看本地的tns配置: WXX = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.121.58)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 查看本

OracleORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务

问题:oracle安装成功以后,可以使用,一段时间后,登录报错 OracleORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 查阅相关文档,以及修改后,可以正常登录,记录解决方法如下 原因:该问题是由于缺少监听器的SID_LIST描述项引起的,采用netca进行配置的时候经常会遇到该问题. 解决思路: 1.通过重启服务的方式启动数据库,再次连接仍无法连接服务器. 2.考虑监听listener.ora 监听配置文件listener.ora中可以不必指定监听的服务名(安装O

Oracle几个基础配置问题:ORA-12154: TNS: 无法解析指定的连接标识符、ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务、ORA-12516 TNS监听程序找不到符合协议堆栈要求的可用处理程序

转载地址:http://www.cnblogs.com/zhaoguan_wang/p/5505701.html 问题1:ORA-12154: TNS: 无法解析指定的连接标识符 在一台服务器上部署了Oracle客户端,使用IP/SID的方式访问,老是报ORA-12154错误,而使用tnsnames访问却没有问题,对比了我本机的配置并查阅了一下资料,Easy Connect Naming Method这个东西是Oracle 10g推出的,需要在sqlnet.ora文件中添加EZCONNECT,如