Skip to content

Categories:

Enviando dados para tela com VRaptor 3

Interessante a forma como o VRaptor 3 usa para incluir dados em uma VIEW. Na minha opinião, o Result acabou sendo uma forma bastante efeciente para inclusão de dados na VIEW, pelos simples fato de manter o Controller enxuto e objetivo.

A sua linearidade de inclusão de dados a serem mostrados ao usuário também facilita a codificação, quando antes era bastante “noioso” controlar o que eram dados de tela e como estavam sendo utilizados.

O método include do Result é bastante simples e extremamente compreensível o seu uso.

Abaixo os trechos de código exemplicando o uso.

Veja que fica a cargo do método a responsabilidade pela “montagem” dos dados a serem disponibilizados ao usuário. No JSP basta chamar os atributos conforme o nome dado no include, conforme o exemplo abaixo.

Posted in Code, VRaptor.

VRaptor # O que era Bom ficou ainda Melhor!

Bom, nada como o tempo para consolidar algo que veio para ficar, estou “falando” do VRaptor, framework brazuca que exemplifica que, dá sim para ser simples, objetivo e extremamente ágil para o desenvolvimento de projetos Web.

Tenho acompanhado de perto um colega entusiasta Ruby, que sempre está ali do meu lado fazendo pequenos trechos de códigos que se transformam em práticas soluções web num curto intervalo de tempo. Acho que foi isso que motivou a dar uma sacudida na poeira e ver como anda o meu querido VRaptor.

Há 2 anos atrás fiz alguns posts aqui no blog a respeito de boas práticas com o VRaptor na sua versão 2 e hoje percebo que o crescimento conquistado por ele é algo fenomenal!!! (Sim, eu gosto mesmo desse framework)

Abaixo um pequeno exemplo do que fiz a 2 anos atrás:

O mesmo exemplo na versão atual (3.1.3) mostra a diferença de código obtida:

Note que o método “caracteristicas” na versão 3 tem um retorno diferente dos que eram utilizados na versão 2, isso porque, agora o retorno de um método é tratado como um atributo da requisição, deixando o mesmo disponível na View(jsp).

Particularmente, eu achei essa estratégia/prática interessante, pois nos força a pensar de maneira simples e objetiva, sem a necessidade de uma quantidade razoável de atributos de saída, como era na versão 2. Dependendo do que tinha que ser renderizado na View, eram necessários vários atributos @Out, deixando a “Logic” um tanto quanto poluída.

Pretendo dar continuidade nas escritas por aqui a respeito do VRaptor, então, aguardem.

Posted in Code, VRaptor.

Rugby pedindo espaço

Para os que acompanham este humilde espaço virtual, queria deixar aqui um convite ou mesmo uma dica de um esporte que vem se destacando na mídia, ainda mais com a conquista do Brasil para sediar as Olimpíadas de 2016.

O Rugby para aqueles que tiram um tempo para conhecer, acaba conquistando suas atenções pela dinâmica do jogo e também por toda a mística existente dentro e fora do campo. Apesar de ser um esporte de alto contato, fora das quatro linhas ele tem como objetivo a integração de seus participantes, fomentando um espírito coletivo diferenciado dos esportes que estamos acostumados a acompanhar.

Atualmente estou participando de uma equipe gaúcha de Rugby: Novo Hamburgo Rugby Clube.

Para os interessados no assunto sugiro que acompanhem o blog do Terceiro Tempo disponível no portal ClicRBS. O espaço mantém atualizadas as notícias referentes ao esporte no estado.

Esse post é algo breve, mas espero estar divulgando ainda mais o esporte por aqui.

Posted in Geral.

Gerando aplicação com VRaptor3 usando Maven

Algum tempo sem atualizar as coisas por aqui, resolvi tirar um tempo para me atualizar no framework que acompanho já faz algum tempo, VRAPTOR.

Ultimamente tenho utilizado o Maven para controlar as dependências de Jar’s das aplicações que trabalho, e tem me ajudado bastante. Então resolvi tirar um tempo para gerar um POM para o VRaptor, já que na estrutura original dele esse arquivo não o acompanha.

Utilizei o Eclipse com suporte ao Maven para gerar o projeto após ter gerado o POM do VRaptor.

Alguns passos para se ter sucesso na criação da estrutura:

1º – Faça o download do Vraptor e coloque o seu jar numa pasta qualquer.

2º – Instale o Maven ou utilize o recurso que está disponível em sua IDE.

3º – Execute o comando abaixo:

mvn install:install-file -DgroupId=br.com.caelum -DartifactId=vraptor -Dpackaging=jar -Dversion=3.0.0-SNAPSHOT -Dfile=LOCAL_ONDE_ESTA\vraptor3-3.0.0-SNAPSHOT.jar -DgeneratePom=true

4º – Edite o pom.xml do VRaptor que deve estar no repositório local [$USER_HOME\.m2\Repository\br\com\caelum\vraptor] com o seguinte conteúdo:

5º – Crie um projeto Maven.

6º – Edite o pom.xml do mesmo com o seguinte conteúdo:

7º – Clique com botão direito, opção Maven, update dependecies

Pronto, libs adicionadas ao projeto, tudo organizado para iniciar as atividades.

Post simples e direto. Dúvidas que surgirem, por favor comentem.

Posted in Code, VRaptor.

Produto ou cliente?

O que é mais importante: Produto ou Cliente?

Talvez para uma grande parte das pessoas que atuam no desenvolvimento de software o mais importante possa ser o produto. Sua concepção, estrutura (arquitetura), design e tudo mais que esteja vinculado ao mesmo. Existe também aqueles que buscam no desenvolvimento do produto a satisfação pessoal, onde cada pattern aplicado lhe proporciona momentos de satisfação, orgulho. Por um lado isso é muito bom, pois a qualidade interna do produto tende a ser muito boa, porém, a peça fundamental na construção desse produto está fora do computador, sim acredite. O Cliente é o objetivo final, é ele quem tem que se satisfazer ao “botar o olho” no produto e ter a sensação de que suas necessidades foram atendidas.

Estamos num processo de transição na área de desenvolvimento de software, onde não basta mais ser um bom programador, ter sua visão apenas no código ou estrutura da aplicação. É essencial que nós profissionais da computação temos o dever de buscar entender melhor o contexto do cliente, saber se comunicar de forma clara e coesa. Para isso é necessário mergulhar no dia-a-dia do cliente (interno ou externo), buscar fazer uso da mesma linguagem utilizadas por eles, facilitando entendimento do domínio.

Ferramentas de testes e design de código hoje fazem uso desse pensamento. Um exemplo disso é o Concordion utilizado para desenvolvimento de testes de aceitação.

O objetivo desse post é apenas para propiciar um momento de reflexão, de nada adianta nos escondermos no desenvolvimento de código, temos que colocar a cara para fora e buscar uma melhor comunicação e entendimento da real necessidade do cliente, pois no final, é ele quem vai dizer se o produto está ok ou não.

Posted in Geral, Workplace.

Apresentação Lean e Kanban – FTEC Caxias do Sul

Estive ontem a noite em Caxias do Sul na Semana acadêmica da FTEC em conjunto com meu colega de trabalho Eduardo Bobsin, fazendo uma apresentação sobre Lean Sofware Development e Kanban.

Tivemos um atraso em virtude do trânsito entre Porto Alegre até Caxias, mas no final foi tudo tranquilo.

Gostaria de deixar aqui o meu agradecimento para Profª Neiva Kuyven e o Profº Thiarlei Macedo, pela oportunidade de estarmos presentes no evento e quem sabe contribuindo um pouco mais no conhecimento das pessoas que estavam presentes.

Estou disponibilizando também a apresentação utilizada durante o evento.

Posted in Workplace.

Dica de leitura

Para aqueles que por aqui passam, fica aí uma dica de leitura.

Posted in Code, Geral.

Could not load the following font

Para aqueles que tiveram problema ou vem tendo problema para carregar uma fonte que não está sendo carregada pelo JasperReport, segue a dica.

Após algumas pesquisas no google encontrei uma que me ajudou a solucionar o problema, porém, ela não cheira muito bem, mas resolve de vez o problema.

Quando temos a seguinte exceção ao tentar gerar um PDF com o Jasper:


net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font:
pdfFontNAme    : ARIALBD.TTF
pdfEncoding    : Identity-H
isPdfEmbedded  : true

Basta fazermos o seguinte no Ireport:

- No campo “Nome da fonte no PDF”, basta adicionar o domínio da aplicação onde a fonte está disponibilizada. O local onde ela estará fica por conta do desenvolvedor, mas a mesma, tem que estar disponível na aplicação.

Abaixo uma print exemplificando a explicação.

Configurando fonte

Configurando fonte

Posted in Code.

Precisando inserir tudo upperCase no BD?

Nada como um bom projeto para colocarmos em prática detalhes que os frameworks nos oferecem.
Durante o desenvolvimento de um sistema que venho trabalhando surgiu a necessidade de fazer com que toda informação textual fosse inserida no Banco de Dados como “Caixa Alta”. Estamos utilizando o Hibernate para controle de persistência. Até então não tinha idéia em como fazer com que meus dados fossem alterados e inseridos no formato que eu deseja.

Troquei uma idéia com meu parceria Diego que deu a dica, “Cara, acho que tem algo no Hibernate que te possibilita fazer o que tu quer.” Olhamos a documentação e encontramos: Capítulo 12.2. Event system da documentação do Hibernate.

Bastava implementar uma interface disponibilizada pelo Hibernate, adicioná-la no Hibernate.cfg.xml e pronto, resolvido problema.

Segue então o código gerado:

Obs: dicas de melhorias são bem vindas.


public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException {
    Class objectClass = event.getObject().getClass();
    for (Field field : objectClass.getDeclaredFields()) {
        if (!field.isAnnotationPresent(Column.class))
            continue;
        if (field.getType().equals(String.class)) {
            try {
                Method getter = ReflectionUtil.findGetter(objectClass, field.getName());
                Method setter = findSetter(objectClass, field.getName(), String.class);
                String value = (String) getter.invoke(event.getObject());
                if (value != null) {
                    setter.invoke(event.getObject(), value.toUpperCase());
                }
            } catch (MethodInvocationException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}

Detalhe, podem ser implementados outros tipos de EventListener, basta verificar a API do Hibernate e selecionar aquela que melhor se encaixa com a necessidade.

No hibernate.cfg.xml, basta adicionar o seguinte trecho logo após os mappings.


No meu caso, estou executando sempre que houver um save ou update.

Fica aí a dica pessoal.

Posted in Code.

Dica de boa prática com VRaptor

Seguindo a caminhada no uso e entendimento do VRaptor, vou dedicar este post a um assunto trivial para desenvolvedores, Boas Práticas.

Após algum tempo de desenvolvimento com o VRaptor, o desenvolvedor vai perceber um detalhe, a quantidade de atributos que vão sendo utilizados em um Component. Claro isso depende do tamanho da aplicação e também a forma como desenvolvedor desenvolve a mesma.

A quantidade de atributos pode crescer bastante caso o Component possua vários métodos (Logic) que tratam as ações dentro da aplicação.

Detalhe importante, nada que vou descrever aqui é regra para o desenvolvimento de uma aplicação utilizando o framework, são apenas dicas ou melhor dizendo, boas práticas percebidas após um bom tempo de desenvolvimento com o mesmo.

Bom, o tópico abaixo foi o primeiro que identifiquei no desenvolvimento da equipe que coordeno e participo. É um detalhe simples, mas quando adotado pode melhorar em muito o desenvolvimento e os testes da aplicação, assim como tornar mais prático e rápido a produção da equipe.

Atributos com @Parameter ou Métodos com @Logic


Durante o desenvolvimento de uma aplicação pude perceber a grande quantidade de atributos que estava adicionando em meu Component(Controler), isso começou a dificultar a organização e controle em meio a programação e testes.

Sentindo esse desconforto decidi mudar a maneira de tratar atributos que são parâmetros vindos da JSP (VIEW).

Note, toda action de um formulário representa uma Logic de um Component, ou seja, tudo que estiver dentro desse formulário está potencialmente apto a ser um parâmetro para a Logic existente no action. Temos aqui um primeiro caso para verificar. Por exemplo:




Nome:
Região:
Tipo:
Descrição:

A seguir o Component que vai tratar as requisições:


@Component
public class PessoaLogic {

	@Parameter
	private Pessoa pessoa;

	@Parameter
	private Caracteristica caracteristica;

	public String addCaracteristica(){
		this.caracteristicaDao.save(this.caracteristica);
		this.pessoa.setCaracteristica(this.caracteristica);
		return "ok";
	}

}

Até aqui tudo bem, temos apenas dois atributos para um único método dentro do Component, mas façamos um refactoring para observar o quanto mais simples pode ficar.


@Component
public class PessoaLogic {

	@Logic (parameters = {"pessoa","caracteristica"})
	public String addCaracteristica(Pessoa pessoa, Caracteristica caracteristica){
		this.caracteristicaDao.save(caracteristica);
		pessoa.setCaracteristica(caracteristica);
		return "ok";
	}

}

Bem melhor, não? Outro benefício que vejo no uso da anotação @Logic está no entendimento do fluxo da Logic. Veja nesse pequeno trecho temos todas as informações necessárias para saber o que está sendo executado, diferente do primeiro exemplo de código, onde os atributos estão anotados com @Parameter e cedo ou tarde o usuário terá que navegar no fonte para verificar os atributos e a regra que está sendo aplicada dentro do método.

Imagine agora termos um novo método dentro desse Component.


@Component
public class PessoaLogic {

	@Parameter
	private Pessoa pessoa;

	@Parameter
	private Caracteristica caracteristica;

	@Parameter
	private Habilidade habilidade;

	public String addCaracteristica(){
		this.caracteristicaDao.save(this.caracteristica);
		this.pessoa.setCaracteristica(this.caracteristica);
		return "ok";
	}

	public String addHabilidade(){
		this.habilidadeDao.save(this.habilidade);
		this.pessoa.setHabilidade(this.habilidade);
		return "ok";
	}
}

Agora de novo, mudando para @Logic:


@Component
public class PessoaLogic {

	@Logic (parameters={"pessoa","caracteristica"})
	public String addCaracteristica(Pessoa pessoa, Caracteristica caracteristica){
		this.caracteristicaDao.save(caracteristica);
		pessoa.setCaracteristica(caracteristica);
		return "ok";
	}

	@Logic (parameters={"pessoa","habilidade"})
	public String addHabilidade(Pessoa pessoa, Habilidade habilidade){
		this.habilidadeDao.save(habilidade);
		pessoa.setHabilidade(habilidade);
		return "ok";
	}
}

Detalhe importante, a String utilizada dentro do parameters da anotação @Logic e o nome utilizado para o parâmetro do método, tem que ser o mesmo utilizado na JSP, senão os mesmos não serão carregados no momento do submit.

Essa anotação vale tanto para requisições GET e POST.

Por isso tenho abusado dessa anotação no desenvolvimento de aplicação que estamos realizando, e sinceramente, ficou muito mais prático e rápido para a equipe o uso da @Logic.

Posted in VRaptor.