Showing posts with label JSF. Show all posts
Showing posts with label JSF. Show all posts

Saturday, March 09, 2013

Configurar um projeto web c/ JSF 2 no Maven

Mais um post relacionado a Maven, agora para quem pretende desenvolver um aplicação JSF.


A seguir um pedaço (principal) do pom.xml que define as dependências necessárias para utilizar o JSF 2.1:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>br.com.yaw</groupId>
  <artifactId>exemplo-jsf-maven</artifactId>
  <packaging>war</packaging>
  <version>1.0</version>
  <name>exemplo-jsf-maven</name>

  <dependencies>
    <!-- JSF 2 -->
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.1.11</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.1.11</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
    </dependency>

    <!-- EL -->
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>el-impl</artifactId>
      <version>2.2</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Pronto!

http://twitter.com/edermag
http://www.yaw.com.br

Thursday, September 02, 2010

A participação da YaW no TDC2010

Nos dias 20, 21 e 22 de Agosto aconteceu a 4a Edição do The Developers Conference, o TDC2010, evento de desenvolvedores para desenvolvedores, organizado pela Globalcode. Nesse ano a Globalcode inovou trazendo variedade de assuntos com 13 trilhas, em parceria com outras Empresas/Grupos/Profissionais Independentes, aumentando o "menu" tornando o evento completo a um valor simbólico. E de quebra com transmissão online, favorecendo principalmente o pessoal fora de SP.

O evento foi incrível, uma mistura fantástica de assuntos e comunidades em uma vibe bem interessante com muita troca de informação e networking, além da chance de rever vários amigos, quem foi sabe o que estou falando. Pra quem não foi pode ter uma idéia do que rolou nos diversos posts resumindo o que rolou no TDC2010.

Um detalhe que tornou nossa (eu e o Rafael Nunes) participação ainda mais especial é que esse foi a nossa primeira participação como YaW. Apoiamos e participamos de várias palestras em diferentes trilhas como ouvintes e palestrantes trocando um pouco de nossa experiencia com a galera. Outro ponto foi que no TDC2010 apresentamos mais 10 demonstrações, afinal evento de desenvolvedores nada melhor que código.

Na sexta logo após a abertura do evento, apresentei a primeira palestra da Trilha de JavaEE falando sobre a evolução do JSF, melhorias e o amadurecimento da versão 2.0 com a possibilidade de adotar suítes de componentes customizadas. Fiz demonstrações com as suites PrimeFaces, RichFaces e ICEFaces todas incorporadas ao ScrumToys. Na sequência o Rafael apresentou como desenvolver com JSF no Google App Engine.


A tarde, na Trilha de Spring, apresentei palestra falando sobre opções de desenvolvimento RIA com o Spring Framework junto com o Rafael. Comentei sobre o GWT, pontos fortes e fracos, e de como ele poderia ser integrado ao Spring em mais de uma opção de arquitetura com uma demonstração usando GwtRPCController. O Rafael demonstrou como é possível integrar Adobe Flex com Spring MVC.


Depois disso, na Trilha Mobile, assisti a palestra do amigo Fernando Ribeiro contando um pouco dos desafios e as oportunidades desenvolvimento BlackBerry para o mercado Corporativo com muito bom humor e riqueza de conteúdo, característico do Fribeiro. Ainda na trilha Mobile, no fim do dia, rolou um painel com representantes das principais plataformas mobile e o ponto de vista de cada um em relação a oportunidades e inovação.

Já no sábado pela manhã, assisti algumas palestras na Trilha de NOSQL, como leigo no assunto estou naquela fase de descoberta e novidades. Valeu muito para adquirir um pouco mais de conhecimento além de pegar várias dicas e referências para estudo. Depois do almoço, na Trilha Java, apresentei uma palestra sobre JavaFX partindo de um ponto de vista divertido, aonde destrinchei um jogo de Quebra-Cabeças aonde as peças são montadas dinâmicamente a partir de uma imagem. Não poderia faltar algo mais "corporativo", demonstrei um CRUD puro com JavaFX, um outro exemplo de CRUD usando JPA reaproveitando uma estrutura em Java e por fim um exemplo de integração com serviço na Web no Google App Engine acessado via REST.


Depois assisti uma ótima palestra sobre linguagens dinâmicas na JVM, onde fui apresentado ao Quercus uma alternativa de integrar PHP com Java, apresentado pelo Jefferson Prestes. Pra fechar o dia uma passada rápida na Trilha de Ruby, e mais bate-papo com amigos que encontrei no evento.

Já no Domingo não estive presente fisicamente acompanhei o TDC2010 pelo twitter. Aliás a hash #TDC2010 foi um sucesso no twitter, ficamos até no TrendsBR, um ótimo foto on-line do evento outra oportunidade para quem não foi acompanhar o que estava rolando!

O TDC2010 foi único, gostei a definição/analogia que o Jorge Diz fez aqui. Deixou saudades!


http://www.yaw.com.br
http://twitter.com/edermag

Friday, June 18, 2010

i18n de Portlets em JSF e JSP com JSTL

Existem várias formas p/ internacionalizar labels no desenvolvimento de Portlets, no post comento sobre 2 alternativas: básico com JSP e JSTL, outra opção é JavaServer Faces.

No caso de JSP e JSTL é só usar as tags fmt:setBundle e fmt:message da taglib de formatação, da mesma forma que uma aplicação web comum (sem portlets).

E o JavaServer Faces?

O mecanismo nativo de i18n do JSF funciona para portlets, é só definir os idiomas suportados no faces-config.xml, usar a tag f:loadBundle e por fim outputText e/ou outputFormat indicando o bundle e chave da label.


Em ambas alternativas, JSF ou JSP/JSTL, existe uma limitação: o title do portlet, que normalmente é definido no descritor portlet.xml, não se encaixa nos modelos de i18n descritos.

A solução é bem simples, no caso do JSTL a alternativa que encontrei foi apelar para a própria API de Portlets. No portlet.xml mapeio como title a chave que corresponde ao título no arquivo de i18n, já no código java do portlet sobreescrevo o método getTitle (herança de GenericPortlet) pegando a informação do xml e na raça acessando o bundle indicando a chave, o código seria próximo a esse:

portlet.xml
<portlet-app ... >  
  <portlet>
      ...
    <portlet-info>
      <title>meu.portlet.titulo</title>
    </portlet-info>
  </portlet>
  ...
</portlet-app>

messages_pt_BR.properties:
...
meu.portlet.titulo=Testando i18n em Portlet c/ JSTL
...

trecho do código java do Portlet:
protected String getTitle(RenderRequest request) {
    String key = super.getTitle(request);
    try {
      ResourceBundle bundle = ResourceBundle.getBundle("messages",
          request.getLocale(),getClass().getClassLoader());
      return bundle.getString(key);
    } catch (Exception ex) {
      //log4j
      log.error("Valor ["+key+"] (i18n) p/ titulo nao encontrado", ex);
      return key;
    }
  }


A solução no JSF é mais simples! Coloque a chave javax.portlet.title com o respectivo valor dentro do arquivo de i18n do aplicativo. Mas existe um macete, no portlet.xml também é preciso indicar o arquivo i18n e os idiomas suportados. A seguir um exemplo de como isso é feito.

messages_pt_BR.properties:
...
javax.portlet.title=Testando i18n em Portlet c/ JSF
...

portlet.xml
<portlet-app ... >  
  <portlet>
    ...
    <supported-locale>pt_BR</supported-locale>
    <supported-locale>en_US</supported-locale>
    <resource-bundle>messages</resource-bundle>
  </portlet>
  ...
</portlet-app>

Importante: Sobre o que foi descrito em relação a JSF, o portlet roda no JBoss Portal com JBoss Portlet Bridge.


http://twitter.com/edermag
http://www.yaw.com.br

Wednesday, May 05, 2010

Aprendendo JSF 2.0 com ScrumToys na JavaMagazine - edição 78

Já esta nas bancas a Java Magazine edição numero 78 com artigo (da capa) JSF 2.0: Aprendendo JSF 2.0 com ScrumToys escrito por mim e pelo Vinicius Nunes, instrutor da Globalcode de Floripa.

A proposta do artigo é comentar sobre as mudanças do JSF 2, mas além disso uma preocupação nossa foi colocar conteúdo para quem ainda não teve contato com a tecnologia, seja profissional experinte ou iniciante. É que o artigo ficou um pouquinho grande (rs).

Para mostrar a implementação dos recursos do JSF utilizamos os fontes do ScrumToys, criado justamente para o aprendizado na tecnologia.

No blog da Globalcode fiz uma experiencia, usei o PrimeFaces com JSF 2. Na realidade configurei o PrimeFaces no ScrumToys e utilizei o datatable, fácil, simples e funcionou perfeitamente!



http://twitter.com/edermag
http://www.yaw.com.br

Saturday, August 29, 2009

JSF e Portlets no JBoss Portal

Dias atrás estive envolvido em um "projeto case", com o propósito de experimentar a arquitetura de Portais e Portlets. O software portal escolhido foi o JBoss Portal versão 2.7, que além do Portlet Container possui elementos bem interessantes, como o modulo de CMS e Portlet Bridge.

É possível instalar o JBoss Portal em JBoss AS existente. Fiz isso na versão 4.2, a única configuração necessária no meu caso foi o datasource do portal, mas isso pode ser mais complexo dependendo de como esta configuração de bibliotecas do servidor! A documentação é boa, existem vários exemplos de portlet e o próprio fonte do portal - implementado sob JSF e Hibernate - de fácil customização.

Um recurso que me chamou a atenção foi o JBoss Portlet Bridge, que permitir criar portlets utilizando JavaServer Faces (v 1.2) + Seam + RichFaces, com suporte Facelets. Com isso é possível criar um aplicação composta por portlets com todos os benefícios do JSF, sem se preocupar com a API e curva de aprendizado de Portlet, PortletContainer e Portais.

Montei um aplicativo relativamente simples, utilizando Facelets + RichFaces c/ JBoss Bridge, gerenciado pelo JBoss Portal dentro do JBoss AS 4.2. Nessa estrutura a programação é a mesma de um aplicativo MVC comum, ou seja, criação de telas com Facelets usando as tags JSF e RichFaces, o Managed Bean resolvendo a integração do View com Model. Na camada model utilizei Pojos com Hibernate. O único portlet utilizado na aplicação foi o javax.portlet.faces.GenericFacesPortlet, e no JSF o ViewHandler org.jboss.portletbridge.application.PortletViewHandler.

Encontrei pequenos problemas nessa integração, principalmente com alguns componentes do RichFaces, mas todos foram revertidos. Acredito que mistura tenha funcionado justamente por todos os componentes serem JBoss.

Java EE define 2 especificações para portlet: JSR 168, JSR 286. O JBoss Portlet Bridge é um draft para outras 2 especificações a JSR 301 e a JSR 329 que visam padronizar a integração entre Portlet e JSF.

Wednesday, February 25, 2009

JEE c/ Produtividade

Já faz um tempo que me dedico (pesquisa + trabalho) na construção aplicações web em Java c/ produtividade e qualidade. Trabalho com JSF desde 2006, no início como qualquer tecnologia foi bem complicado, mas com o passar do tempo a "coisa" evoluiu.

Definindo o túnel tempo, nos primórdios tinhamos o Servlet para gerar o "html dinâmico", depois veio JSP com a flexibilidade de custom tags, que na verdade não pegou. O sucesso do Struts, Webwork, Spring MVC e outros, vem com a demanda de produtividade, qualidade e a experiência do mercado e da comunidade.

Depois de um tempo chegou o JSF, que na minha opnião traz conceitos bem interessantes, não só em padronizar o MVC mas tambem no apelo de componentes U(ser) I(nterface). Conceito adotado antigamente por ferramentas como Delphi (velhos tempos) e VB (.NET), com foco na produtividade. Fico com a impressão que JSF e JSP, numa abordagem inicial mais simples, não "alavanca" a tal produtividade.

Dos últimos 2 projetos que liderei com JSF, o primeiro usando JSP e o segundo c/ Facelets (xhtml), foi realmente notável aumento de produtividade e qualidade no 2 projeto. Alem dos templates, que trazem uma grande agilidade e reuso, o que mais me impressionou foi a simplicidade de criação de componentes, like tag file, que o Facelets prove. Inicialmente vc "perde" um tempo customizando os componentes, mas depois a agilidade acaba valendo muito a pena.

Alguns dos varios componetes que customizamos:
  • botões
  • colunas
  • colunas c/ links
  • links
  • datatable
  • modal message
Com o facelets o JSF realmente mostra seu poder de fogo!
Na Globalcode temos um ótimo mini-curso falando sobre o assunto, "JSF e Facelets um casamento perfeito".

Thursday, May 31, 2007

Jmeter com JSF

Quebrei um pouco a cabeça pra fazer o jmeter "testar" uma aplicação feita em JavaServer Faces. Esse site indicou o caminho das pedras... Mas mesmo assim precisei seguir alguns passos, pra resumir:

1º Criar um HTTP Proxy Server abaixo de WorkBench, configurar a porta e indicar o proxy no navegador. Este proxy deve rodar no server!

2º Ao requisitar uma pagina que passe pelo proxy, todos os dados enviados do client para o server são armazenados, como HTTP Request, com o respectivo método http e parametros enviados.

3º Ainda não é suficiente... Com as requisições na mão (na sequencia que foram solicitadas) é necessário criar XPath Extractor dentro da primeira request para descobrir qual o valor do controle de estado do faces, o "javax.faces.ViewState". Este cara é armazenado em um inputHidden em cada página. A query para descobrir o valor é //input[@id='javax.faces.ViewState']/@value. Além da query é necessário definir Reference Name, o qual valor será utilizado por outras request's um exemplo seria view.

4º Agora é o momento de usar a variável definida no XPath. Isso na segunda request feita para um mesma página (via post). Para isso é colocar o parametro javax.faces.ViewState com o valor ${view} na configuração do HTTP Request.

5º Por fim é necessário criar uma HTTP Cookie Manager abaixo do Thread Group, e nele adicionar um valor de cookie, neste caso o JSessionID. O name deve ficar com o valor jsessionid, um valor default e o domínio devem ser preenchido.

Depois é rodar o teste.

Monday, November 06, 2006

JSF and JS

Apesar de ser conhecer bem pouco de javascript, ñ posso negar que esse negócio faz coisas incriveis com informações no browser. Ultimamente tenho pesquisado um pouco sobre criação de telas mais "ricas" na web, e tenho visto coisas fantasticas com o bendito do javascript! Uma delas é o dojo, um framework bem legal de javascript, permitindo fazer verdadeiras macumbas de uma forma mais simples. Senão me engano parece que é a galera do google que manda neste negócio.
Achei mais legal ainda o esquema do Tomahawk ,conjunto de componentes e utilitários do JSF que a especificação ñ cobre, agora tem um componente que permite a carga das libs do dojo na page, facilitando bastante a vida. Se já ñ existe, é bem provavel novos componentes tomahawk utilizem na sua renderização o dojo, para facilitar a vida e trazer novos recursos visuais com html.

Saturday, October 21, 2006

JSF: Stateful

O protocolo HTTP de certa forma é limitado, e uma dessas limitações é justamente ser stateless não mantém o estado com o cliente, ou seja, não possível somente com o protocolo reconhecer um determinado cliente além de um processo de requisição (request).

Em muitos sistemas web devemos driblar esta limitação, e usar alternativas do ambiente. Bom mas o que importa para este post, é que o faces trabalha mantendo o estado da view de um cliente, ou seja, é stateful. Justamente para efetuar todo o trabalho com Conversores + Validadores + Event / Action Listener. O faces tem 2 abordagens para stateful:
  1. server-side: usando o HttpSession para manter os dados.
  2. client-side: campos hidden para guardar as informações. Esta abordagem é menos segura que a outra.
Por default o my-faces usa a primeira opção, mas é permitido trocar a abordagem informando um parametro ao Faces Servlet, no web.xml.

Sunday, October 15, 2006

JSF - Request Lifecycle

Continuando na "brincadeira" com faces, resolvi postar algo interessante do frame, o ciclo de vida da request, que é quem permite que várias features do frame tenham funcionalidade. Um detalhe importante, é que todo o esquema descrito abaixo, é possível pq o faces é stateful com seus componetes.

No geral, o ciclo de vida é executado de 2 formas:
a) Primeira requisição da página (View), o faces executa 2 fases:
  • Restore View: verifica que ainda não existe árvore de componentes UI para a View, portanto cria todos os componentes UI (javabean) e passa para a fase de renderização.
  • Render Response: baseado na estado (dados) dos componentes na tree monta a renderização no formato esperado pelo cliente.
b) Segunda requisição da mesma página, aonde a árvore existe e o fluxo de execução muda, é executado em 6 fases:
  • Restore View: retorna a árvore vinculada a View, passa para próxima fase.
  • Apply Request Values: captura os dados de input do cliente (param na request) e seta nas devidas properties dos componentes UI. Passa para a próxima fase.
  • Process Validations: cada componente UI poderá ser validado, portanto nessa fase a árvore de componentes da view e percorrida, componente a componente, verificando se o componente UI tem validador, caso tenha o mesmo é executado. Se algo estiver errado pula para a fase de renderização, senão para a próxima.
  • Update Model Values: os componentes UI já possuem as properties atualizadas, mas os "dados de modelo", ou seja, atributos dos managed bean ainda não! É importante relembrar que todos os param da request são String, e as properties dos compoentes UI tbém. Nessa fase serão aplicados os conversores, qdo existirem, na mesma forma que os validadores. Se algo estiver errado pula para a fase de renderização, senão para a próxima.
  • Invoke Application: nesta fase são executados os actions listener registrados para os componentes Command (botões, links, ...) , e depois as actions normais (managed bean). Executada a fase de renderização.
  • Render Response: a mesma política, renderiza o conteúdo para o cliente.

Wednesday, August 16, 2006

Converter Domain Model em JSF

Aqui