Google App Engine + JSF 2 + PrimeFaces

Continuando a série GAE, o post agora é sobre inserir o PrimeFaces em um projeto no GAE.
Aos que chegaram agora, para saberem como chegar até aqui, é só ver os os outros posts do blog que abordam o tema. Lembrando que a IDE usada é o eclipse. Para ver os posts anteriores, pode clicar aqui.

O PrimeFaces é uma implementação do JSF que vem aumentando de popularidade, comparando-a com os concorrentes mais famosos (RicheFaces, IceFaces). Essa evolução pode ser notada nesse gráfico do Google Trends. O showcase é bastante completo, a documentação é abrangente, tem fórum ativo, possui uma implementação para dispositivos móveis baseado no framework jQuery Mobile, vários temas disponíveis para utilização. Também é possível ver o showcase do PrimeFaces no próprio GAE.

Vamos ao que interessa , como colocar no ar a aplicação com o Primefaces!
Primeiro, faça o download do jar e coloque ele na pasta lib do projeto(projeto/war/WEB-INF/lib). A versão utilizada no tutorial será versão 2.2.1. Para funcionar, o PrimeFaces só precisa que as libs JSF estejam  no projeto (jsf-api e jsf-impl), que já estão na pasta lib.

Feito isso, para testar o funcionamento do primefaces, altere o arquivo login.xhtml. Veja um exemplo de como fica o arquivo.


<!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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 <title>JSF 2 + PrimeFaces</title>
</h:head>
<h:body>
<f:view contentType="text/html">
<h:form>
 <p:messages />
 <p:accordionPanel autoHeight="false">
  <p:tab title="Login no JSF">
   <h:panelGrid columns="2">
    <h:outputText value="E-mail:" />
    <h:inputText value="#{loginMB.mail}" required="true"
    requiredMessage="Preenchimento do e-mail obrigatório" />

    <h:outputText value="Senha:" />
    <h:inputSecret value="#{loginMB.senha}" required="true"
    requiredMessage="A senha não deve ser vazia" />
 
    <p:commandButton value="Ok - Primefaces"
    actionListener="#{loginMB.autenticar}" ajax="false" />
   </h:panelGrid>
  </p:tab>
 </p:accordionPanel>
</h:form>
</f:view>
</h:body>
</html>

Veja algumas telas do PrimeFaces funcionando.


O projeto de exemplo também pode ser visto rodando no GAE nesse link.

Por hoje é só, mas em breve mais algumas coisas sobre o PrimeFaces, JSF 2 e etc.

4 comentários:

  1. Peguei o exemplo do site que você tinha falado, incluir o jar do PRIMEFACES, mas quando acesso a tela de login, aparece esse erro:
    Até no site de exemplo não esta funcionando direito, não está redirecionando.

    08/11/2011 06:07:31 com.google.apphosting.utils.jetty.JettyLogger info
    INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
    08/11/2011 06:07:31 com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
    INFO: Successfully processed C:\Users\Roosevelt\workspace\Repensa\war\WEB-INF/appengine-web.xml
    08/11/2011 06:07:31 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
    INFO: Successfully processed C:\Users\Roosevelt\workspace\Repensa\war\WEB-INF/web.xml
    08/11/2011 02:07:38 com.google.appengine.tools.development.DevAppServerImpl start
    INFO: The server is running at http://localhost:8888/
    08/11/2011 02:07:50 com.google.apphosting.utils.jetty.JettyLogger warn
    AVISO: /favicon.ico/
    java.lang.IllegalArgumentException: null source
    at java.util.EventObject.(Unknown Source)
    at javax.faces.event.SystemEvent.(SystemEvent.java:67)
    at javax.faces.event.ComponentSystemEvent.(ComponentSystemEvent.java:69)
    at javax.faces.event.PostRestoreStateEvent.(PostRestoreStateEvent.java:69)
    at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)

    ResponderExcluir
  2. Continuação:


    at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
    at com.google.appengine.tools.development.StaticFileUtils.serveWelcomeFileAsForward(StaticFileUtils.java:80)
    at com.google.appengine.tools.development.LocalResourceFileServlet.maybeServeWelcomeFile(LocalResourceFileServlet.java:247)
    at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:120)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

    ResponderExcluir
  3. Está ocorrendo este erro, fiz conforme o site, mesmos exemplos, o exemplo do site tb não funciona corretamente:


    INFO: The server is running at http://localhost:8888/
    08/11/2011 02:07:50 com.google.apphosting.utils.jetty.JettyLogger warn
    AVISO: /favicon.ico/
    java.lang.IllegalArgumentException: null source
    at java.util.EventObject.(Unknown Source)
    at javax.faces.event.SystemEvent.(SystemEvent.java:67)
    at javax.faces.event.ComponentSystemEvent.(ComponentSystemEvent.java:69)
    at javax.faces.event.PostRestoreStateEvent.(PostRestoreStateEvent.java:69)
    at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)

    ResponderExcluir

Vamos lá, é só prender o grito!