如何初始化一些类,这不是glassfish4上的Servlet?

时间:2015-10-07 08:12:46

标签: java multithreading servlets glassfish-4

我在Java代码中使用Web应用程序,它使用servlets。我的问题是如何初始化一些不是servlet的java类。我知道如果客户端连接 - 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>

我在部署应用程序时遇到此错误:

  

警告:不支持的部署描述符元素listener-class   值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.
    }
}

非常好,容易,工作:)

2 个答案:

答案 0 :(得分:3)

执行此操作的首选方法是安装ServletContextListener

当容器启动并关闭时,它们有机会运行代码。

如果代码只影响单个servlet(或者需要初始化该servlet对象的私有内容),那么你也可以在servlet的init方法中完成工作,并确保servlet甚至被加载在发出请求之前(通过load-on-startup参数)。

答案 1 :(得分:0)

您可以运行代码来初始化其中一个servlet的init()方法中的其他类。