GARANTIR DESCONTO

Fórum Construir Webservice SOAP com Netbeans, Glassfish, Windows Server 2003 e MS SQL Server 2000 #420939

02/08/2012

0

Caros amigos, venho aqui expor um pouco do que tenho aprendido para montar um servidor de aplicações e obter assim uma opinião de como melhorar o trabalho ja que sou muito noob como dizem os gamers.

Bom a história, meio comum é que preciso montar um webservices que ira se comunicar com clientes iPad. Nossa empresa já trabalha a muito tempo com aplicações desktop feitas em Delphi e a plataforma aqui é Microsoft total. No entanto ultimamente a empresa responsável pela nossa ferramenta não tem um futuro estabelecido e o ultimo grande filho de pascal esta se tornando uma plataforma de nicho. Testamos por alguns meses o .net mas não gostamos da plataforma, ai cogitamos varias tecnologias e por fim como é de se prever escolhemos o Java.

Lindo mas o fato é que todos aqui são programadores procedurais desde sempre (Basic, Clipper, Delphi, PHP) e por necessidade fomos com tudo para a orientação de objetos. Meio que um choque cultural, ainda mais tento de realizar um projeto como esse do webservice.

Não há instituições em centenas de KM desse fim de mundo para estudarmos, e mesmo as mais longe só iniciam turmas em 2013. Tenho lido muito este forum e os amigos tem sido de grande ajuda, bem como o Youtube e os livros (que alias recomendo):

[list]Core Java 1 e 2 de Cay S. Horstmann e Gary Cornell[/list]
[list]Use a Cabeça Servelets e JSP[/list]
[list]Padrões de Projeto[/list]
[list]Introdução a Plataforma Java EE6 com Glassfish 3 de Antonio Gonçalves[/list]
[list]Java Web Services Implementando[/list]

Apesar de atualmente compreender muito parcialmente ja montei um webservice que faz determinadas tarefas como buscar no banco de dados, geral XML em uma String e outras tarefas mais simples.

[b]Configurando Glassfish 3 com MS SQL Server 200[/b]

O primeiro desafio foi implementar uma comunicação entre o SQL Server 2000, uma vez que o driver padrão disponível no site da microsoft por alguma razão não funcionava corretamente com o Glassfish. Depois de muitas tentativas e pesquisa consegui criar o JNDI no servidor usando os seguintes passos:

::::::::::::::::::::::::::::::::::::::::::::::::::::::
::Notas de configuração SQL Server 2000 no Glassfish::
::::::::::::::::::::::::::::::::::::::::::::::::::::::

1 - Nome do Driver baixado no site da Microsoft.
nome: [b]sqljdbc.jar[/b]
[url]http://msdn.microsoft.com/pt-br/sqlserver/aa937724.aspx[/url]

2 - Diretório de instação no Glasssfish (Local onde o arquivo [b]sqljdbc.jar[/b] devera ser copiado).
[b]glassfish3\glassfish\domains\DOMINIO\lib\ext[/b]

3 - Acesse a configuração do seu Glassfish (geralmente http:\\SeuServidor:4848), va em Recursos/JDBC/Pools de Conexão JDBC.
- Definições gerais do Pool
Tipo de Recurso: [b]javax.sql.DataSource[/b]
Nome de Classe da Fonte de Dados (os nomes padrão do sqlserver não funcionam com a versão 2000): [b]com.microsoft.jdbcx.sqlserver.SQLServerDataSource[/b]

4 - Agora em Recursos/JDBC/Recurso JDBC, crie um recurso com base no pool criado acima.

5 - Chamar a referência ao recurso no web.xml do projeto.
resource-ref
   res-ref-namejdbc/RECURSO/res-ref-name
   res-typejavax.sql.DataSource/res-type
   res-authContainer/res-auth
   res-sharing-scopeShareable/res-sharing-scope
/resource-ref


6 - Uma Classe para criar o chamado do recurso.
public class CriarConexoes {

    public Connection getConnection() {
        try {
            InitialContext initialContext = new InitialContext();
            DataSource dataSource = (DataSource) initialContext.lookup(jdbc/NTServer);
            return dataSource.getConnection();
        } catch (NamingException ex) {
            Logger.getLogger(CriarConexoes.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(CriarConexoes.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public Statement getStatement() {
        Connection con = getConnection();
        try {
            Statement stmt = con.createStatement();
            return stmt;
        } catch (SQLException ex) {
            Logger.getLogger(CriarConexoes.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public ResultSet getResultset(String sql) {
        try {
            ResultSet rs = getStatement().executeQuery(sql);
            return rs;
        } catch (SQLException ex) {
            Logger.getLogger(CriarConexoes.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}


Com isso em qualquer lugar que eu precisar fazer uma consulta por exemplo uso:

        CriarConexoes con = new CriarConexoes();
        ResultSet rs = con.getResultset(SELECT coluna1, coluna2 FROM tabela_qualquer);
        ListClasseDescreveTabela lista = new ArrayList();
        try {
            while (rs.next()) {
                ClasseDescreveTabela tab = new ClasseDescreveTabela();
                tab.setColuna1(rs.getInt(coluna1));
                tab.setColuna2(rs.getString(coluna2));
                lista.add(tab);
            }
        } catch (SQLException ex) {
            Logger.getLogger(ClasseAtual.class.getName()).log(Level.SEVERE, null, ex);
        }


Bem simples né? Mas pra chegar nisso eu ralei... Não reclamo não, meu chefe ta pior já que ele esta estudando o Objective C para criar os clientes no iPad.
Esse foi o inicio e a partir dai consegui criar tarefas mais reais e praticas com o Java.
Red Software

Red Software

Responder

Posts

02/08/2012

Red Software

[i]Continuando...[/i]

Montado o WebService. Basicamente a primeira tarefa é a aplicação cliente importar dados para alimentar suas tabelas internas. Basicamente a estrutura do Sistema vai ser assim.

[app Cliente]
[list]Possui tabelas próprias (Até o momento possui 15), que são usadas em operações locais.[/list]
[list]O cliente ira se conectar ao WebService na sua primeira utilização para importar os dados básicos que irão alimentar essas tabelas.[/list]
[list]O cliente ira se conectar ao Webservice para enviar novos dados e verificar se há atualizações dos dados básicos.[/list]

[Webservice]
Autentificar usuário e:
[list]Enviar dados para alimentar tabelas.[/list]
[list]Executar regras do negocio a partir dos dados recebidos do Cliente.[/list]
[list]Devolver resultado ao Cliente (atualizar dados do Cliente).[/list]

Como disse anteriormente, esse lance de Webservice e camadas é novo para mim, assim como o próprio Java. Estou usando SOAP, já montei uma aplicação usando o Glassfish que consulta dados no SQLService.

Então gostaria muito da opinião de vocês sobre maneiras mais profissionais e funcionais de fazer as tarefas que vou postando aqui, servindo assim tanto de ajuda para mim quanto de referência para algum outro novato interessado no assunto.

[b]Métodos do Servidor[/b]

[list]Importar Tabelas[/list]
Pelo conhecimento que temos, decidimos importar as tabelas em formato XML dentro de uma String. A ideia geral é, consultar dados (usando o procedimento do texto anterior) colocar o resultado dentro de um List e gerar o XML a partir desse List. Para isto uma solução prática foi usar o [b]XStream[/b] (disponível em [url]http://xstream.codehaus.org/[/url]). Criei uma classe que ao mesmo tempo lê o conteúdo do List e muda os Alias do XML com base no nome da classe do objeto (tabela).

Classe que cria o XML:
public class CriarXMLdoArray {

    public static String CriaXML(Object Lista, Class objeto2) {
        XStream xs = new XStream(new XppDriver(new XmlFriendlyNameCoder(_-, _)));
        nomeObj n = new nomeObj();
        xs.alias(n.nomeObj(objeto2) + _S, List.class);
        xs.alias(n.nomeObj(Lista.getClass()) + X, Lista.getClass());
        xs.alias(n.nomeObj(objeto2), objeto2);
        String retorno = xs.toXML(Lista);
        return retorno;
    }
}


Classe que pega o nome dos objetos:
public class nomeObj {

    public String nomeObj(Class obj) {
        String name = obj.getName();
        if (obj.getName().indexOf(.)  0) {
            return name;
        }
        return name.substring(name.lastIndexOf(.) + 1, name.length());
    }
}


Então na classe principal do projeto, eu declaro o seguinte @WEBMETHOD:
/**
     * Operação de serviço web
     */
    @WebMethod(operationName = ImportarTabelaX)
    public String ImportarTabelaX(@WebParam(name = nome) String nome, @WebParam(name = senha) String senha, @WebParam(name = id) String id) {
        //TODO write your implementation code here:
        //Esse IF chama uma classe que verifica se o usuario que chama o método existe (Repare que todos os parâmetros são String, não sei se isso é recomendado)
        if (!new ValidarUsuario(nome, senha, id).valida()) {
            return Usuário inválido!;
        }
        //Código que lê a tabela e gera e cria o List (resumido só para ilustrar)
        ResutSet = new CriarConexoes().getResultset(SELECT A, B FROM TabelaX);
        ListClasseTabelaX lista = new ArrayListClasseTabelaX();
        try{
            while(rs.next()){
                ClasseTabelaX tabela = new ClasseTabelaX();
                tabela.setA(rs.getString(A);
                tabela.setB(rs.getString(B);
                lista.add(OBJGerados);
            }
        } catch (Exception e) {

        }
        return CriarXMLdoArray.CriaXML(lista, ClasseTabelaX.class);
    }


Basicamente estou fazendo isso. O retorno dentro da String é mais ou menos assim:
TabelaX_S
  TabelaX
    AAmora/A
    BBanana/B
  /TabelaX
  TabelaX
    AAvião/A
    BBalão/B
  /TabelaX
  TabelaX
    AArmadura/A
    BBaioneta/B
  /TabelaX
  TabelaX
    AArcode/A
    BBaixo/B
  /TabelaX
/TabelaX_S


Bem é isso ai... Em suas opiniões o que acham do jeito que estou fazendo as coisas? Alguém tem experiência com este assunto?
Responder

Gostei + 0

07/08/2012

Robson Teixeira

Olá amigo acredito que você esteja indo bem com suas aplicações e 1 outra opção para a leitura de XML que julgo mais pratica, e o uso do JAXB pois a mesma permite você mapear uma classe que cada atributo corresponde a uma tag do seu xml mas se o uso do xstream satisfaz bem as necessidades não troque.

att
robson
Responder

Gostei + 0

07/08/2012

Red Software

Obrigado amigo, eu li e achei interessante o JABX, possivelmente eu irei usa-lo :3
Responder

Gostei + 0

28/06/2013

Rodrigo Santos

Olá amigo, estava lendo seu post hj e estou atualmente na mesma situação que você estava na data da postagem.
Estou iniciando um projeto para migrar um grande legado de sistemas da empresa em que trabalho. Os sistemas atuais estão em delphi, php e etc. Estamos adotando a plataforma java para os novos sistemas.
Estou com um problema ao tentar configurar o pool de conexão no glassfish. Consigo configurar a conexão com outros bancos, como mysql, postegres mas no sqlServer 2000 ainda não consegui.

Baixei o driver conforme você indicou no site da microsoft e copiei para a pasta \lib\ext do domínio do glassfish que roda na minha máquina:
Nas propriedades adicionais do pool configurei portNumber: 1212, databaseName: teste, serverName: MEUSERVIDOR, user: teste, password: 123456.

Quando mando executar o ping do glassfish ele retorna a sequinte mensagem:

Falha ao Fazer Ping no Pool de Conexões para jdbc_enterprise_siserge. Class name is wrong or classpath is not set for : com.microsoft.jdbcx.sqlserver.SQLServerDataSource Please check the server.log for more details.

Será que pode me ajudar com o conhecimento que acumulou e experiência desse período?
Vlw.
Responder

Gostei + 0

29/06/2013

Marcelo Senaga

Veja se isso te ajuda:

https://www.java.net//node/656913
Responder

Gostei + 0

30/06/2013

Rodrigo Santos

Vlw camarada, ajudou mto! Já coloquei p funcionar aqui!
Grande abraço!
Responder

Gostei + 0

03/07/2013

Marcelo Senaga

Show, parabéns. Tópico concluído.
Responder

Gostei + 0

03/07/2013

José

Marcando tópico como concluído.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar