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