2008-10-01 10 views
44

Tomcat başlangıçta geçici dosyaları kaldırmam gerekiyor, geçici dosyaları içeren bir klasöre geçiş applicationContext.xml dosyasında.Sadece Tomcat/Wildfly/Glassfish başlangıcında bir yöntem/sınıf çalıştırmanın bir yolu var mı?

Sadece Tomcat açılışında bir yöntem/sınıf çalıştırmanın bir yolu var mı?

+0

GÜNCELLEME: Geçici bir arıza geçirdim - bir [ContextListene] kullanmalısınız r] (http://www.docjar.com/docs/api/listeners/ContextListener.html), bir 'SessionListener' değil. –

cevap

70

contextInitialized() yönteminden yönteminizi çağıran bir ServletContextListener yazabilirsiniz. Web.xml'de dinleyicinizi web sunucunuza ekleyin, ör.

<listener> 
    <listener-class>my.Listener</listener-class> 
</listener> 

ve

package my; 

public class Listener implements javax.servlet.ServletContextListener { 

    public void contextInitialized(ServletContext context) { 
     MyOtherClass.callMe(); 
    } 
} 

Kesinlikle, bu sadece ziyade Tomcat başlangıçta daha Webapp başlangıçta bir defa çalıştırılır konuşan, ama bu aynı şey için yeterli olabilir.

+0

Bu, aynı zamanda Java sunucu konteynerleri arasında taşınabilir. Benim düşüncemdeki en iyi yol. Diğer seçenekler burada listelenmiştir - http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html – mikato

+0

@skaffman ancak tutulma sırasında tomcat sunucusunda contextInitialized başlatılır () işlev çağırıyor ama MyClass.INSTANCE çağırmıyor.MyClass bir enum sınıfı ve bir kez INSTANCE yaratıyor.Tomcat başlatılamıyor. kod, public void contextInitialized (ServletContextEvent contextEvent) { \t MongoDBClass.INSTANCE.getSomeDB(). getCollection ("UserDB"); \t context = contextEvent.getServletContext(); \t MongoDBClass.INSTANCE.getSomeDB(). GetCollection ("UserDB"); \t \t \t} – Vicky

3

İçindekinin yaşam döngüsünün bir parçası olarak bunu yapmanın daha iyi bir yolu olması gerektiğine eminim (düzenleme: Hank'in cevabı var - cevaplamadan önce neden bir önerdiğimi merak ediyordum), ancak sunucu başlatıldığında kerelik eylemleri gerçekleştirmek etmekten başka bir amacı vardır Servlet:

<servlet> 
    <description>Does stuff on container startup</description> 
    <display-name>StartupServlet</display-name> 
    <servlet-name>StartupServlet</servlet-name> 
    <servlet-class>com.foo.bar.servlets.StartupServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
+2

Servlet 2.4'ten önce (veya 2.3'tü?), Insanlar bunu yaptı. Ancak bağlam dinleyicilerinin eklenmesiyle, artık gerekli değildir. – skaffman

+0

Bu iyi bir tp biliyorum - "refactoring" olduğumuz eski bir uygulama (şu anda daha iyi bir çerçeve ve her yerde değişen gereksinimler, dürüst! bu tekniği kullanarak. –

9

Ayrıca (Servlet v3 başlayarak) açıklamalı bir yaklaşımın (web.xml bir şey eklemeye gerek) kullanabilirsiniz:

@WebListener 
    public class InitializeListner implements ServletContextListener { 

     @Override 
     public final void contextInitialized(final ServletContextEvent sce) { 

     } 

     @Override 
     public final void contextDestroyed(final ServletContextEvent sce) { 

     } 
    } 
+0

contextInitialized içinde http sunucusu başlangıç ​​kodunu ekleyebilir miyim. Çünkü bunu ekledikten sonra istisna ve hatalarla uğraşıyorum – Hema