2015-10-07 35 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