Métodos estáticos em servlets (ESCLARECIDO)

6 respostas
ibispo

Obas, pessoal,

Eu estava lendo o artigo do GUJ sobre Thread Safety com Servlets (muito bom) e me surgiu a seguinte situação:

Eu utilizo servlet extendendo de HttpServlet reescrevo o método service() onde eu recebo do menu principal do sistema as urls=‘servlet?metodo=X’. Dentro do método service(), eu vejo o parametro ‘metodo’ e aciono as rotinas do sistema por ele.

protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException { 

String metodo = request.getParameter("metodo");

if ( metodo.equals("cadastroX") )
    jsp = CadastroX.execute(request);
else if ( metodo.equals("cadastroY") )
    jsp = CadastroY.execute(request);
...

}

Os métodos execute() das classes CadastroX, Y, etc são estáticos, ou seja, eu não instancio as classes CadastroX, Y, etc para acionar os métodos.

DÚVIDA (finalmente, rsrs): Lendo sobre o atigo acima ‘TheradsSafe’ fiquei meio preocupado se múltiplos usuários acessarem as rotinas ao mesmo tempo e isso me dar problemas.

Gostaria de saber se é correto eu acionar as rotinas do sistema usando métodos estáticos ou eu deveria tirar o static dos métodos dos cadastros? Informando que tenho rotinas críticas, por exemplo, de lançamento de itens, produtos, vendas, etc. etc.

No aguardo do apoio da comunidade,

Vlw.

6 Respostas

Carlos_ds_jar

ibispo:
Obas, pessoal,

Eu estava lendo o artigo do GUJ sobre Thread Safety com Servlets (muito bom) e me surgiu a seguinte situação:

Eu utilizo servlet extendendo de HttpServlet reescrevo o método service() onde eu recebo do menu principal do sistema as urls=‘servlet?metodo=X’. Dentro do método service(), eu vejo o parametro ‘metodo’ e aciono as rotinas do sistema por ele.

protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException { 

String metodo = request.getParameter("metodo");

if ( metodo.equals("cadastroX") )
    jsp = CadastroX.execute(request);
else if ( metodo.equals("cadastroY") )
    jsp = CadastroY.execute(request);
...

}

Os métodos execute() das classes CadastroX, Y, etc são estáticos, ou seja, eu não instancio as classes CadastroX, Y, etc para acionar os métodos.

DÚVIDA (finalmente, rsrs): Lendo sobre o atigo acima ‘TheradsSafe’ fiquei meio preocupado se múltiplos usuários acessarem as rotinas ao mesmo tempo e isso me dar problemas.

Gostaria de saber se é correto eu acionar as rotinas do sistema usando métodos estáticos ou eu deveria tirar o static dos métodos dos cadastros? Informando que tenho rotinas críticas, por exemplo, de lançamento de itens, produtos, vendas, etc. etc.

No aguardo do apoio da comunidade,

Vlw.


Depende bastante do que vc colocou no metodo.
Posta o codigo aí pra a gente dar uma olhada :shock:

ibispo

Obas,

Segue abaixo um exemplo: Esse metodo execute() tem um comportamento duplo: Se acionado do menu ou se acionado do cadastro.

public static String execute(HttpServletRequest request, boolean fromMenu, String tabela ) {

    	String jsp = "";

    	try {

        	Usuarios dadosUsu = (Usuarios) request.getSession().getAttribute( 
            		Utilitarios.SESSAO_DADOS_USUARIO );
    		
        	AcessoDAO acessoDAO = new AcessoDAO();
        	TabelasCadastroDAO tabelasCadastroDAO = new TabelasCadastroDAO();
        	
    		/*
    		 * Controle de acesso (se for acionado do menu)
    		 */
        	if ( fromMenu ) {

	        	String chaveModulo = "Cad" + tabela;
	    		String retornoAcesso =
	    			acessoDAO.getAcesso(dadosUsu, chaveModulo, Utilitarios.ACESSO_LER);
	
	    		if ( !"".equals(retornoAcesso) ) {
	    			request.setAttribute( "msgAcesso", retornoAcesso ); 
		            jsp = "pages/acessDenied.jsp";
		            return jsp;
				}

        	}
        	
    		/*
    		 * Parâmetros
    		 */
    		
        	String campoPesquisa = (String) request.getParameter("campoPesq");
        	ArrayList<TabelasCadastro> listTabela = new ArrayList<TabelasCadastro>();

        	if ( !fromMenu ) {
	        	listTabela = tabelasCadastroDAO.getAll( tabela, campoPesquisa );
        	}
        	
            request.setAttribute( "tabCadastro", tabela ); 
            request.setAttribute( "nmTela", Constantes.getNomesTabelasHTML(tabela, true) ); 
            request.setAttribute( "listTabela", listTabela );
            request.setAttribute( "campoPesq", campoPesquisa );
            
            jsp = "pages/cadastros/tabelasCadastroLista.jsp";
            
        } catch (Exception e) {

        	String erro = Utilitarios.showStackTrace(e);
	        request.setAttribute( "erro", erro );
	        jsp = "pages/erro.jsp";
	        
        }
        
        return jsp;
    }

Vlw.

Carlos_ds_jar

ibispo:
Obas,

Segue abaixo um exemplo: Esse metodo execute() tem um comportamento duplo: Se acionado do menu ou se acionado do cadastro.

public static String execute(HttpServletRequest request, boolean fromMenu, String tabela ) {

    	String jsp = "";

    	try {

        	Usuarios dadosUsu = (Usuarios) request.getSession().getAttribute( 
            		Utilitarios.SESSAO_DADOS_USUARIO );
    		
        	AcessoDAO acessoDAO = new AcessoDAO();
        	TabelasCadastroDAO tabelasCadastroDAO = new TabelasCadastroDAO();
        	
    		/*
    		 * Controle de acesso (se for acionado do menu)
    		 */
        	if ( fromMenu ) {

	        	String chaveModulo = "Cad" + tabela;
	    		String retornoAcesso =
	    			acessoDAO.getAcesso(dadosUsu, chaveModulo, Utilitarios.ACESSO_LER);
	
	    		if ( !"".equals(retornoAcesso) ) {
	    			request.setAttribute( "msgAcesso", retornoAcesso ); 
		            jsp = "pages/acessDenied.jsp";
		            return jsp;
				}

        	}
        	
    		/*
    		 * Parâmetros
    		 */
    		
        	String campoPesquisa = (String) request.getParameter("campoPesq");
        	ArrayList<TabelasCadastro> listTabela = new ArrayList<TabelasCadastro>();

        	if ( !fromMenu ) {
	        	listTabela = tabelasCadastroDAO.getAll( tabela, campoPesquisa );
        	}
        	
            request.setAttribute( "tabCadastro", tabela ); 
            request.setAttribute( "nmTela", Constantes.getNomesTabelasHTML(tabela, true) ); 
            request.setAttribute( "listTabela", listTabela );
            request.setAttribute( "campoPesq", campoPesquisa );
            
            jsp = "pages/cadastros/tabelasCadastroLista.jsp";
            
        } catch (Exception e) {

        	String erro = Utilitarios.showStackTrace(e);
	        request.setAttribute( "erro", erro );
	        jsp = "pages/erro.jsp";
	        
        }
        
        return jsp;
    }

Vlw.


O ideal pra vc é utilizar um controle de transação pra evitar a inconsistencia do banco a acessos simultêneos, isso se vc ainda não estiver usando, no mais particularmente não vejo problema.

ibispo

Você poderia me ajudar a entender melhor isso?. Hoje nas DAOs eu utilizo alguma coisa assim:

public boolean update( CadastroBean dadosCadastro ) {
		
	boolean retorno = true;
    	
    	try {

    		beginConnection();

        	connection.setAutoCommit(false);
    		
        	if ( dadosCadastro.getId() == 0 ) {
        	
	            sql = "INSERT INTO CadastroX " +
		              "( Nome, Endereco, ID ) " +
		              "VALUES " +
		              "( ?, ?, ? )";

        	} else {
        		
	            sql = "UPDATE CadastroX " +
		              "SET Nome = ?, Endereco = ?" +
		              "WHERE ID = ?";
        		
        	}
            
            pStmt = connection.prepareStatement(sql);

            pStmt.setString(1, dadosCadastro.getNome() );
            pStmt.setString(2, dadosCadastro.getEndereco() );
            pStmt.setInt(3, dadosCadastro.getId() );
            
            pStmt.executeUpdate();
            
            connection.commit();

        } catch (Exception e) {
        	retorno = setCatch(e);
	} finally {
        	setFinally();
        }
		
	return retorno;
		
}

Eu estaria tranquilo?

Carlos_ds_jar

ibispo:
Carlos_ds_jar:

O ideal pra vc é utilizar um controle de transação pra evitar a inconsistencia do banco a acessos simultêneos

Você poderia me ajudar a entender melhor isso?. Hoje nas DAOs eu utilizo alguma coisa assim:

public boolean update( CadastroBean dadosCadastro ) {
		
	boolean retorno = true;
    	
    	try {

    		beginConnection();

        	connection.setAutoCommit(false);
    		
        	if ( dadosCadastro.getId() == 0 ) {
        	
	            sql = "INSERT INTO CadastroX " +
		              "( Nome, Endereco, ID ) " +
		              "VALUES " +
		              "( ?, ?, ? )";

        	} else {
        		
	            sql = "UPDATE CadastroX " +
		              "SET Nome = ?, Endereco = ?" +
		              "WHERE ID = ?";
        		
        	}
            
            pStmt = connection.prepareStatement(sql);

            pStmt.setString(1, dadosCadastro.getNome() );
            pStmt.setString(2, dadosCadastro.getEndereco() );
            pStmt.setInt(3, dadosCadastro.getId() );
            
            pStmt.executeUpdate();
            
            connection.commit();

        } catch (Exception e) {
        	retorno = setCatch(e);
	} finally {
        	setFinally();
        }
		
	return retorno;
		
}

Eu estaria tranquilo?


Provavelmente sim, mas recomendo utilizar JPA com Hibernate, pra controlar as transações, com isso sua aplicação fica no minimo mais confiável :idea:

ibispo

Carlos, valeu as dicas!

Criado 9 de agosto de 2010
Ultima resposta 9 de ago. de 2010
Respostas 6
Participantes 2