2015-10-07 37 views
-1

我使用Java代碼的Web應用程序,它使用servlets。我的問題是如何初始化一些java類,這不是servlet。我明白,如果客戶端連接 - servlet然後打印輸出。但只有「如果客戶端連接」。如何初始化一些類,它不是glassfish4上的Servlet?

是否有可能在進行任何連接之前運行某些線程?

編輯:

感謝的答案,現在我試圖做這樣說:

類:

package com.xsistema.filemanager.application; 

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

/** 
* 
* @author Ernestas Gruodis 
*/ 
public class ServerInit implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     System.out.println("Initialized"); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     System.out.println("Destroyed"); 
    } 
} 

而且glassfish-web.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> 
<glassfish-web-app error-url=""> 
    <context-root>/file-manager</context-root> 
    <class-loader delegate="true"/> 
    <jsp-config> 
     <property name="keepgenerated" value="true"> 
      <description>Keep a copy of the generated servlet class' java code.</description> 
     </property> 
    </jsp-config> 

    <listener> 
     <listener-class> 
      com.xsistema.filemanager.application.ServerInit 
     </listener-class> 
    </listener> 

</glassfish-web-app> 

我得到這個呃ROR同時部署應用程序:

警告:不支持的部署描述符元素監聽級 值com.xsistema.filemanager.application.ServerInit。

這裏有什麼問題?

EDIT2:

不能刪除這個問題,似乎是重複的(它有答案的話)。但我找到了解決辦法:

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 
import javax.servlet.ServletContextEvent; 

@Startup 
@Singleton 
public class Config { 

    @PostConstruct 
    public void init() { 
     // Do stuff during webapp's startup. 
    } 

    @PreDestroy 
    public void destroy() { 
     // Do stuff during webapp's shutdown. 
    } 
} 

非常好,方便,工作:)

回答

0

您可以運行你的代碼,在你的servlet之一init()方法初始化其他類。

+0

但這意味着我必須在所有servlet上添加相同的代碼,或者執行一些過濾器。不好。 –

+0

如果它是在你調用任何servlet之前需要執行的東西,那麼是的。在這種情況下,我會讓所有的servlet用這樣的邏輯擴展一個基本的servlet類。 –

+0

好的,ServletContextListener在這裏更適合,如果它是一個應用程序範圍的初始化。我upvoting其他答案:) –

3

執行此操作的首選方法是安裝ServletContextListener

當容器啓動並關閉時,它們有機會運行代碼。

如果代碼隻影響單個servlet(或者需要初始化該servlet對象的私有對象),那麼您還可以在servlet的init方法中執行該操作,並確保在請求之前加載該servlet (通過load-on-startup參數)。

+0

我在glassfish4上得到這個警告:「警告:不支持的部署描述符元素監聽器類值path.path ...」 –

+0

似乎glassfish4找不到指定的文件.. –

+0

您是否必須使用glassfish-web.xml ?也許它不支持這個。你不能使用標準的web.xml嗎?或者嘗試'@ WebListener'註釋。 – Thilo