2011-06-01 19 views
8

tengo una clase que toma un poco de tiempo para poner en marcha (hace algunos llamadas JNI y lo que no), por lo que no es factible para inicializar esta clase cada vez que se carga una página. ¿Es posible inicializar esta clase en el inicio de la aplicación y luego acceder a sus métodos a medida que se entregan las páginas?Tomcat Java Servlet - Clase Initialize en la Aplicación de inicio

Por ejemplo:

Tengo MyClass. Cuando la aplicación (Tomcat) se pone en marcha Me gustaría que initialze mi calss de la siguiente manera:

MyClass myClassInstance = new MyClass("arg1", "arg2"); 

Luego, cuando una página se llama, decir/testpage, me gustaría hacer llamadas a myClassInstance:

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import MyClass; 

public class TestPage extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 
    { 
     String myResult = myClassInstance.getResult("whatever"); 

     response.setContentType("text/html"); 
     PrintWriter out = response.getWriter(); 
     out.println("<html>"); 
     out.println("<head>"); 
     out.println("<title>Test</title>"); 
     out.println("</head>"); 
     out.println("<body>"); 
     out.println("<h1>" +myResult +"</h1>"); 
     out.println("</body>"); 
     out.println("</html>"); 
    } 
} 

¿Esto es posible?

+0

Relacionados: http://stackoverflow.com/questions/3468150/using-init-servlet, http://stackoverflow.com/questions/3153739/config-files-for-a-webapplication-load-once-and -store-donde, http://stackoverflow.com/questions/5951294/is-there-a-way-to-do-something-on-a-j2ee-server-start-im-using-tomcat, etc – BalusC

Respuesta

19

Usted tiene dos opciones:

  1. inicializar su clase en el método de servlet init(). Puede agregar el atributo <load-on-startup> para asegurarse de que su servlet se crea al inicio de la aplicación y no en el primer acceso.

  2. Agregue ServletContextListener y use contextInitialized() método de devolución de llamada. Use ServletContext#setAttribute para almacenar objetos creados para uso futuro.

+0

yeeessss ! Exactamente lo que necesito "" –

+0

Más información sobre "load-on-startup": https://docs.oracle.com/cd/E13222_01/wls/docs81/webapp/web_xml.html#1039287 – RobertG

3

Usted puede hacer la inicialización de la clase en el interior método del servlet init.
init() método se invoca cuando se carga la instancia servlet por lo que es un buen lugar para operaciones costosas.

8

Si desea que suceda una vez para toda la aplicación, y sucede antes de ejecutar cualquier servlet, implementar ServletContextListener y poner su código de inicio en contextInitialized(). Luego configure su web.xml para especificar su clase como oyente.

De lo contrario, puede hacer lo que dice la otra respuesta y lo puso en el método del servlet init().

Cuestiones relacionadas