KyllListener.javapublic class KyllListener extends HttpServlet implements ServletContextListener { private static final Log logger = LogFactory.getLog(KyllListener.class);
public void contextInitialized(ServletContextEvent event) {
String rootpath = event.getServletContext().getRealPath("/");
if (rootpath != null) {
rootpath = rootpath.replaceAll("\\\\", "/");
}else {
rootpath = "/";
}
if (!rootpath.endsWith("/")) {
rootpath = rootpath + "/";
}
Global.RGS_HOME = rootpath;
logger.error("根目录是:"+Global.RGS_HOME);
}}Global.java
public final class Global{
       //为精简内容,一部分代码已省略
public static String RGS_HOME=null;
}SystemConfigService.java
public class SystemConfigService {
 private static final Log logger = LogFactory.getLog(SystemConfigService.class);
 private static final String SYSTEM_CONFIG_PROPERTIES = "/WEB-INF/config.ini";
 private File configFile = null;  private Properties properties = new Properties();  private static SystemConfigService systemConfigServer = null; 
 
 public static synchronized SystemConfigService getInstance(){
if(systemConfigServer==null){
logger.error("Global.RGS_HOME:"+Global.RGS_HOME);
systemConfigServer = new SystemConfigService(Global.RGS_HOME);
}
return systemConfigServer;
 }
 
 private SystemConfigService(String systemRootPath) {
    try {
     configFile = new File(systemRootPath+SYSTEM_CONFIG_PROPERTIES);
     InputStream configFile = new FileInputStream(this.configFile);
     properties.load(configFile);
     configFile.close();
    }
    catch (Exception e) {
      logger.error(e);
    }
  }
 public Properties getProperties(){
 return this.properties;
 }
}
以上代码大意是TOMCAT启动是利用KyllListener监听到项目的根目录,将其赋值给Global.RGS_HOME,
然后systemConfigServer = new SystemConfigService(Global.RGS_HOME)来初始化systemConfigServer,
这段代码的主要目的是SystemConfigService当中的properties。
现在在启动是显示如下日志:
信息: Starting Servlet Engine: Apache Tomcat/6.0.18
2009-09-09 09:09:41,640 ERROR [com.alt.rgs.SystemConfigService] - Global.RGS_HOME:null
2009-09-09 09:09:41,640 ERROR [com.alt.rgs.SystemConfigService] - java.io.FileNotFoundException: null\WEB-INF\config.ini (系统找不到指定的路径。)
2009-09-09 09:09:41,687 ERROR [com.alt.rgs.system.web.listener.KyllListener] -根目录是:D:/work spaces/rgs/WebRoot/
通过下面这段可以看到在TOMCAT启动时确实取到项目根目录并将其赋值给Global.RGS_HOME了,2009-09-09 09:09:41,687 ERROR [com.alt.rgs.system.web.listener.KyllListener] -根目录是:D:/work spaces/rgs/WebRoot/
但通过启动日志可以看出com.alt.rgs.SystemConfigService初始化在前,com.alt.rgs.system.web.listener.KyllListener初始化在后,在WEB项目中照理应该是Listener类率先初始化的啊,那我这里该如何解释呢。最后,该如何解决我的问题呢?
请各位大侠指教。谢谢各位了。

解决方案 »

  1.   


    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>rgs.root</param-value>
    </context-param>
    <context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
    </context-param> <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dataAccessContext-local.xml /WEB-INF/applicationContext.xml</param-value>
    </context-param> <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
    <display-name>初始化</display-name>
    <listener-class>com.alt.rgs.system.web.listener.KyllListener</listener-class>
    </listener>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <jsp-config>
    <taglib>
    <taglib-uri>/WEB-INF/FCKeditor.tld</taglib-uri>
    <taglib-location>/WEB-INF/FCKeditor.tld</taglib-location>
    </taglib>
    <taglib>
    <taglib-uri>/WEB-INF/kyll.tld</taglib-uri>
    <taglib-location>/WEB-INF/kyll.tld</taglib-location>
    </taglib>
    </jsp-config>
    <servlet>
    <description>��装载单位列表(树形单位列表专用)</description>
    <servlet-name>LoadUnit4TreeAction</servlet-name>
    <servlet-class>com.alt.rgs.system.web.action.LoadUnit4TreeAction</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>LoadUnit4TreeAction</servlet-name>
    <url-pattern>/servlet/LoadUnit4TreeAction.do</url-pattern>
    </servlet-mapping>
    <servlet>
    <description>登录验证</description>
    <servlet-name>LoginAction</servlet-name>
    <servlet-class>com.alt.rgs.system.action.LoginAction</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>LoginAction</servlet-name>
    <url-pattern>/LoginAction.do</url-pattern>
    </servlet-mapping>
    <servlet>
    <description></description>
    <servlet-name>searchForKeywordAction</servlet-name>
    <servlet-class>com.alt.rgs.search.action.SearchForKeywordAction</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>searchForKeywordAction</servlet-name>
    <url-pattern>/servlet/searchForKeywordAction.do</url-pattern>
    </servlet-mapping>
    <servlet>
    <description></description>
    <servlet-name>loadRgsTypeAction</servlet-name>
    <servlet-class>com.alt.rgs.system.web.action.LoadRgsTypeAction</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>loadRgsTypeAction</servlet-name>
    <url-pattern>/servlet/loadRgsTypeAction.do</url-pattern>
    </servlet-mapping>
    </web-app>这是web.xml的全部内容,因为不大,所以干脆全贴上来了。
      

  2.   

    问题已经解决,<listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <listener>
            <display-name>初始化</display-name>
            <listener-class>com.alt.rgs.system.web.listener.KyllListener</listener-class>
        </listener>把这2个Listener的顺序调换一下就OK了,
    各位应该知道why吧?
    我就不细说了
      

  3.   

     if (listener != NULL) void Camera::dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr)sp<CameraListener> listener;
        {
            Mutex::Autolock _l(mLock);
            listener = mListener;
                }
        if (listener != NULL) {
     
            listener->postDataTimestamp(timestamp, msgType, dataPtr);
        } else {
            LOGW("No listener was set. Drop a recording frame.");
            releaseRecordingFrame(dataPtr);
        }