Trabalhando com ServletContext

olah pessoal!!

estou carregando alguns SELECTS(HTML) em minha aplicação através de consultas ao banco de dados e gostaria de saber se o que estou fazendo está certo ou se existe uma forma melhor de fazer.

o código do q estou fazendo está abaixo: (EXEMPLO)

classe State (bean)

public class State {
    private String pais;
    private String estado;
    private String uf;
    public void setPais( String pais ) { this.pais = pais; }
    public void setEstado( String estado ) { this.estado = estado; }
    public void setUf( String uf ) { this.uf = uf; }
    public String getPais() { return pais; }
    public String getEstado() { return estado; }
    public String getUf() { return uf; }
}

classe StateAdmin

public class StateAdmin {
    public StateAdmin() {}
    public ArrayList listState() { //método que pesquisa dados em BD
        ...
        ArrayList myStates = new ArrayList();
        while( resultSet.next() ){
            State state = new States();
            state.setPais( resultSet.getString( "pais" ) );
            state.setEstado( resultSet.getString( "estado" ) );
            state.setUf( resultSet.getString( "uf" ) );
            myStates.add( state );
        }
        ...
        return myStates;
    }
}

então eu uso um servlet que em seu método init eu faço essa pesquisa e jogo esse resultado no ServletContext… código:

servlet ProcessApp.java

....
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    ServletContext sc = getServletContext();
    //jogo os resultados da pesquisa no ServletContext
    sc.setAttribute( "states", ( new StateAdmin() ).listStates() );
}
....

agora eu faço o seguinte. assim q inicio meu servidor tomcat eu crio uma instância de ProcessApp, ou seja, meu método init de ProcessApp é carregado deixando carregado meus dados no ServletContext da aplicação. fiz isso mexendo no web.xml da minha aplicação. assim…

web.xml

...
  <servlet>
    <servlet-name>ProcessApp</servlet-name>
    <servlet-class>ProcessApp</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
...

então em meu jsp eu faço…

...
<%
  ArrayList states = ( ArrayList )application.getAttribute( "states" );
  for( Iterator it = states.iterator() ; it.hasNext() ; ) {
      State st = (State)it.next();
      out.println( "País: " + st.getPais() + "<br/>" );
      out.println( "Estado: " + st.getEstado() + "<br/>" );
      out.println( "uf: " + st.getUf() + "<br/>" );
  }
%>
...

o que vcs acham? estou fazendo isso da forma correta ou existe uma forma melhor?

Meio peculiar carregar no init() assim… mas como o tipo de informacao que voce esta carregando nesse caso em especifico eh algo que nao costuma mudar, da maneira como voce fez da para o gasto.

Rafael

O que vc poderia ter feito, que ficaria muito mais simples:

[code]public class Constants {
private static ArrayList states; static {
//seu código de iniciailização da variável. carregar os campos.
}

public static ArrayList getStates() {
     return states;
}

}[/code]

e no jsp:

<%@ page import="app.Constants" %> <%= Constants.getStates() %>

Não acha q seria mais fácil ???

quer dizer que apenas um bloco como:

static {

}

já serve para carregar meus atributos estáticos?

[quote=“Luiz Henrique Coura”]quer dizer que apenas um bloco como:

static {

}

já serve para carregar meus atributos estáticos?[/quote]

blocos estaticos sao executados uma unica vez, antes que a classe seja utilziada pela primeira vez.

Rafael

muito bom!!

fiz alguns testes.
funcionou muito bem!

obrigado pessoal!