quinta-feira, 5 de fevereiro de 2009

Criando componentes com JSF e Facelets

Olá pessoal,

Muita gente tem falado sobre a dificuldade de implementar componentes usando JSF. Resolvi então montar um pequeno tutorial sobre como criar componentes utilizando Facelets e JSF. Para o exemplo utilizei JSF com RichFaces e Facelets.

Para este exemplo estou considerando que seu projeto JSF já está configurado utilizando as tecnologias descritas acima.

A primeira coisa a ser feita é adicionar o seguinte trecho no arquivo web.xml.
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/facelets/facelets.taglib.xml</param-value>
</context-param>

Depois de definido no arquivo web.xml deve-se então criar o arquivo "facelets.taglib" assim como mostrado abaixo.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<facelet-taglib>
<namespace>http://facelets.bionexo.com</namespace>
<tag>
<tag-name>inputText</tag-name>
<source>../../taglibs/inputText.xhtml</source>
</tag>
</facelet-taglib>

Criamos então o arquivo inputText.xhtml assim como descrito abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jstl/core"
xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
xmlns:rich="http://richfaces.org/rich">
<ui:composition>

<c:if test="${empty required}">
<c:set var="required" value="false" />
</c:if>

<c:if test="${empty rendered}">
<c:set var="rendered" value="true" />
</c:if>

<c:if test="${not empty label}">
<c:choose>
<c:when test="${required}">
<h:outputLabel value="${label} *:" for="${id}"
rendered="${rendered}" />
</c:when>
<c:otherwise>
<h:outputLabel value="${label}:" for="${id}"
rendered="${rendered}" />
</c:otherwise>
</c:choose>
</c:if>

<h:panelGroup>
<h:inputText id="${id}" value="${value}" onkeypress="${onkeypress}"
onkeyup="${onkeyup}" onblur="${onblur}" required="${required}"
maxlength="${maxlength}" rendered="${rendered}"
readonly="${readonly}" disabled="${disabled}" />

<rich:message id="mensagem${id}" for="${id}" style="color:darkred;"
rendered="${(required or message) and rendered}" />
</h:panelGroup>
</ui:composition>
</html>

Note que utilizamos acima a taglib c para setar os valores default para as propriedades utilizadas no componente.

Para utilizar o componente então é simples. Basta primeiro importar a taglib que acabamos de criar com adicionando o seguinte trecho no início do nosso arquivo xhtml

xmlns:comp="http://facelets.bionexo.com"

E aonde queremos utilizar simplesmente chamamos o componente, assim como mostrado abaixo:

<comp:inputText id="razaoSocial"
label="#{msgs.campo_geral_razao_social}"
value="#{empresaBean.objetoPesquisa.dadosEmpresa.razaoSocial}"
maxlength="100" />
É isto aí pessoal. Boa sorte com os novos componentes e qualquer dúvida perguntem.

quinta-feira, 29 de janeiro de 2009

Dicas para a prova SCBCD 5.0 (CX-310-091)

Olá pessoal,

Ontem fiz a prova SCBCD para EJB 3 e felizmente fui aprovado. Segue abaixo algumas percepções sobre a prova e um guia de estudo para quem tem interesse na prova.

A prova realmente não é fácil e como todas as provas da Sun tem bastante pegadinhas. Como livro lí o Enterprise JavaBeans 3.0 (Editora O'Reilly) que realmente é muito bom, apesar de não ser focado na prova em si. O livro é bom inclusive para quem não tem interesse na prova.

Um outro otimo livro para estudo é o Mastering Enterprise JavaBeans 3.0 que se encontra neste link no site ServerSide.com.

Encontrei boas dicas no site http://faq.javaranch.com/java/ScbcdLinks#scbcd50 que acho que também devem ser lidas. Outro bom site que possui um resumo da prova é http://java.boot.by/scbcd5-guide/ e também é leitura obrigatória.

No mais é estudar muito e fazer alguns simulados. Segue abaixo uma lista de simulados que utilizei:
Utilizei apenas as versões demo, mas os mocks são ótimas opções para quem está estudando para as provas.

É isto aí pessoal. Espero que ajude.

quarta-feira, 28 de janeiro de 2009

Resultado da pesquisa sobre JSF

Olá pessoal,

Para não perdermos os resiltados das pesquisas realizadas resolvi criar um marcador para este tópico e colocar a imagem do resultado. Sobre a pesquisa sobre qual distribuição jsf é mais utilizada segue o resultado abaixo:














É isto aí pessoal. Em breve entrarão mais pesquisas.

[]s,

sexta-feira, 19 de dezembro de 2008

Máscara javascript para qualquer formato

Fazer máscaras em javascript é sempre chato e trabalhoso. Para cada máscara do sistema deve-se criar uma função javascript e utilizá-la no sistema. A algum tempo criei uma função javascript que funciona para a grande maioria das mascaras que são utilizadas no sistema. A função é mostrada abaixo:


/**
* Funcao de mascara. Esta funcao recebe como parametro o campo (this) no qual a
* mascara sera aplicada, o formato da mascara (99/99/9999), o conteúdo (1
* numeros, 2 letras e 3 letras e numeros) e o evento passa-se o this.
*/
function mask(campo, formato, conteudo, event) {

valor = campo.value;

var i, j;
var caracs = [ '.', '/', '-', ':', '(', ')', ',' ];
var auxPonto = formato;
var auxBarra = formato;
var auxHifen = formato;
var auxDblPonto = formato;
var auxAbrePar = formato;
var auxFechaPar = formato;
var auxVirgula = formato;
var tamanho = formato.length;
var posPonto = new Array(tamanho);
var posBarra = new Array(tamanho);
var posHifen = new Array(tamanho);
var posDblPonto = new Array(tamanho);
var posAbrePar = new Array(tamanho);
var posFechaPar = new Array(tamanho);
var posVirgula = new Array(tamanho);
var keyPress = event;

campo.maxLength = tamanho;

if (event.keyCode != 17) {
switch (conteudo) {
case 1: // Verifica se soh podem ser entrados valores numericos
if (!(event.keyCode >= 48 && (event.keyCode <= 57)))
event.keyCode = 0;
break;
case 2: // Somente Letras
if (!((event.keyCode >= 97 && event.keyCode <= 122)
|| event.keyCode >= 65
&& event.keyCode <= 90))
event.keyCode = 0;
break;
case 3: // Letras e numeros
if (!((event.keyCode >= 48 && event.keyCode <= 57)
|| (event.keyCode >= 97 && event.keyCode <= 122)
|| (event.keyCode >= 65 && event.keyCode <= 90)))
event.keyCode = 0;
break;
}
}

// ----------------------------- PEGA A FORMATACAO DA MASCARA
// ------------------
for (i = 0; i < tamanho; i++) {

posPonto[i] = auxPonto.indexOf('.');
posBarra[i] = auxBarra.indexOf('/');
posHifen[i] = auxHifen.indexOf('-');
posDblPonto[i] = auxDblPonto.indexOf(':');
posAbrePar[i] = auxAbrePar.indexOf('(');
posFechaPar[i] = auxFechaPar.indexOf(')');
posVirgula[i] = auxVirgula.indexOf(',');

auxPonto = auxPonto.substring(posPonto[i] + 1, tamanho);
auxBarra = auxBarra.substring(posBarra[i] + 1, tamanho);
auxHifen = auxHifen.substring(posHifen[i] + 1, tamanho);
auxDblPonto = auxDblPonto.substring(posDblPonto[i] + 1, tamanho);
auxAbrePar = auxAbrePar.substring(posAbrePar[i] + 1, tamanho);
auxFechaPar = auxFechaPar.substring(posFechaPar[i] + 1, tamanho);
auxVirgula = auxVirgula.substring(posVirgula[i] + 1, tamanho);

if (i > 0) {
posPonto[i] = posPonto[i] + posPonto[i - 1];
posBarra[i] = posBarra[i] + posBarra[i - 1];
posHifen[i] = posHifen[i] + posHifen[i - 1];
posDblPonto[i] = posDblPonto[i] + posDblPonto[i - 1];
posAbrePar[i] = posAbrePar[i] + posAbrePar[i - 1];
posFechaPar[i] = posFechaPar[i] + posFechaPar[i - 1];
posVirgula[i] = posVirgula[i] + posVirgula[i - 1];
posPonto[i] = posPonto[i] + 1;
posBarra[i] = posBarra[i] + 1;
posHifen[i] = posHifen[i] + 1;
posDblPonto[i] = posDblPonto[i] + 1;
posAbrePar[i] = posAbrePar[i] + 1;
posFechaPar[i] = posFechaPar[i] + 1;
posVirgula[i] = posVirgula[i] + 1;
}
}

// Retirando a máscara
for (i = 0; i < campo.value.length; i++) {
valor = valor.replace('-', '');
valor = valor.replace('(', '');
valor = valor.replace(')', '');
valor = valor.replace(':', '');
valor = valor.replace('/', '');
valor = valor.replace('.', '');
valor = valor.replace(',', '');
}

// Faz a validação se for apenas número
// utilizado para fazer a validação de Ctrl+V
if (conteudo == 1) {
if (isNaN(valor)) {
if (isNaN(valor.charAt(valor.length - 2)))
valor = "";
else
valor = valor.substring(0, valor.length - 1);
}
}

indicePonto = 0;
indiceBarra = 0;
indiceHifen = 0;
indiceDblPonto = 0;
indiceVirgula = 0;
indiceAbrePar = 0;
indiceFechaPar = 0;

// Varre o campo aplicando a máscara
for (i = 0; i < valor.length; i++) {
if (i == posPonto[indicePonto]) {
if (valor.charAt(i) != '.') {
if (i == 0) {
valor = '.' + valor;
} else if (i == valor.length) {
valor = valor + '.';
} else {
valor = valor.substring(0, i) + '.' + valor.substring(i);
}
indicePonto++;
}
}
if (i == posBarra[indiceBarra]) {
if (valor.charAt(i) != '/') {
if (i == 0) {
valor = '/' + valor;
} else if (i == valor.length) {
valor = valor + '/';
} else {
valor = valor.substring(0, i) + '/' + valor.substring(i);
}
indiceBarra++;
}
}

if (i == posHifen[indiceHifen]) {
if (valor.charAt(i) != '-') {
if (i == 0) {
valor = '-' + valor;
} else if (i == valor.length) {
valor = valor + '-';
} else {
valor = valor.substring(0, i) + '-' + valor.substring(i);
}
indiceHifen++;
}
}

if (i == posDblPonto[indiceDblPonto]) {
if (valor.charAt(i) != ':') {
if (i == 0) {
valor = ':' + valor;
} else if (i == valor.length) {
valor = valor + ':';
} else {
valor = valor.substring(0, i) + ':' + valor.substring(i);
}
indiceDblPonto++;
}
}

if (i == posAbrePar[indiceAbrePar]) {
if (valor.charAt(i) != '(') {
if (i == 0) {
valor = '(' + valor;
} else if (i == valor.length) {
valor = valor + '(';
} else {
valor = valor.substring(0, i) + '(' + valor.substring(i);
}
indiceAbrePar++;
}
}

if (i == posFechaPar[indiceFechaPar]) {
if (valor.charAt(i) != ')') {
if (i == 0) {
valor = ')' + valor;
} else if (i == valor.length) {
valor = valor + ')';
} else {
valor = valor.substring(0, i) + ')' + valor.substring(i);
}
indiceFechaPar++;
}
}

if (i == posVirgula[indiceVirgula]) {
if (valor.charAt(i) != ',') {
if (i == 0) {
valor = ',' + valor;
} else if (i == valor.length) {
valor = valor + ',';
} else {
valor = valor.substring(0, i) + ',' + valor.substring(i);
}
indiceVirgula++;
}
}
}

if (campo.value.length > tamanho) {
campo.value = campo.value.substring(0, tamanho);
}

campo.value = valor;
}


Segue abaixo um exemplo de como utilizar a função:




Para a máscara pode se passar qualquer mascara que possua os caracteres (ponto, barra, menos, dois pontos, virgula, e abre e fecha parenteses. Os valores que são passados entre os caracteres acima serão desconsiderados, então tanto faz colocar 999.999.999-99 quanto 111.111.111-11. Espero que esta máscara ajude vcs assim como vem me ajudando durante este longo período de desenvolvimento.

É isto aí pessoal. Qualquer problema mandem mensagem.

segunda-feira, 15 de dezembro de 2008

Palestra interessante no evento Maratona JBoss

Olá pessoal,

Fui em um evento a algum tempo aqui em SP e queria comentar sobre uma palestra que particularmente me chamou bastante atenção. Esta palestra foi sobre o JBoss Performance e foi ministrada pelo Bill Coutinho, funcionário da empresa Dextra.

Entre as principais lições da palestra posso listar as seguintes:
  • Por não saber aonde está os gargalos, nunca otimize cedo demais (Só a medição mostrará os gargalos).
  • Deve-se sempre fazer um paralelo entre a corretude versus a performance. (A corretude depende da aplicação. Para uma aplicação, ficar com dados antigos, pode ser um erro enquanto para outras pode ser tolerável desde que a aplicação fique mais rápida)
  • Escolhas sempre devem ser feitas. (Objetivos na sua grande maioria das vezes serão conflitantes como por exemplo, performance e segurança)
Foi falado também sobre as principais técnicas para o aumento da performance que podem ser:
  • Pool de recursos, como no exemplo do pool de conexões com o BD.
  • Caching, como no exemplo do cache de segundo nível do Hibernate (Neste caso deve-se analisar a corretude versus a performance)
  • Clustering como o exemplo do cluster do Jboss.
  • Melhorias nas configurações da JVM. (Evolução do Java 5 com o Ergonomics)
O evento em sí foi muito bom, mas gostaria de parabenizar o palestrante pela excelente apresentação. É isto aí pessoal.