Ajudinha básica com JSF

20 respostas
R

Olá amigos, como vão?
Tenho uma aplicação WEB com JSF2, Hibernate e PrimeFaces.
Vejam:

login.xhtml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:p='http://primefaces.org/ui'>
    <h:head>
        <title>Identifique-se</title>
    </h:head>
    <h:body>
        <h:form id='formulario'>
            <h:panelGrid columns='2'>
                <p:outputLabel value="Login: " />
                <p:inputText id='txtLogin'
                             value='#{usuarioMB.loginUsuario}' />
                <p:outputLabel value='Senha: ' />
                <p:password id='txtSenha'
                            value='#{usuarioMB.senhaUsuario}' /> 
                <p:commandButton value="Entrar"
                                 icon='ui-icon-check'
                                 action="#{usuarioMB.validarAcesso()}"
                                 oncomplete="dlgLogin.hide()">
                </p:commandButton>
            </h:panelGrid>
        </h:form>
    </h:body>
</html>
UsuarioManagedBean:
public String validarAcesso() {
        try {
            UsuarioDAOImpl usuarioDAOImpl = new UsuarioDAOImpl();
            if (usuarioDAOImpl.validarAcesso(this.getLoginUsuario()).isEmpty()) {
                return "erroAoLogar";
            } else {
                return "sucesso";
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            return "erroAoLogar";
        }
    }
Aí eu fui, e criei por conta um arquivo faces-config.xml. Veajm:
<?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>usuarioMB</managed-bean-name>
        <managed-bean-class>br.com.tcc.managedBean.UsuarioMB</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    
    <navigation-rule>
        <from-view-id>faces/login.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>logado</from-outcome>
            <to-view-id>faces/novaInstituicao.xhtml</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>erroAoLogar</from-outcome>
            <to-view-id>faces/login.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    
</faces-config>

No entanto, quando eu executo a aplicação, a página de login aparece em branco, apenas com o título da página!
O que pode ser o problema?
[]'s

20 Respostas

Fexx

Passa a url que vc está tentando acessar a pagina?

R

http://localhost:8080/TCC/

T

Como voce configurou seu web.xml?

Exemplo:

web.xml

<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
</servlet-mapping>

Se no seu web xml estiver assim, como acima. Ao executar ele só irá interpretar o que for com a extensao *.jsf

<welcome-file-list>
		<welcome-file>index.jsf</welcome-file>
	</welcome-file-list>

Logo, quando voce executou a aplicação, se o seu welcome file for diferente de algumacoisa.jsf, ele irá executar na extensao que está no welcome-file.

Provavelmente seu welcome-file esteja como index.xhtml ou index.html ou ainda index.jsp. Mude-o para a configuração que voce colocou no url-pattern.
nomedasuapagina.jsf

Ao executar a aplicação, ele irá procurar por esse arquivo.

Fexx

No mapeamento vc está indicando, mais um diretorio o “faces” veja: faces/login.xhtml
verifica seu web.xml também.

R

Vejam:

Creio que essa parte esteja correta.
O que eu não entendo, é porque não aparece nada na tela!

T

Bom, se esse é seu url pattern. Sua url tem que ser: http:localhost:8080/TCC/faces/nomedapagina.xhtml

vai no seu welcome-file e deixa faces/nomedapagina.xhtml

Ex:

<welcome-file-list>
	<welcome-file>faces/index.jsf</welcome-file>
</welcome-file-list>
R

<welcome-file-list> <welcome-file>faces/login.xhtml</welcome-file> </welcome-file-list>

Entretanto, o meu welcome-file já estava desse modo.

T

Muda seu pattern de

para

Fexx

A estrutura onde se localiza as paginas . xhtml está de acordo como é chamado na url?

T

Cara, ve isso tbm… voce disse está usando a versão 2 do jsf. entretando, no faces-config. está setado versao 1.2

Muda para:

<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_2_0.xsd"
    version="2.0">
R

tarlix,
alterei o faces-config, e realmente deu certo. Era apenas a versão.
A página de login aparece.
Porém, o log do Servidor fica apresentando erros sem parar, e quando eu tento logar,
não aparece a tela que deveria vir em seguida!

T

Quais erros aparecem no log?

R
java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: java.util.concurrent.ExecutionException: com.sun.faces.config.ConfigurationException: Unable to parse document ‘jndi:/localhost/TCC/WEB-INF/faces-config.xml’: null

at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:290)

at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)

at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)

at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1256)

at org.apache.catalina.manager.ManagerServlet.doGet(ManagerServlet.java:376)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)

at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1852)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at java.lang.Thread.run(Thread.java:722)
T

Cara, eu nao posso confirmar isso agora, mas no jsf2 as configurações do ManagedBean são feitas direto na classe

@ManagedBean
@SessionScope
Class

Portanto, remova isso:

<managed-bean>  
        <managed-bean-name>usuarioMB</managed-bean-name>  
        <managed-bean-class>br.com.tcc.managedBean.UsuarioMB</managed-bean-class>  
        <managed-bean-scope>session</managed-bean-scope>  
    </managed-bean>  
      
    <navigation-rule>  
        <from-view-id>faces/login.xhtml</from-view-id>  
        <navigation-case>  
            <from-outcome>logado</from-outcome>  
            <to-view-id>faces/novaInstituicao.xhtml</to-view-id>  
        </navigation-case>  
        <navigation-case>  
            <from-outcome>erroAoLogar</from-outcome>  
            <to-view-id>faces/login.xhtml</to-view-id>  
        </navigation-case>  
    </navigation-rule>

E teste de novo, conforme for, vc vai pesquisando o navigation-rule.
Mas o managed bean pode ser por anotação, direto.

R

tarlix,
eu devo então deletar o arquivo faces-config?

DaniloAndrade

no jsf2 vc pode configurar seus managedBeans tanto o xml quanto por anotação
lembrando que se vc estiver usando a configuração por xml e ao mesmo tempo usando anotação para o mesmo managedBean o xml terá precedência.

agora o que esta parecendo é que tem alguma coisa erra dentro do xml

R

É que agora tá acontecendo o seguinte:
O NetBeans compila, abre o navegador e a página de login, porém, o log do Apache fica apresentando erros, como se estivesse em um loop.
Aí quando digito o usuário e senha na tela e clico em “Entrar” ,a página some e não direciona para a próxima página.

Ideias do que pode ser?
Não ia bater tanto em cima disso, mas é que é meu TCC rsrs

Valeu galera

DaniloAndrade

usa as anotações do jsf no seu managedBean

e coloca apenas isso no seu faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file is not required if you don't need any extra configuration. -->
<faces-config version="2.0" 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_2_0.xsd">	
</faces-config>

e vê o que acontece

R

Tentei fazer isso, deixei só esse trecho do faces-config e mesmo assim não deu certo.
Até porque eu desejo que a aplicação seja direcionada para a tela de login e, se o usuário existir, vá para as outras páginas.
Então, suponho eu, que tirando do faces-config os parâmetros como navigation-case, navigation-rule, etc, ele não irá direcionar as páginas.

Alguma sugestão? =/

DaniloAndrade

vai funcionar normalmente, o que vc precisa é dizer no seu metodo do managedBean pra onde ele deve ir

@ManagedBean
public class LoginBean{

public Usuario usuario = new Usuario();
//outros codigos aqui

public String logar(){

if(dao.existe(usuario)){
   return "paginaPrinciapal";// ele ira direciona pro xhtml com esse nome
}
return "login"; // ele ira direciona pro xhtml com esse nome

}

//getter e setter
}

o direcionamento será feito usando a String que vc ira retorna

aconselho a vc procurar mais informação sobre o jsf2

segue algumas apostilas que vão te ajudar

http://www.k19.com.br/downloads/apostilas/java/k19-k12-desenvolvimento-web-com-jsf2-e-jpa2

http://www.k19.com.br/downloads/apostilas/java/k19-k22-desenvolvimento-web-avancado-com-jsf2-ejb3.1-e-cdi

Criado 8 de abril de 2013
Ultima resposta 9 de abr. de 2013
Respostas 20
Participantes 4