"Servlet" (server-side) initialization code in GWT

How can I have a single time initialization on a server side of GWT app?

I may be thinking to much like HttpServlet where you can override init(), but old habits are long to lose ;)

What I am trying to do is:

  • load a bunch of properties

  • establish a connection to the database


You can add like mentioned in a comment a ServletContextListener.

public class ServerConfig implements ServletContextListener {

    public void contextInitialized(ServletContextEvent event) {
    // Do stuff on startup.
    }

    public void contextDestroyed(ServletContextEvent event) {
    // Do stuff on shutdown.
    }
}

Now put the new class on the server side, you also ave to register the Listener in your web.xml file :

<listener>
<listener-class>path.to.class.ServerConfig</listener-class> 
</listener>

load a bunch of properties?

Register ServletContextListener to load Init parameters at server start-up.

Load properties and make it visible to other classes statically.

I have already posted a sample code Retrieve Init parameters outside servlet


establish a connection to the database?

Use JNDI to bind the data source.

Use Connection Utility class to get the connection as well as close the connection as soon as its done.

Here is the sample code.

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import com.woodmac.datavisualizer.shared.DVConstants;

public class ConnectionUtil {

    private DataSource dataSource;

    private static ConnectionUtil instance = new ConnectionUtil();

    private ConnectionUtil() {
        try {
            Context initContext = new InitialContext();
            dataSource = (DataSource) initContext.lookup(JNDI_LOOKUP_NAME);

        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

    public static ConnectionUtil getInstance() {
        return instance;
    }

    public Connection getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        return connection;
    }

    public void close(Connection connection) throws SQLException {
        if (connection != null && !connection.isClosed()) {
            connection.close();
        }
        connection = null;
    }
}

If you are using JBOSS in standalone mode. Then just do some entries in standalone.xml to create a data source. Just update some of its value as per your database connection such as connection-url, user-name and password.

In this case JNDI_LOOKUP_NAME will be java:jboss/datasources/oracle

<datasource jta="true" jndi-name="java:jboss/datasources/oracle" pool-name="OracleDS" enabled="true" use-java-context="true" use-ccm="true">
    <connection-url>jdbc:oracle:thin:@ipaddress:1521/sid</connection-url>
    <driver>oracle</driver>
    <new-connection-sql>select * from dual</new-connection-sql>
    <pool>
        <min-pool-size>20</min-pool-size>
        <max-pool-size>50</max-pool-size>
        <prefill>true</prefill>
    </pool>
    <security>
        <user-name>username</user-name>
        <password>password</password>
    </security>
    <validation>
        <check-valid-connection-sql>select * from dual</check-valid-connection-sql>
        <background-validation>true</background-validation>
    </validation>
    <timeout>
        <blocking-timeout-millis>30000</blocking-timeout-millis>
        <idle-timeout-minutes>1</idle-timeout-minutes>
        <use-try-lock>60</use-try-lock>
        <allocation-retry>1</allocation-retry>
    </timeout>
</datasource>