sábado, 26 de novembro de 2011

Queima de Livros de Computação

Fala galera! Irei me mudar ano que vem, e recebi um ultimato da minha esposa para me 'livrar' de algumas coisas que eu tenho, ela disse que na casa nova só quer coisa nova :(
Assim, estou vendendo os Livros abaixo (depois irei anunciar outras coisas), se alguém se interessar favor entrar em contato comigo pelo meu email ou deixa um comentário aí no post! Valeu!

Rails 3 Programming (R$ 45,00)                                                        Ruby Programming (R$ 50,00)


Core J2ME (R$ 20,00)                                                                          Hibernate em Ação (20,00)

Projetos Práticos com Jboss Seam (R$ 30,00)                               Hackers Expostos 4ed (R$ 50,00)

Sistema de Banco de Dados (R$ 60,00)                                     Criando Páginas com css (R$ 35,00) 

Effective Java - autografado pelo autor do livro (R$ 80,00)
Se alguém se interessar pelo bolo todo, fala aí que eu posso ver um desconto. Quanto à entrega, eu moro em Fortaleza, então é bom que você more por aqui também, pois não tenho ideia de quanto seria o frete pra outro lugar :) Abraço a todos!

quarta-feira, 3 de agosto de 2011

Novidades da JDBC 4

Quem nunca precisou fazer uma conexão JDBC em Java que atire a primeira pedra! Apesar de hoje em dia não ser comum utilizar JDBC puro em grandes projetos, embora haja quem o faça, a API continua evoluindo junto com a especificação do JSE.
A nova API, JDBC 4, foi incorporada ao JDK 6 e traz algumas mudanças como: melhor gerenciamento de objetos e suporte a novos tipos de dados, além das já existentes flexibilidade e facilidade de uso.
Uma mudança que a nova versão trouxe é na hora de obtermos uma conexão com o banco. Antes era necessário carregar a classe do driver JDBC antes de chamar o getConnection de DriverManager, por exemplo:

Class.forName("com.mysql.jdbc.Driver");
//Chamada ao DriverManager aqui

Esta chamada não é mais necessária, pois o próprio DriverManager se encarregará de localizar e carregar  a classe do Driver JDBC, para isto, basta que nós adicionemos o .jar no classpath da aplicação.
Outra novidade é o suporte a tipos de dados em XML, que estão definidos na SQL2003. O objeto é o java.sql.SQLXML, podemos fazer por exemplo:

SQLXML xml = Connection.createSQLXML( );

ou ainda:

SQLXML xml = resultSet.getSQLXML( );
InputStream is = xml.getBinaryStream( );

Seu uso é similar aos dos tipos CLOB e BLOB, que são suportados desde à versão 2.0, a nova versão traz  também a classe RowId, que permite fazer o acesso a um registro de forma mais rápida.
Agora é possível executar funções escalares como:
  • CHAR_LENTH, CHARACTER_LENGTH
  • CURRENT_TIME, CURRENT_DATE

Com o advento dos frameworks de ORM, como Hibernate, JPA, ficou cada vez mais raro usar JDBC, talvez você leitor nem mesmo soubesse que a API estava na versão 4.0, to mentindo? :) Mas eu acredito que é bom estudar as bases, pois se soubermos utilizar bem JDBC será mais fácil aprender a usar ORM, assim como o estudo de Servlets/JSP é importante para o aprendizado de frameworks web como JSF, Struts, Vraptor etc. Especialmente quando precisamos desenvolver alguns projetos de pequeno porte, onde não é necessário utilizarmos esses frameworks de grande porte. Espero que tenham gostado do post! Até o próximo post então!

terça-feira, 2 de agosto de 2011

Servlet Listeners - Listeners de Sessão - Parte 1

Olá Javeiros! Continuando a nossa sequência de posts sobre listeners (aqui tá o primeiro e aqui o segundo) hoje vamos começar a falar sobres os listeners de eventos de sessão. Vamos dividir o assunto em duas partes pois nós temos 4 interfaces para os listeners de sessão.

Antes de mais nada é importante que você saiba o que é uma sessão. Como o foco do post não é esse, não espere nenhum compêndio sobre o assunto aqui, quero apenas lembrar o conceito para aqueles que já viram algo sobre isso. Você nunca estudou o que é uma sessão http? Então é melhor você clicar aqui e dar uma estudada primeiro.

O protocolo HTTP é considerado um protocolo stateless, isso significa que cada requisição que é feita ao servidor é sempre uma novidade. Lembra do filme "Como se fosse a primeira vez"? Pois é, depois que o servidor recebe a requisição e envia a resposta ele jamais lembrará o que tinha nessa requisição. Bom, mas isso é porcaria não? É, realmente seria se não fosse o conceito de sessão http. Uma sessão http nada mais é do que a identificação das requisições de um usuário, como o protocolo http não armazena o estado das requisições, os  clientes enviam algo nela para que servidor saiba que aquela requisição foi feita pelo usuário A e não pelo B. Essa informação é o session ID.

Existem basicamente duas maneiras de implementar o controle de Sessão em uma aplicação Web Java:  através de Cookies ou da reescrita de URLs. A API de Servlets suporta as duas formas e o melhor é que o processo de controle é totalmente automático para o desenvolvedor. Cookies podem ser desabilitados pelo cliente, sendo assim, quando não for possível utilizar esta técnica, os Servlets poderão reescrever as URLs adicionando a elas o nosso Session ID.

A criação de uma Sessão pode ser feita a partir da chamada ao método getSession. Este método retornará a sessão que está associada à requisição atual, caso não exista, uma Sessão nova é criada. Você pode passar um booleano como parâmetro caso deseje decidir criar ou não uma nova sessão.

HttpSession session = request.getSession( ); 

Depois que um sessão é criada, toda requisição feita entre cliente e servidor carregará o session ID. A partir daí precisamos definir o tempo de duração de uma sessão e quando destruí-la, já que não há como saber se o cliente não está mais 'ativo'.

Encerrando uma Sessão

Existem duas formas de encerrar uma sessão, através da definição de um tempo máximo de inatividade setMaxInactiveInterval ou através da chamada ao método invalidate, os dois métodos estão presentes na interface HttpSession. É possível também configurar o tempo máximo através de um parâmetro no arquivo web.xml da aplicação, conforme pode ser visto abaixo:

 <session-config>
   <session-timeout>30</session-timeout>
 </session-config>

Vale apenas ressaltar que o tempo definido através do método setMaxInactiveInterval é em segundos, enquanto no web.xml é em minutos.


HttpSessionListener


A API de Servlets permite que interceptemos o momento em que uma sessão é criada ou destruída. Para isso precisamos criar um Listener de Sessão através da implementação da interface javax.servlet.http.HttpSessionListener. Essa interface possui 2 métodos que serão chamados sempre que uma sessão for criada, sessionCreated, ou destruída, sessionDestroyed. Por último a classe precisa ser configurada no web.xml para que o container possa chamá-la. A API 3.0 de Servlets permite a utilização de annotations na classe Listener, eliminando a necessidade do mapeamento no web.xml.
A seguir temos um exemplo de uma classe que implementa HttpSessionListener utilizando anotações.




Caso você não esteja usando a nova versão de Servlets, você deve mapear o listener no arquivo web.xml da aplicação:

 <listener>
   <listener-class>30</listener-class>
 </listener>


No próximo artigo iremos falar sobre sobre os outros Listeners de Sessão (Activation, Binding e Attribute).
Até o próximo post!

quinta-feira, 23 de dezembro de 2010

Notebook CCE: Primeiras Impressões

Fala galera, recentemente adquiri uma nova máquina pois o meu bom e velho core 2 duo já não estava mais dando conta do recado. Gostaria de falar da minha primeira impressão sobre os novos Notebooks da CCE. Ah, só pra registrar, o meu note anterior também era um CCE.

Bom, comprar um Notebook hoje em dia é um grande desafio, isso porque você tem um zilhão de opções pra escolher e normalmente os preços não variam muito. Os mais conservadores não irão pensar muito, vão correr pras marcas consagradas do mercado como: Dell, Hp, Sony, etc. Eles estão errados? De modo nenhum! Isso se chama: NÃO ARRISCAR! Bem, mas diz o velho ditado: Quem não arrisca não petisca. E por causa disso eu prefiro arriscar sim! Vou contar-lhes o motivo porque comprei novamente um notebook CCE (só lembrando: eu não estou ganhando porcaria nenhuma pra falar da CCE, apenas estou relatando a minha experiência como cliente desta empresa tupiniquim).

Quando eu resolvi comprar meu primeiro note em meados de 2008 e disse que ia comprar um CCE, quase fui massacrado pelos meus coleguinhas....Foram várias piadinhas do tipo: Ha, CCE é? Começou comprando errado... e outras coisas que o valham... mas como valente e destemido que sou, não dei ouvidos à concorrência..rs. O meu core 2 duo era o que precisava em termos de configuração na época e posso garantir que economizei uma grana boa! 

Críticas à primeira versão CCE

O primeiro notebook CCE que comprei tinha suas vantagens (core 2 duo, 2GB de RAM, 120 GB HD). Minhas única crítica era com relação à placa de vídeo, uma vagabunda SiS que não rodava nem campo minado! Bom, mas eu não me importava com isso naquela época, então posso dizer que ele me serviu bastante. O acabamento era bom, com exceção do Pad do mouse, e especifamente comigo tinha um rangido quando fechava a tela, que com o tempo parou. Foram dois anos de uso intenso e ZERO de problemas, nada dele parou de funcionar! Ponto pra CCE!

Novas versões com processadores core i

Agora resolvi comprar outro notebook. Escolhi o T546P+ da CCE. Muita coisa melhorou nessa versão. O problema da versão anterior, a placa de vídeo, foi resolvido. A CCE colocou uma Intel HD, que é a mesma placa que vem nos notebooks da Dell, não é uma monstruosidade, mas com relação à versão anterior parece até piada comentar. O acabamento foi melhorado, agora vem todo em black piano e com um teclado teclado mais moderno e muito melhor de digitar, com teclas mais espaçadas e mais sensíveis ao toque. Ponto pra CCE. A tela também foi melhorada, agora é de LED, pra aproveitar ainda mais a qualidade HD da placa de vídeo, com câmera e vem com saída HDMI. Ponto também! Não foram miseráveis com memória (4 GB) e nem com HD (640 GB o.O), outro diferencial foi a versão do Windows que veio junto: Windows 7 Home Premium (a maioria traz no máximo a Basic) e o Norton Security por 1 ano. A bateria está de parabéns! Fiz um teste e ela durou 2:30 horas de uso intenso! Ah, ainda vem com uma mochila Targus! CCE Wins!

O que eu não gostei?

O Pad do mouse continua uma porcaria, o acabamento black piano é show, mas não precisava colocar ele no Pad do mouse né? Fail aqui. As conexões estão todas na lateral, se você conectar coisas na USB fica um trabolho só, mas não é tão crítico. O cooler é barulhento e roda o tempo todo, vamos dar uma colher de chá aqui, afinal de contas é um core i5 e deve esquentar pra caramba.

Conclusão

Se você estiver pensando em comprar um Notebook com uma boa configuração, mas que o propósito não seja jogar eu recomendo fortemente comprar um CCE, você vai economizar bastante e vai ter uma boa máquina com uma boa durabilidade e de uma empresa nacional! 


Notebook CCE, ótimo preço, ótima configuração.

terça-feira, 14 de dezembro de 2010

Rest with Jersey: Creating a Restful zip download funcionality.

It's very simple create RESTFul Web Services with Jersey. I'll demonstrate how to create a simple one that provide a dowload of a compressed file. 

First, let's see how to compress a file in Java. If you wanna learn more about, then click here. I use ZipOutputStream because I wanna send the zip file through OutputStream provided by Servlet Response object, but you can send an existent zip file if you prefer. So let's go to the code:


This method is quite simple, It just writes the File parameter inside the ZipOutputStream, that encapsulates our OutputStream, I didn't close the Stream because I wanna compress several files.
Right now let's see how to create our Rest class:























The main points are the annotation @Produces and the header Content-Disposition. The first one is used to specify the MIME media types of representations a resource can produce and send back to the client, in our example we will send a zip file back to the client. The header Content-Disposition allow us to set the file name for the client, if you don't wanna use it the file name will be the same of the rest method name.

After add all desired files we need flush and close the stream and return an 'ok' response, if something goes wrong we send an INTERNAL_SERVER_ERROR status response. When the user requests the resource (like this: http://localhost:8084/jersey-sample/resources/downloader/downloadall/ he will receive a zip file to download and the suggested name will be the same configured in the header Content-Disposition.

It's just for now. Until the next post.

quarta-feira, 30 de junho de 2010

Tomcat 7 foi lançado! Vejas as novidades.

 A apache lançou oficialmente a versão 7 do tomcat, que recentemente completou 10 anos de criação, o que faz dele um projeto bastante maduro, apesar de apenas 7 versões. No mundo open source é comum não termos milhares de versões, afinal de contas esse negócio de mil versões tem um apelo meramente comercial.
Vale a pena conferir a nova versão, que já oferece suporte à especificação de servlets 3.0 e jsp 2.2. Veja aqui tudo que mudou nessa versão e se quiser degustar a versão é só fazer o download aqui.

sábado, 22 de maio de 2010

Custom Tags: Exemplo Rápido

Fala javeiros! Neste post iremos ver um dos assuntos mais chatos complexos da prova de SCWCD: Custom Tags. E não tô falando de usar JSTL não... a gente vai aprender como construir nossa própria JSTL (guardadas as devidas proporções claro).
Neste primeiro post não vamos falar muito. Queremos que você, leitor, veja todo o processo de construção de uma custom tag. Não fiquei preocupado por não entender quase nada das tags, atente apenas a sequência da construção. Espero que gostem do post! Hands on!

A construção de custom tags envolve basicamente 3 passos:

  1. Criar uma classe que implemente a interface Tag ou estender uma de suas implementações da API.
  2. Criar um arquivo .tld que definirá a sua tag.
  3. Mapear a tag no descritor da aplicação (web.xml).
Para o nosso exemplo iremos construir uma tag que mostra a data atual no formato dd/mm/yyyy hh:mm:ss. É um exemplo bem simples, porém perfeitamente extensível e didático.

Para o primeiro passo nós iremos utilizar a classe javax.servlet.jsp.tagext.BodyTagSupport. Esta classe é fornecida pela própria API e facilita bastante o trabalho de construção de tags, bom mas isso não nos interessa no momento, o importante é saber que temos que estedê-la. 
Na figura abaixo podemos ver a implementação da nossa classe principal.























Para o segundo passo iremos definir a nossa tag no arquivo mytags.tld.
Veja como fazer isso na figura abaixo:

















Por último, temos que mapear a nossa tag no arquivo web.xml de nossa aplicação.














Pronto! Nossa primeira tag foi construída. Simples, não? Apesar de ser chamada de Simple Tags, construir tags não tem nada de simples, são muitas classes e interfaces possíveis de estender, o retorno dos métodos é feito através de constantes (chato de memorizar) e sem contar que temos que criar um arquivo xml e alterar o descritor e cada um com várias possíveis tags para memorizar. Mas temos que estudar né, fazer o que.
Em posts seguintes veremos mais detalhes sobre a construção de tags, agora pra terminar de vez este post, vejamos como fica a nossa tag em uma página JSP e qual o seu resultado após a execução da página.





Ao executar esta JSP devemos obter um resultado parecido com o abaixo:

Hoje são 22/05/2010 14:58:30
Até o próximo post!

sábado, 15 de maio de 2010

Servlet API: Utilizando parâmetros de incialização

Olá Javeiros! Dando continuidade ao nosso estudo para a certificação SCWCD veremos neste post rápido como fazer para utilizar parâmetros de inicialização em nossa aplicação e também em um Servlet específico.

É possível adicionar parâmetros que são acessíveis por toda a aplicação. Muitos frameworks web fazem uso desse recurso. Digamos que a aplicação necessite enviar um email para o administrador reportando erros, se colocarmos o email do administrador no código da aplicação e este email sofra alguma mudança, será necessário gerar um novo arquivo de deploy da aplicação. Este problema pode ser resolvido adicionando um parâmetro de inicialização no arquivo descritor (web.xml), e dessa forma ele estará disponível para toda a aplicação.

Digite o trecho a seguir entre as tags web-app do seu arquivo descritor. 


A API de Servlet disponibiliza, através da interface ServletContext, métodos para acessar os parâmetros de inicialização. Existem dois métodos para tal:

  • Enumeration getInitParameterNames: Este método retorna uma enumeration contendo todos os nomes de parâmetros disponíveis no web.xml. Ele é muito útil quando não se sabe o nome do parâmetro.
  • String getInitParameter(String name): Este método retorna o valor (param-value) do parâmetro de inicialização. Vale lembrar que sempre é retornado uma String e nunca outro tipo como Integer, Long, etc.
No trecho de código abaixo podemos ver o uso desses métodos a partir de um servlet.


Quando o servlet for acessado ele irá exibir todos os parâmetros de inicialização disponíveis.
É possível também criar parâmetros de inicialização para Servlets, a diferença é que estes serão visíveis somente para os servlets onde foram declarados. O conceito é basicamente igual ao anterior, porém devemos atentar para as tags que criam cada um deles. No exemplo anterior nós colocamos a tag context-param na raiz do nosso descritor, já para os parâmetros de servlets iremos utilizar a tag init-param e esta deve ser declarada sobre a tag servlet (tag de declaração de um servlet).

O trecho abaixo mostra a criação de um parâmetro para um Servlet.









Veja que a única diferença para o exemplo anterior é a tag init-param. Outra mudança também é na forma como o parâmetro é acessado. Na verdade a mudança é no objeto em que ela é acessado, não mais o ServletContext e sim o próprio Servlet.

Vejamos abaixo o código que acessa os parâmetros do servlet:












Observe que o método getInitiParameterNames é chamado diretamente de Servlet e não mais do contexto como no exemplo anterior.

Então é isso pessoal. Espero que tenham gostado do post! Até o próximo então.

domingo, 9 de maio de 2010

Servlet Listeners - ServletContextAttributeListener

Olá Javeiros! No post anterior começamos a falar sobre servlet listeners. Vamos continuar a série e agora falaremos sobre o listener de atributos de contexto ou ServletContextAttributeListener. Este listener é notificado quando algum atributo é adicionado, removido ou alterado no contexto da aplicação.
A criação deste listener é semelhante ao criamos anteriormente. Teremos que implementar a interface java.servlet.ServletContextAttributeListener e seus três métodos:

  • void attributeAdded(ServletContextAttributeEvent): este método é chamado automaticamente sempre que um atributo for adicionado no ServletContext e através do objeto ServletContextAttributeEvent podemos obter informações como: o nome do atributo adicionado, o seu valor, o objeto em que o evento inicialmente ocorreu e ainda o próprio ServletContext.
  • void attributeRemoved(ServletContextAttributeEvent): este método é chamado sempre que um atributo for removido do contexto.
  • attributeReplaced(ServletContextAttributeEvent): é chamado sempre que um atributo tiver o seu valor alterado.
Vejamos um exemplo prático onde exibimos o nome de atributo e o seu valor para cada evento.















A configuração do listener é feita da mesma forma que anterior. Vale lembrar que não é possível declarar várias classes listener dentro da tag , é preciso criar um conjunto pra cada listener, como vemos abaixo:










Aprendemos mais um listener hoje! Boa sorte nos estudos e até o próximo post!

sábado, 8 de maio de 2010

Servlet Listeners - ServletContextListener

Olá Javeiros de plantão! Continuando nossa sequência de posts sobre o exame para SCWCD vamos falar hoje sobre Servlet Listeners. O exame requer que o candidato saiba criar e configurar listeners para os escopos do ciclo de vida de uma aplicação, listeners de atributos e também serem capazes de escolher um filtro apropriado para um determinado cenário. Iremos ver como funcionam os listeners cobrados no exame. Neste artigo falaremos especificamente do listener de contexto (criação ou destruição).

Suponhamos que uma aplicação web necessite de alguns recursos para que esta possa funcionar corretamente. É importante que estes recursos esteja disponíveis assim que a aplicação esteja no "ar", mas como saber se aplicação já foi carregada pelo container? E como garantir que os recursos serão liberados após a aplicação ser desativada? Para resolver o problema descrito neste cenário a API de Servlet disponibiliza um listener de contexto. Através dele e possível sabermos o momento em que a aplicação está sendo carregada ou destruída.

O processo de criação de um listener resume-se basicamente em implementar a interface do listener desejado e fazer a configuração do mesmo no descritor da aplicação (web.xml). Para esse primeiro post iremos utilizar a interface javax.servlet.ServletContextListener. Esta interface deve ser utilizada para a criação de listeners de contexto e ela possui dois métodos que devem ser sobrescritos pela classe implementadora. Os dois métodos são:
  • void contextInitialized (ServletContextEvent): Este método é executado no momento em que a aplicação é carregada pelo container, através do parâmetro ServletContextEvent, que é injetado automaticamente pelo container, é possível obter o objeto ServletContext, onde poderemos adicionar, remover ou capturar atributos ou fazer a leitura de parâmetros de inicialização. ATENÇÃO: este método só é chamado UMA ÚNICA vez durante o toda a vida da aplicação.
  • void contextDestroyed (ServletContextEvent): Este método é executado no momento em que aplicação está sendo destruída (parada) pelo container. Assim como o método de inicialização este método também só é executado uma vez.
Abaixo temos um exemplo simples de como criar um listener de contexto. No nosso exemplo apenas adicionamos um atributo contendo o momento em que aplicação subiu e podemos usar este atributo para saber quanto tempo a aplicação ficou ativa. O exemplo não é dos melhores, mas você aprenderá com ele que é capaz adicionar atributos que serão visíveis por toda a aplicação no momento seguinte à subida da mesma. Quando a aplicação for destruída o sistema irá exibir uma mensagem contendo o tempo total em segundos que a aplicação ficou no ar.

Primeiramente vamos criar a classe que irá implementar a interface ServletContextListener e vamos também implementar seus dois métodos:












Agora precisamos configurar o nosso listener no arquivo descritor da aplicação, que é o arquivo web.xml da aplicação. Vejamos abaixo como configurar o nosso listener.









A configuração de um listener é bastante simples e resume-se em declarar a classe que implementa a interface de listener. A aplicação irá carregar os listeners na ordem em que eles aparecerem no arquivo web.xml.
Espero que este post seja útil de alguma forma pra você! Até o próximo post!

domingo, 2 de maio de 2010

Criando funções JSP com EL

Galera, pra quem vai tirar (ou não) a certificação SCWCD 5.0, um dos objetivos do exame é saber se o candidato sabe criar funções com EL (Expression Language) para serem usadas em suas páginas JSP. A criação de funções EL serve para que você pense duas vezes antes de usar os malditos scriptlets em suas páginas JSP (sério, não faça isso por favor).
O processo envolve basicamente quatro passos:
  1. Criação de uma classe Java que conterá os métodos que você irá utilizar nas suas páginas JSPs.
  2. Criação do arquivo tld (Tag library descriptor) que conterá o mapeamento entre o método Java e sua versão XML.
  3. Mapeamento da sua tld no web.xml (isso é opcional... mas é legal utilizar)
  4. Declaração da taglib na sua página JSP.
Vamos criar um exemplo simples para explorar os passos acima. Criaremos uma função que calcula a raiz quadrada de um número. Mãos à obra.

Passo 1: Vamos criar uma classe chamada functions.MyMath e nela vamos criar um método square que será responsável pelo cálculo da raiz quadrada. Precisamos de alguns cuidados neste momento. A especificação diz que esta classe deve ser pública e os métodos que serão acessados pelas páginas JSPs devem ser públicos e estáticos. Dito isto, vejamos como ficou a nossa classe:

Passo 2: Vamo criar o arquivo tld. Este arquivo permitirá o mapeamento entre o nosso método java uma função XML que a EL possa executar (EL não permite a invocação de métodos Java). Uma observação importante é que caso o arquivo tld esteja sobre o diretório WEB-INF da sua aplicação ele é automaticamente reconhecido por ela, caso esteja em outro lugar você terá que fazer o passo seguinte.

Eu odeio quando as coisas não seguem um padrão nesses malditos arquivos xml... deixando a ira de lado, notem que o atributo que mapeia o nome da função não é function-name (o que faria muito mais sentido) e sim name, ele será usado para chamar de fato o nosso método java, você não precisa colocar o mesmo nome do método, mas fica melhor dessa forma. Outras dicas importantes são que em function-class deve ser colocado o nome completo da classe (com o pacote, conhecido como full qualified name) e em function-signature os tipos do retorno e da entrada devem ser também completos. Você pode usar todos os tipos básicos de Java e incluindo os wrappers sem necessidade de importação nas páginas JSP, caso não seja um desses tipos você terá que fazer a importação.

Passo 3: Este passo é opcional caso o seu arquivo tld esteja sobre o diretório /WEB-INF da aplicação, mas eu recomendo fortemente que você o faça. Por quê? Bem, digamos que um belo dia você resolve mover ou mudar o nome do arquivo... imagine só ter que sair alterando todas as páginas JSPs que fazem uso do arquivo... chato né? Então largue a preguiça de lado e coloque o conteúdo abaixo no arquivo web.xml:


Passo 4: Por fim precisamos declarar nossa função na página na qual desejamos chamá-la. O processo é bastante simples, principalmente se você já tiver utilizado JSTL. Vejamos como fica a nossa página JSP:


Se você fez tudo direitinho, ao executar a página acima será exibida a mensagem "A raiz quadrada de 25 é 5.0". Uma última coisa a dizer é sobre o argumento uri, apesar de ele está no formato absoluto (com protocolo etc) isto não significa que a JSP irá tentar acessar este endereço, apenas ela irá procurar no descritor (web.xml) se alguma taglib declarada ali combina com esta uri informada).

Bom galera, isso é tudo! Espero que tenham gostado da dica e até o próximo post!

sábado, 28 de novembro de 2009

Dica 4: Empacotando uma aplicação em um Jar

Uma das dificuldades que os programadores de linguagem RAD tem quando vem para o Java é com relação ao tal do 'executável'. Quando você cria um programa em Java não é gerado um arquivo .exe como na maioria das linguagens. Em java dizemos que uma classe é executável se ela tiver um método main ou ainda se ela for um applet o método init. O processo de criação de executável se chama: empacotamento da aplicação. Que é exatamente colocar a aplicação dentro de um arquivo de extensão .jar. Nesta dicas vamos ver como fazer para empacotar uma aplicação Java.
Vamos supor que nossas classes estão em uma pasta chamada HelloWorld e nela temos uma classe chamada HelloWorld.java e seu bytecode compilado HelloWorld.class. Esta classe simplesmente exibe uma mensagem de boas vindas pro usuário.
Outra coisa importante para um arquivo .jar é o arquivo de manifesto. Esse arquivo vai fornecer informações importantes para a execução do programa como classpath e também a main class do seu programa. A partir do Java 6 temos um comando novo onde podemos informar diretamente no prompt qual é a main class da aplicação, basta então digitarmos isso:

jar cvfe HelloWorld.jar HelloWorld .*class

Se você viu algo como:

added manifest
adding: HelloWorld.class(in = 395) (out= 292)(deflated 26%)

Significa que deu tudo certo. Para executar o arquivo bastar dar um clique duplo nele (caso o Java esteja configurando corretamente no seu classpath do SO) ou pode ainda usar o comando abaixo que tem o mesmo resultado:

java -jar HelloWorld.jar

Você pode ver mais informações sobre arquivos .jar neste link. Um abraço e até a próxima dica.


domingo, 8 de novembro de 2009

Dica 3: Descompactando Arquivos Zip

Essa dica é baseada nos exemplos do deste artigo da sun. Lá você pode conferir outros exemplos em inglês. Não é algo comum, mas certamente muitas pessoas já precisaram descompactar um arquivo zipado em uma aplicação. Essa tarefa tornou-se mais fácil depois que o Java disponibilizou as classes do pacote java.util.zip.*. A leitura do arquivo zip é simples. Utilizamos a API de I/O do Java. Precisamos de um Buffer para leitura e um para escrita e também das classes ZipFile, que encapsula o arquivo Zip e a classe ZipEntry que encapsula um arquivo dentro do zip. A classe ZipFile fornece um método que retorna os arquivos que estão contidos dentro do zip, basta percorremos o enum e ler cada um dos arquivos. É possível ainda saber se o 'arquivo' que estamos lendo é um diretório através do método isDirectory, caso contrário deve ser utilizada uma outra abordagem (não mostramos aqui), com o Stream podemos então escrever os arquivos fora do zip.
Na imagem abaixo temos o código fonte de exemplo.


Até a próxima dica!

segunda-feira, 2 de novembro de 2009

Dica 2: Escrevendo em um arquivo com Java

Na dica 1 vimos como fazer pra ler um arquivo utilizando Java. Nesta dica veremos como escrever conteúdo em um arquivo.
O processo de escrita em arquivos é muito semelhante ao de leitura, basicamente as classes/interfaces que antes terminavam com Reader agora terminam com Writer. O uso buffer é opcional para o caso de escrita, pois a classe FileWriter fornece método para escrita de strings diretamente no arquivo (a classe FileReader só permite leitura em bytes).
O código abaixo mostra como escrever em um arquivo em Java.



É isso aí pessoal! Até a próxima dica.

domingo, 1 de novembro de 2009

Dica 1: Lendo Arquivo com Java

Salve javeiros de plantão! Depois de um tempão fora do ar por causa dos estudos, vamos voltando aos poucos a postar no javeiro.
Irei começar uma série de dicas rápidas em Java, ideal para aqueles que não querem perder tempo lendo um monte de coisa :D.
A primeira dica é como ler um arquivo em Java. A API de I/O do Java é bastante rica e também um pouco chatinha de trabalhar, são muitas classes que se combinam para executar tarefas. A cada versão nova do Java temos vista diversas melhorias nessas APIs.
O código abaixo mostra como fazer a leitura de um arquivo em Java.


Essa é uma das formas de ler um arquivo em Java. Espero ter ajudado. Até a próxima dica!

terça-feira, 10 de fevereiro de 2009

Usando os atalhos do Eclipse no Netbeans

Essa dica é muito boa para aqueles que desejam começar a usar o Netbeans mas estão acostumados com as teclas de atalho do eclipse, e que venhamos e convenhamos são uma verdadeira maravilha do eclipse ide. Você poderá usar a maioria dos atalhos do eclipse no Netbeans. É infelizmente não estão todos mapeados, mas para usuários iniciantes será como se eles estivem usando o eclipse, só que na verdade estarão usando uma ide melhor com os atalhos da anterior (vão me estrangular por esse comentário :D ).
Então vamos lá. Para isso acesse o menu Tools --> Options. Aí você verá a tela abaixo:



Em profile escolha: Eclipse. (tem várias outras opções se você quiser se divertir).
Prontinho. Agora é só usufruir dos benefícios da única IDE que você precisa com os atalhos da sua IDE anterior.
Até o próximo post!

sexta-feira, 30 de janeiro de 2009

Netbeans 7 disponível para download

Já está disponível o download da versão 7.0 do Netbeans. Ainda é um beta, mas pode ter certeza que vale a pena testar. As últimas versões da IDE que carregar o slogan: A única IDE que você precisa, vêm cada vez mais fazendo jus ao seu slogan. O Netbeans tem ganhado espaço entre os desenvolvedores Java, especialmente por sua grande gama de funcionalidades disponíveis, estabilidade e integração com diversos frameworks como: Jsf, Hibernate, Spring e etc. Em breve traremos mais novidades sobre a nova versão da IDE.
Enquanto isso você pode clicar aqui e começar a testar a nova versão, que está quentinha ainda!!!
Até o nosso próximo post!

quinta-feira, 29 de janeiro de 2009

Firebird + JPA e o Problema com o Generator

Resolvi fazer este post depois de muito sofrer para integrar o JPA com o Firebird. O grande problema que eu encontrei foi com o esquema de geração de ids do firebird. Firebird usa um esquema chamado de Generator, é muito parecido com esquema de sequences de bancos como oracle. Então vamos à solução do problema. Abaixo temos a nossa entidade Aluno, com as anotações do JPA. (omitimos os imports e os get/set, pois o foco é no generator.
@Entity
@Table(name="TB_BAIRRO")
@SequenceGenerator(name="GEN_TB_BAIRRO",sequenceName="GEN_TB_BAIRRO_ID")
public class Bairro extends BaseEntity {

@Id
@Column(name="BAIRRO_SEQ")
@GeneratedValue(strategy=GenerationType.AUTO,generator="GEN_TB_BAIRRO")
private Integer id;

@Column(name="BAIRRO_DSC")

private String descricao;

Definimos na classe qual é a sequence (no firebird Generator) que vai ser usada pra gerar a primary da key da tabela. O atributo name é importante pois ele vai ser usado, como pode ser visto acima, na anotação GeneratedValue, cuja strategy deve ser do tipo AUTO, e no parâmetro generator, informamos o nome que demos à nossa SequenceGenerator da tabela.
Até o nosso próximo post!

sábado, 29 de novembro de 2008

Operadores e Atribuições - Tabela de Precedência

Olá javeiros! Após um período longe do blog (estou estudando pra dois concursos e pra prova SCWCD) vamos tentar aos poucos voltar a escrever algum post no nosso blog. Assim que essa fase passar prometo que vou postar mais coisas aqui. Então vamos voltar ao Java!
Neste post vamos começar a estudar os operadores e atribuições em Java. Operadores são essenciais em uma linguagem de programação, e normalmente eles são semelhantes em todas as linguagens. Antes de vermos cada um deles, precisamos saber a precedência dos operadores. A precedência é importante quando temos uma expressão para ser executada. O resultado da expressão vai depender da precedência dos operadores. Veja na tabela abaixo a precedência dos operadores na linguagem Java:

OperadoresPrecedência
postfix
expr++ expr--
unário
++expr --expr +expr -expr ~ !
multiplicativo* / %
aditivo+ -
deslocamento<< >> >>>
relacional< > <= >= instanceof
igualdade== !=
bitwise AND&
bitwise exclusive OR^
bitwise inclusive OR|
lógico AND&&
lógico OR||
ternário
? :
atribuição= += -= *= /= %= &= ^= |= <<= >>= >>>=

Essa tabela embora pareça muito grande, na verdade é muito intuitiva. A maioria de nós já aprendeu pelo menos a precedência dos operadores matemáticos, que são maioria na tabela. No próximo post vamos estudar a maioria desses operadores. Não vamos estudar todos por que alguns foram retirados do exame 5.0 (ainda bem). Até o próximo post então!

sábado, 27 de setembro de 2008

Agora eu sou SCJP!!

Quero pedir desculpas pela minha ociosidade repentina mas é que eu estava na minha semana decisiva. Fiz a prova da certificação ontem e obtive 83% \o/. Acertei 60 das 72 questões, um resultado além do meu esperado. A prova estava bem tranquila mas é lógico que eu estudei pra caramba pra fazer. Então em breve estaremos postando novos artigos sobre a SCJP, agora que estou mais experiente vai ficar ainda melhor. um abraço e até o próximo post.