quarta-feira, 29 de abril de 2009

Por onde começar

Para quem está começando a estudar Flex espero poder ajudar com este post.

Algumas coisas que precisam ficar claras:
Flex não faz acesso aos arquivos da máquina (por questões de segurança, o AIR pode) e também não faz acesso direto ao banco de dados, o AIR consegue via SQLLite.
Resumindo, o Flex
é responsável pela parte view de sua aplicação, a parte que é mostrada para o cliente, o resto, regras de negócio, persistência, etc devem ficar na responsabilidade do server-side da sua aplicação.

Flex pode se comunicar com qualquer server:
Java, PHP, .Net, entre outros. As formas de comunicação são: HttpService (requisições http devolvendo xml, ou uma string, por exemplo, veja a propriedade resultFormat), WebService e RemoteObject, esta última na minha visão é a melhor.
Com RemoteObject você "liga" uma classe ActionScript com uma classe Java, por exemplo, trafegando entre as camadas client e server objetos e não xml. Para isso é necessário alguém que faça a serialização / desserialização entre as camadas, por ser binário a comunicação se torna mais rápida do que os outros métodos, para o Java temos o Adobe BlazeDS e o GraniteDS, para PHP temos o AMFPHP, para .Net o FluorineFX e o WebOrb.

Softwares necessários
Saiba o seguinte, o SDK do Flex com os componentes básicos é free, para você utilizar os gráficos e o AdvancedDataGrid comercialmente será necessário você comprar o IDE Flex Builder Professional.
Você pode ver as diferenças no link: http://www.adobe.com/products/flex/upgrade/
Você pode baixá-los aqui. Aqui o Flex Builder (FB) é uma cópia trial de 60 dias, (fica uma tarja nos gráficos e no AdvancedDataGrid), existe também a versão para estudantes sem a tarja mas que não pode ser utilizada comercialmente que pode ser solicitada aqui.

O FB se baseia no Eclipse 3.3, ele pode ser instalado como stand-alone ou como plug-in do Eclipse, esta última sendo preferível, já que pode-se usufruir de outros recursos do Eclipse como programação em Java.

Sites, documentação e cursos
Existe vários livros em inglês mas o único em português no momento é o Adobe Flex Builder 3.0 - Conceitos e Exemplos.

A própria Adobe disponibiliza uma documentação muito boa e completa no site: http://www.adobe.com/support/documentation/en/flex/

Entre os cursos cito:
ENG - PR, SP e DF
E-Genial - On-Line
TargetTrust - RS Ministrado pela
Gabriela Trindade Perry uma das moderadoras da Lista Flex-Brasil.

Tem também os sites recomendados do meu blog:
No da
DClick você poderá encontrar além do blog, demos mostrando algumas coisas que podemos fazer com o Flex.
Flex Examples com inúmeros exemplos úteis.
Fórum Flex Brasil e Lista Flex-Brasil duas fontes de ajuda e conhecimento, recomendo se cadastrarem.
Entre outros.

Abraços e bons estudos.

quinta-feira, 23 de abril de 2009

Servlet Filter

Servlet Filters é um recurso do Java EE para interceptar uma requisição web antes do recurso final ser atingido, este recurso pode ser um servlet, um arquivo, entre outros.

Filtros são muito úteis quando precisamos configurar o ambiente para o recurso a ser atingido, como por exemplo, abrir e fechar a sessão do hibernate (openSessionInView), verificar se o usuário está logado ou se tem permissão de fazer a requisição, permitindo ou não acessar o recurso.

Para usar Servlet Filter é necessário:

1. Criar uma classe que será utilizada como filtro pela sua aplicação. Esta classe precisa implementar a interface javax.servlet.Filter. Ex.: public class MyFilter implements Filter

2. Declarar sua classe filtro no web.xml da sua aplicação. Ex.:
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/restrito/*</url-pattern>
</filter-mapping>
3. Implementar os métodos init, destroy e doFilter da interface Filter.

É no método doFilter onde tudo acontece. Ex.:
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// Executado antes de ir para o servlet
JPAUtil.createEntityManager();
chain.doFilter(request, response);
// Executado após o servlet ser executado
JPAUtil.closeEntityManager();
}
Este método é executado toda vez que é realizada uma requisição a um recurso que se encaixa na
tag url-pattern configurada no web.xml.
Dependendo das validações realizadas você pode impedir que o recurso seja atingido, para isso é só não executar
chain.doFilter(request, response);
FilterChain chama o próximo recurso da sequência. Você pode ter mais de um filtro para o mesmo url-pattern ou um recurso chamando outro.

No web.xml você também pode espeficicar em quais situações o filtro deve ser aplicado, usando a tag <dispatcher>. Ex.:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
  • REQUEST: Quando o arquivo é acessado diretamente pelo navegador.
  • FORWARD: Quando o arquivo é acessado através de um forward de um servlet.
  • INCLUDE: Quando o arquivo é acessado através de um include do jsp (jsp:include).
  • ERROR: Quando o arquivo é um página de erro. Ex: <%@ page isErrorPage="true" %>

domingo, 19 de abril de 2009

FormattedInput

Estou lançando um novo controle.
Inspirado no meu controle anterior NumericInput (tanto que depende deste) e do MaskedTextInput, criei o FormattedInput.

FormattedInput auxilia em campos que só aceitam números preenchidos com zeros a esquerda, tais como: cep, cnpj, cpf, telefone. Na classe há algumas constantes para as entradas mais comuns, mas a propriedade inputFormat permite informar estas ou outras.

Como no NumericInput deve-se usar a propriedade value no lugar de text. Isto foi necessário para evitar o erro de estouro de pilha, pois imagine, é modificado a propriedade text esta por sua vez precisa formatar ela mesma ficando assim num loop perpétuo. Acho mais adequado setar os valores diretamente na propriedade text, mas no momento ficou mais prático criar a propriedade value, quem sabe numa próxima versão. E mesmo assim a propriedade value retorna um Number o que talvez seja útil dependendo da forma que o valor será persistido.

A alteração da propriedade inputFormat em runtime provoca a reformatação do valor.

O código fonte com exemplo pode ser baixado aqui. O fonte também se encontra na seção de arquivos da Lista Flex-Brasil, só que é disponível somente para os membros da lista.

sábado, 18 de abril de 2009

Criação dinâmica de objetos

Uma coisa que acho muito legal é a criação dinâmica de objetos.

Bem como isso funciona:
1. Fazer o import das classes que serão utilizadas.
import flash.net.registerClassAlias;
import mx.core.UIComponent;
import mx.containers.TitleWindow;
import mx.controls.TextInput;
import views.CadCliente;

2. Registrar as classes que você irá usar. O compilador "precisa" saber quais classes precisam ser compiladas. Para isso é necessário criar uma instância do objeto com new ou com registerClassAlias:

registerClassAlias
("views.CadCliente", CadCliente); // herda de TitleWindow
registerClassAlias("mx.controls.TextInput", TextInput);

Registrando as classes no aquivo que tem a tag Applicattion irá fazer com que possa ser criado objetos de forma dinâmica em qualquer parte do sistema.

3. Criação dinâmica.
import flash.net.getClassByAlias;
import
flash.utils.getDefinitionByName;

private function criacaoDinamica():void {
// var clazz:Class = getDefinitionByName("views.CadCliente") as Class; ou
var clazz:Class = getClassByAlias("views.CadCliente");

var window:TitleWindow =
TitleWindow(PopUpManager.createPopUp(this, clazz, true));

var clazzTI
:Class = getClassByAlias("mx.controls.TextInput");
var instance:UIComponent = new clazzTI() as UIComponent;

window.addChild(instance);
}

Em acréscimo dois métodos interessantes:
flash.utils.getQualifiedClassName e flash.utils.getQualifiedSuperclassName.
Os dois recebem um object como parâmetro e retornam uma string com o nome completo (pacote + classe) da classe (
getQualifiedClassName) e da sua classe pai (getQualifiedSuperclassName).

quinta-feira, 16 de abril de 2009

Bloco Static

No Java existe o bloco static:

static {
}

O bloco static é como se fosse um init, é o primeiro código que será executado quando se fizer referência a classe, com new ou acessando algum método static. Dentro do método estático só pode ser acessado atributos e métodos também estáticos.

No AS3, se tem algo parecido:

public class Classe {
metodoStatic();
trace("class criada");

public static function metodoStatic():void { }
}

AS3 permite incluir no corpo de uma classe não somente declarações de atributos mas também comandos que serão executados somente uma vez. É executado primeiro a declaração de atributos e depois os comandos encontrados no corpo da classe. E estes comandos como no Java só podem acessar atributos e métodos também estáticos.

terça-feira, 14 de abril de 2009

Último dia do mês

Esta é simples mas bem útil.

Em muitas linguagens existe um construtor como Date(ano, mês, dia), então o mais prático é fazer o seguinte (código válido para AS3) para se obter o último dia do mês:


public function lastDay(source:Date):Date {
var retorno:Date = new Date(source.fullYear, source.month + 1, 1);
retorno.setDate(retorno.date - 1);

return retorno;
}

Mas lendo o post Working with Dates in AS3 do blog Amy's Flex Diary descobri uma forma mais enxuta:

public function lastDay(source:Date):Date {
return new Date(source.fullYear, source.month + 1, 0);
}

Estas duas formas evita o programador de fazer cálculos adicionais para saber se o ano é bissexto ou não.



domingo, 12 de abril de 2009

NumericInput

Estou disponibilizando um novo controle: NumericInput.
Este controle serve para a entrada de dados numéricos formatando-os conforme o locale: pt_BR ou en_US.

Criei este controle inspirado no controle do Fernando Incerti.

Características:
O NumericInput possue as propriedades: precision, useNegativeSign e useThousandsSeparator que são utilizadas para setar as propriedades homônimas do NumberFormatter que utilizo para formatar o valor digitado. Este NumberFormatter deixei public e bindable, caso seja necessário formatar um outro componente com as mesmas características do NumericInput. Qualquer alteração nestas propriedades dispara um evento.

Existe também a propriedade value que devolve um Number do valor digitado que também dispara um evento.

Deixei o método toNumber como público. Este recebe um Object e devolve um Number do Object.toString() com a mesma precision do NumericInput. Este método é um utilitário não alterando o valor do NumericInput.

A alteração do locale ou de qualquer uma das propriedades em runtime provoca a reformatação do valor atual.

Espero que seja útil para os amigos.
O código fonte com exemplo pode ser baixado aqui. O fonte também se encontra na seção de arquivos da Lista Flex-Brasil, só que é disponível somente para os membros da lista.