Implementando Login com JSF (exemplo simples)

English Version Here

Bom, uma das perguntas mais frequentes de quem esta começando a estudar JSF é como implementar um Login, e esta foi uma das perguntas mais frequentes que vi no GUJ e em comentários aqui no blog também …

Antes de começar, quem quiser usar JSF com JPA é só dar uma olhada neste post que escrevi a algum tempo.

Agora vamos dar uma olhada rápida em algumas formas de implementar login com JSF.

A primeira abordagem é uma implementação manual, que nesta versão só verifica se o usuário ja esta logado, mas é possível estende-la facilmente para utilizar grupos.

Primeiro vamos começar com a configuração do web.xml …

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<error-page>
<exception-type>java.lang.SecurityException</exception-type>
<location>/login.jsf</location>
</error-page>
</web-app>

Como podem ver, eu criei uma aplicação WEB com servlets 2.5, estou utilizando JSF 1.2, mas para este exemplo a versão não faz muita diferença, e configurei o servlet container para que no caso de uma java.lang.SecurityException ele redireccione para a página de login da aplicação.

Depois disto, vamos começar a escrever alguns beans, vou utilizar dois beans simples, um para gerenciar o login:

package br.com.urubatan.jsfjpasec;
public class Login {
private boolean loginOk;
private String userName;
private String password;
public boolean isLoginOk() {
return loginOk;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String validateLogin(){
if(userName!=null && password!=null && !userName.equalsIgnoreCase(password)){
loginOk = true;
return "secpage";
}else return "login";
}
}

É uma classe bastante simples, ele tem 3 propriedades, o nome e senha do usuário, e uma propriedade dizendo que o login esta OK, este é o ponto de extensão para adicionar suporte a grupos mais tarde se quiserem.

E este bean que vai conter todos os dados da aplicação (neste exemplo, dados estáticos), ele tem duas propriedades que possuem dados estáticos apenas para este exemplo, se quiserem utilizar JPA basta misturar com este exemplo ou com um destes.

package br.com.urubatan.jsfjpasec;
import java.util.List;
import java.util.ArrayList;
public class SomeData {
private List<String> data = new ArrayList<String>();
private List<String> securedData = new ArrayList<String>();
private boolean loginOk;
public SomeData() {
for(int i=0;i<10;i++){
data.add("Dados Simples " + i);
securedData.add("Dados Seguros " + i);
}
}
public void setLoginOk(boolean loginOk) {
this.loginOk = loginOk;
}
public List<String> getSecuredData() {
if(!loginOk)
throw new SecurityException();
return securedData;
}
public List<String> getData() {
return data;
}
}

Como podemos ver, ele possui apenas os getters dos dados, e o método de leitura dos dados seguros, verifica a propriedade loginOk que deve ter sido fornecida pelo bean de login, vamos configurar isto no faces-config.xml a seguir.

Caso o usuário não tenha se identificado ainda, apenas geramos uma SecurityException e o container cuida de mandar isto para a página de login, como foi configurado no web.xml.

Agora um pouco mais de XML, vamos configurar os navigation cases necessários para a aplicação e os relacionamentos entre os beans ja criados, no caso, configurar a propriedade loginOk do bean de dados com a mesma propriedade do bean de login.

<?xml version='1.0' encoding='UTF-8'?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>login</managed-bean-name>
<managed-bean-class>br.com.urubatan.jsfjpasec.Login</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>mdata</managed-bean-name>
<managed-bean-class>br.com.urubatan.jsfjpasec.SomeData</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>loginOk</property-name>
<property-class>java.lang.Boolean</property-class>
<value>#{login.loginOk}</value>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>
login
</from-outcome>
<to-view-id>
/login.jsp
</to-view-id>
<redirect/>
</navigation-case>
<navigation-case>
<from-outcome>
secpage
</from-outcome>
<to-view-id>
/secureView.jsp
</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>

Os casos de navegação nesta aplicação bastante complexa são utilizados apenas pelo bean de login, no método que valida o login (baita validação, apenas verifica se foram informados um nome e uma senha e se os dois não são iguais, mas este é outro problema :D )

Com isto toda a lógica necessária para a aplicação esta pronta, falta apenas criarmos as páginas utilizadas, então segue o código delas:

login.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
<head><title>System Login</title></head>
<body>
<f:view> <h:form>
<h:panelGrid columns="2">
<h:outputLabel value="User Name" for="un"/>
<h:inputText id="un" value="#{login.userName}"/>
<h:outputLabel value="Password" for="pw"/>
<h:inputText id="pw" value="#{login.password}"/>
</h:panelGrid>
<h:commandButton value="Login" action="#{login.validateLogin}"/>
</h:form>
</f:view>
</body>
</html>

Como podemos ver é apenas uma página JSF simples com um formulário e dois campos, chamando o método vaidateLogin de um bean de nome login.

dataView.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
<head><title>Unsecured Data Page</title></head>
<body>
<f:view>
<h:dataTable value="#{mdata.data}" var="v">
<h:column>
<f:facet name="header">
<h:outputText value="Data List"/>
</f:facet>
<h:outputText value="#{v}"/>
</h:column>
</h:dataTable>
<h:panelGrid columns="3">
<h:outputLink value="dataView.jsf">
<h:outputText value="Data that every one can access"/>
</h:outputLink>
<h:outputLink value="secureView.jsf">
<h:outputText value="Data that you can view after login"/>
</h:outputLink>
<h:outputLink value="login.jsf">
<h:outputText value="Login"/>
</h:outputLink>
</h:panelGrid>
</f:view>
</body>
</html>

Como podemos ver também é uma página bem simples, com apenas uma dataTable listando os dados da propriedade data de um bean de nome mdata.


secureView.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<html>
<head><title>Secured Data Page</title></head>
<body>
<f:view>
<h:dataTable value="#{mdata.securedData}" var="v">
<h:column>
<f:facet name="header">
<h:outputText value="Data List"/>
</f:facet>
<h:outputText value="#{v}"/>
</h:column>
</h:dataTable>
<h:panelGrid columns="3">
<h:outputLink value="dataView.jsf">
<h:outputText value="Data that every one can access"/>
</h:outputLink>
<h:outputLink value="secureView.jsf">
<h:outputText value="Data that you can view after login"/>
</h:outputLink>
<h:outputLink value="login.jsf">
<h:outputText value="Login"/>
</h:outputLink>
</h:panelGrid>
</f:view>
</body>
</html>

Esta também é uma página simples, praticamente igual a anterior, mas desta vez, lendo a propriedade securedData do bean mdata, nesta propriedade o bean verifica se o usuário tem acesso, caso contrário gera uma excessão.

por último temos a página index.jsp que apenas possui um link para a página dataView.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Entry Page</title></head>
<body>Entry Page, this could redirect to the JSF Index, but for now, click here: <a href="dataView.jsf">JSF Index</a>
</body>
</html>

com isto temos uma implementação bem simples de um login em uma aplicação JSF, bom para quem esta começando a estudar a tecnologia.

Como melhorias poderíamos mudar a propriedade loginOk para um Map<String,Boolean> tendo como chave os nomes dos possíveis grupos e como valores veradeiro se o usuário pertence aquele grupo.

Outra melhoria interessante seria utilizar um h:inputSecret para a senha em vez de um inputText como estou utilizando no exemplo.

Outra possível melhoria seria utilizar uma combinação de anotações e AOP como esta implementado no Spring-Annotations. (se quiserem posso postar outro dia um exemplo de implementação de segurança com o SA).

Uma outra possível alteração seria utilizar JAAS para a segurança declarativa e deixar isto por conta do container.

Agora algumas perguntas para vocês:

  1. Quais outras possíveis melhorias vocês vêem neste exemplo?
  2. Quais problemas vocês vêem nesta implementação?
  3. Vocês gostariam de outros exemplos deste estilo aqui no blog?
  4. Vocês já estão utilizando JSF?

Acho que era isto, espero que o exemplo seja útil para alguém :D

PS.: para os que forem rodar a aplicação, são necessários apenas os jars: jstl.jar, jsf-api.jar e jsf-impl.jar (se forem utilizar a JSF-RI como eu).

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

39 comments so far

  1. Bruno August 14, 2007 10:31 pm

    isso tudo supostamente pra *incentivar* a usarem JSF?!

  2. Urubatan August 14, 2007 11:02 pm

    Sinceramente não achei estar incentivando …
    JSF é uma boa solução que merece ser estudada, mas não é a bala de prata, ela se aplica a alguns casos, e eu ja utilizei em muitos projetos, mas não tenho utilizado no últimos …
    Este post foi como eu comentei no inicio, a pedidos, tem vários comentários aqui pedindo um exemplo disto :D

    Atualmente estou mais para incentivar o uso de Ruby On Rails :D

  3. […] continua en Urubatan traido usted por […]

  4. Luciano August 15, 2007 7:51 am

    Interessante. Legal esse tipo de post com tutoriais…parabéns

  5. Marcelo Madeira August 15, 2007 10:09 am

    Legal Urubatan…

    estou começando a estudar JSF e estou gostando muito.
    Fiquei com uma curiosidade. Você disse que já usou muito JSF e não tem utilizado ele nos últimos projetos, correto? Qual framework você está utilizando para desenvolver (em java) ultimamente?
    Sempre achei você um fã de carteirinha do JSF…

    abraços
    Marcelo

  6. fother August 15, 2007 11:56 am

    Valeu! =)
    Vou estudar isso hoje a tarde.. E que tal criptografia no persistence.xml? Um outro post? ashfiuashdfiuashdfuias
    abraço. E obrigado pela atenção!

  7. Beyond Click August 15, 2007 1:52 pm

    […] aproveitar o post do Urubatan ensinando como fazer um login com JSF para explicar como delegar, para o container web, o serviço de autenticação e […]

  8. seufagner August 15, 2007 2:26 pm

    Um otimo exemplo para ver a complexidade para criar um simples login.. xmls, taglibs.. etc etc.. O Wicket é novo, mas promete.. Por que você realmente prefere JSF Urubatan? Eu entendo que ele faz parte da especificação, etc.. Tem implementações maduras.. Mas, e aí? Você gosta dessa abordagem?
    []
    Fagner

  9. […] ja que fui criticado por “incentivar a utilização de JSF”, vou fazer mais alguns pequenos tutoriais de […]

  10. AC de Souza August 16, 2007 9:01 pm

    O que você achou do exemplo de login implementado usando o serviço de autenticação e autorização do container?

    [],
    AC

  11. Urubatan August 16, 2007 9:10 pm

    Achei muito bom o exemplo, só não utilizo JAAS com freqüência pela falta de flexibilidade :D
    Por exemplo, é comum ter mais de dois campos na autenticação (além de usuário e senha, é comum um código de cliente ou algo do gênero)
    E com JAAS não consigo implementar isto …

  12. Urubatan August 16, 2007 9:12 pm

    Marcelo, JSF é uma ótima tecnologia quando utilizada corretamente, mas como toda tecnologia, não é a solução para todos os seus problemas …
    Para escolher o que vai ser utilizado em um projeto, preciso levam em conta diversos fatores, e por coincidência, JSF não fechou com nenhum projeto que implementei este ano (mesmo eu tendo passado 2 anos utilizando em todos os projetos que trabalhei até o final do ano passado)

  13. fother August 18, 2007 4:09 pm

    quando vc tenta acessar secureView.jsf sem estar logado.. em vez de direcionar para a pagina de login.. ele da esse erro:

    exception

    javax.servlet.ServletException: /secureView.jsp(8,0) ‘#{mdata.securedData}’ Error reading ’securedData’ on type br.com.urubatan.jsfjpasec.SomeData
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)

    oque sera q pode ser?

  14. Urubatan August 18, 2007 4:27 pm

    aparentemente você ou esqueceu de configurar o web.xml
    acredito que seja este o problema …

  15. fother August 18, 2007 4:43 pm

    javax.servlet.ServletException
    /login.jsf

    esta igual ao seu (o do post).. para dar certo tive que fazer isso.. mais ficou sem logica nenhuma..

  16. Urubatan August 18, 2007 6:18 pm

    parece que a implementação de JSF que você esta utilizando, esta mascarando a SeurityException em uma ServletException …
    Qual implementação você esta utilizando? a RI ou MyFaces? qual versão 1.1 ou 1.2?

  17. fother August 19, 2007 8:15 pm

    jsf 1.2. richfaces, ajax4jsf

  18. fother August 20, 2007 9:44 am

    a e uma outra pergunta.. digamos que eu tenho uma pagina.. so escrita bem vindo usuario fother
    como q eu faço pra que so quem logou possa ver.. sem usar scriptlets na jsp

  19. Urubatan August 20, 2007 10:14 am

    fother, o JSF não passa por controller nenhum antes de renderizar a página, então não tem como fazer nada com qualquer página que não acesse dados de lugar nenhum …
    o melhor que poderia ser feito é utilizar o atributo rendered dos objetos para não mostra-los na tela.

  20. Luiz Sérgio August 22, 2007 12:23 am

    Olá, estou desenvolvendo uma aplicacao com JSF em que preciso listar noticias e quando clicar sobre o titulos delas abrir em uma outra pagina o conteudo da noticia. semelhante como temos em jornais na internet (uol, terra, etc… ) Estou cadastrando e listando as noticia como quero, so que naum sei como pegar a referencia da noticia que eu cliquei para poder exibir seu conteudo completo em outra pagina. Tem algum exemplo? se entendeu e poder me ajudar agardeco bastante. :)

  21. ICC September 14, 2007 12:30 pm

    Fala cara,
    Curti mt o exemplo. Quanto a parte de seguranca eu to pesquisando como funcionaria via PhaseListeners. Voce sabe de algum artigo/link q fale sobre isso?vlw

  22. Urubatan September 14, 2007 1:24 pm

    Tem aqui na página de publicações do blog, no exemplo de um curso realizado em pato branco … (não lembro se na página de publicações ou em um post sobre o curso :D )

  23. leandro October 4, 2007 4:56 pm

    Ótimo exemplo

  24. […] Versão em portugues aqui […]

  25. Luiz Taborda December 5, 2007 8:06 am

    Urubatan, estou com o mesmo problema que o fother, relatou.
    A minha implementação é basicamente a mesma, só é myfaces (em vez de richfaces).

    Pode me dar uma mão?
    Pelas mensagens de erro parece que o problema é com o ajx4jsf.

    javax.servlet.ServletException: Cannot get value for expression ‘#{mdata.dadosSeguros}’
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:154)
    org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
    org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
    org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:97)
    org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:144)
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

  26. Weliton December 18, 2007 9:44 pm

    Ola amigo, parabéns pelo blog e pelo exemplo.
    Seguinte, estou tentando “rodar” aqui, mas esta aparecendo o seguinte erro:

    org.apache.jasper.JasperException: Unable to compile class for JSP:

    An error occurred at line: 10 in the jsp file: /dataView.jsp
    The method setVar(String) in the type DataTableTag is not applicable for the arguments (JspValueExpression)

    Faz alguma idéia do que é e como resolver? Ja testei o forEach, mas o erro continua.

  27. Urubatan December 19, 2007 11:14 am

    Weliton, parece que é algum problema entre a versão do JSF e do JSP que tu ta usando, tenta atualizar o JSF pra 1.2 que deve resolver …
    Luiz, parece que faltou configurar o faces-config.xml …

  28. Felipe Guerra December 26, 2007 9:07 am

    Urubatan,

    Pq da exceção quando eu declaro uma propriedade como boolean no meu Valued Object e tento mostra-la com a tag ?

    Exceção:
    SEVERE: Servlet.service() for servlet Faces Servlet threw exception
    org.apache.jasper.el.JspPropertyNotFoundException: /jsf/adm/controle_usuario.jsp(126,11) ‘#{users.flagAtivo}’ Property ‘flagAtivo’ not readable on type boolean
    at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)
    at javax.faces.component.UIOutput.getValue(UIOutput.java:184)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:201)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:284)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:154)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:849)
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:242)
    at com.sun.faces.renderkit.html_basic.TableRenderer.renderRow(TableRenderer.java:312)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:133)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:825)
    at org.ajax4jsf.framework.renderer.RendererBase.renderChild(RendererBase.java:282)
    at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:159)
    at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:97)
    at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:150)
    at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxChildren(AjaxChildrenRenderer.java:97)
    at org.ajax4jsf.framework.renderer.AjaxChildrenRenderer.encodeAjaxComponent(AjaxChildrenRenderer.java:150)
    at org.ajax4jsf.framework.renderer.AjaxContainerRenderer.encodeAjax(AjaxContainerRenderer.java:125)
    at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeAjax(AjaxViewRoot.java:549)
    at org.ajax4jsf.framework.ajax.AjaxViewRoot$4.invokeRoot(AjaxViewRoot.java:380)
    at org.ajax4jsf.framework.ajax.JsfOneOneInvoker.invokeOnRegionOrRoot(JsfOneOneInvoker.java:53)
    at org.ajax4jsf.framework.ajax.AjaxContext.invokeOnRegionOrRoot(AjaxContext.java:191)
    at org.ajax4jsf.framework.ajax.AjaxViewRoot.encodeChildren(AjaxViewRoot.java:397)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936)
    at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:256)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:187)
    at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
    at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:233)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:127)
    at org.ajax4jsf.framework.ajax.xmlfilter.BaseFilter.doFilter(BaseFilter.java:277)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at br.com.sofisa.pcfi.filter.ControlFilter.doFilter(ControlFilter.java:34)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:147)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:595)

  29. Felipe Guerra January 4, 2008 1:59 pm

    ?

  30. Luiz Gustavo January 8, 2008 3:42 pm

    Não estou conseguindo sucesso para rodar este exemplo.

    Colocar as páginas em .jsp e configurar sendo .jsf não tem problema?

  31. Daniel Kist January 22, 2008 4:36 pm

    Qual a melhor maneira para aplicar isso para várias páginas com a menor replicação de código possivel?

    Abraço
    Daniel

    PS. Valeu pelos posts, tem ajudado bastante a galera.

  32. Zimmer Marques February 28, 2008 10:00 pm

    Urubatan, trabalhamos cm jsf a quase 2 anos e chegamos num ponto crucial de um sistema onde precisamos carregar combos em diversas telas. carregamos as combos com selectItens, então eis a pergunta : tenho um managed bean que tem 1 arraylist genérico de uma entidade, temos mais 2 atributos long, esse bean é responsável por uma tela de cadastro A. temos outro cadastro B onde temos outro bean também e precisamos carregar uma combo com uma lista genérica da tela de cadastro A (simplificando bem o problema). a questão é se no momento que chamarmos o método que carrega essa lista da entidade A na tela da entidade B como o jsf se comportaria em relação a todos os objetos no bean A, já que cada vez que chamo um managed bean na tela ele instância o managed bean em memória.

  33. Fernando Moreira March 11, 2008 10:11 am

    Se esse é o exemplo simples usando JSF, imagina o exemplo escroto!
    heuehueheue
    não consegui fazer as config do xml.
    []’s

  34. Luiz Gustavo, respondendo a sua pergunta em

    Não estou conseguindo sucesso para rodar este exemplo.
    Colocar as páginas em .jsp e configurar sendo .jsf não tem problema?

    Tem problema sim… pra conseguir rodar aqui, tive que trocar todas as referências de jsf para jsp em todos os arquivos…

    Espero ter ajudado

    abraços

  35. LEANDROGILDO May 13, 2008 1:35 pm

    MEU SE É FEIO EM CARA TU PARECE UM BOIZAO RSRSRS KKKKKKKKKKKKKKKKKK

  36. Vinícius May 26, 2008 7:47 pm

    Olá URubatan, bacana o post pra quem está começando, como é o meu caso, como seria a implementação com grupos de acesso? Como administrador, usuário e tal tal tal??? vlw

  37. jsf login May 28, 2008 11:16 am

    […] ser melhorado, inclusive tem algumas sugest?es de melhora no final do post, qual a sua sugest??o?http://www.urubatan.com.br/2007/08/14/implementando-login-com-jsf-exemplo-simples/Eclipse Plugin Central :: View topic - New JSF Login Demo TutorialPost subject: New jsf login Demo […]

  38. Anaci July 2, 2008 9:34 pm

    porque esta informação está em inglês?

  39. jsf com August 4, 2008 9:23 pm

    […] […]

Leave a comment

Please be polite and on topic. Your e-mail will never be published.