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!