Ajuda com JSF 2.0

17 respostas
robinsonbsilva

Boa tarde senhores(ritas),

Estou com uma dúvida em relação ao “navigations rules” no JSF 2.0.
Eu estou tentado usar “xml” o mínimo que puder, e pelo meu “guia de estudos”, é possível retornar em um método do ManagedBean o “destino”.

Abaixo segue os códigos usados, primeiro na página.

//pagina.xhtml
<h:commandLink value="Cadastro Usuarios" action="#{usuarioBean.novoUsuario}"/>
@ManagedBean(name = "usuarioBean")
public class UsuarioBean {

	private Usuario usuario = new Usuario();

	public UsuarioBean(){
	}

	public String novoUsuario() {
		usuario = new Usuario();
		return "/pages/usuario/create.xhtml"; // AQUI EU QUERO IR PARA usuario/create.xhtml
	}
}

A minha estrutura de páginas está assim

webContent
   ----->WEB-INF
   ----->META-INF
   ----->resources
   ----->pages
            ----->usuario
               ----->create.xhtml
               ----->show.xhtml
               ----->form.xhtml

Desde já agradeço.

17 Respostas

dev.rafael

O livro está certo!! E vc nem precisa usar o .xhtml basta /pages/usuario/create q vc já vai navegar. De fato vc ñ precisa nem do método já q vc pode fazer isso diréto no action do seu commandButton (ñ q seja esse o seu caso mas ainda é possível) e vc ainda pode “sobrescrever” essa regra usando o faces-config no futuro:

<navigation-rule>
  <navigation-case>
    <from-outcome>/pages/usuario/create</from-outcome>
    <to-view-id>/outra_pagina.xhtml</to-view-id>
  </navigation-case>
</navigation-rule>
J

Simples, qual a extensão que está mapeado no web.xml no servlet-mapping do Faces Servlet?
Tipo, se suas paginas estão mapeadas para ser *.jsf, coloque essa extensão no link que vai retornar, que elas serão interpretadas.

dev.rafael

Ou ñ use extensão nenhuma, assim fica mais ele vai navegar independentemente de como está mapeada a FacesServer.

robinsonbsilva

Está assim:

&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

eu coloquei no MangedBean

public String novoUsuario() {
		usuario = new Usuario();
		return "/pages/usuario/create.jsf"; //aqui já alterei entre .jsf, .xhtml, sem extensão e o erro apresentado é java.io.FileNotFoundException
	}

Desde já agradeço.

rbroz85

no meu funciona assim:

public String novoUsuario() { usuario = new Usuario(); return "create"; }
e ele ja vai pra pagina q eu quero

dev.rafael

Nesse caso poste o restante do código do seu web.xml e do faces-config.xml.

robinsonbsilva

Segue:

Web.xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.5" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;

	&lt;display-name&gt;Client Colocation&lt;/display-name&gt;

    &lt;context-param&gt;
        &lt;param-name&gt;daoFactoryClientColocation&lt;/param-name&gt;
        &lt;param-value&gt;br.com.empraise.dao.hibernate.FactoryDAOHibernate&lt;/param-value&gt;
    &lt;/context-param&gt;

    &lt;listener&gt;
        &lt;description&gt;ServletContextListener&lt;/description&gt;
        &lt;listener-class&gt;br.com.empraise.listener.Inicializador&lt;/listener-class&gt;
    &lt;/listener&gt;

	&lt;servlet&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt;
	&lt;/servlet&gt;

	&lt;servlet-mapping&gt;
		&lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
		&lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;

    &lt;welcome-file-list&gt;
        &lt;welcome-file&gt;pages/index.html&lt;/welcome-file&gt;
    &lt;/welcome-file-list&gt;
&lt;/web-app&gt;

faces-config.xml

&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;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"&gt;

	&lt;application&gt;
		&lt;resource-bundle&gt;
			&lt;base-name&gt;br.com.empraise.integrator.rotulos&lt;/base-name&gt;
			&lt;var&gt;rotulo&lt;/var&gt;
		&lt;/resource-bundle&gt;

		&lt;locale-config&gt;
			&lt;default-locale&gt;pt&lt;/default-locale&gt;
			&lt;supported-locale&gt;en&lt;/supported-locale&gt;
		&lt;/locale-config&gt;
	&lt;/application&gt;

&lt;/faces-config&gt;
dev.rafael

Ok, agora tente mudar todos os “2.5” e “2_5” do seu web.xml por “3.0” e “3_0”. Q servidor vc está utilizando?

robinsonbsilva

Estou usando Tomcat 6.0.29.

dev.rafael

Posta ai o stacktrace da exceção q vc está recebendo. Completo p favor!

robinsonbsilva
java.io.FileNotFoundException
	org.apache.naming.resources.DirContextURLConnection.getInputStream(DirContextURLConnection.java:364)
	com.sun.faces.facelets.impl.DefaultFaceletCache._getLastModified(DefaultFaceletCache.java:157)
	com.sun.faces.facelets.impl.DefaultFaceletCache.access$000(DefaultFaceletCache.java:58)
	com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:78)
	com.sun.faces.facelets.impl.DefaultFaceletCache$1.newInstance(DefaultFaceletCache.java:74)
	com.sun.faces.util.ExpiringConcurrentCache$1.call(ExpiringConcurrentCache.java:95)
	java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
	java.util.concurrent.FutureTask.run(Unknown Source)
	com.sun.faces.util.ExpiringConcurrentCache.get(ExpiringConcurrentCache.java:110)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:115)
	com.sun.faces.facelets.impl.DefaultFaceletCache.getFacelet(DefaultFaceletCache.java:58)
	com.sun.faces.facelets.impl.DefaultFaceletFactory.getFacelet(DefaultFaceletFactory.java:245)
	com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:362)
	com.sun.faces.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:342)
	com.sun.faces.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:196)
	com.sun.faces.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:151)
	com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:89)
	com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:79)
	com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:148)
	com.sun.faces.application.view.FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:734)
	com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:96)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:135)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:309)
dev.rafael

Isso é realmente estranho pois o JSF 2 ñ devia lançar nenhuma exceção p/ o caso de ñ conseguir resolver uma regra de navegação. Faz o seguinte, posta as quais arquivos do JSF 2 adicionou ao seu projeto. Se possível, posta ai todas as dependências do seu projeto.

robinsonbsilva

estou usando o mojarra-2.0.3-FCS

jsf-api.jar
jsf-impl.jar

As outras libs são do Hibernate 3.6

antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
slf4j-api-1.6.1.jar
slf4j-nop-1.6.1.jar
jtds-1.2.5.jar

dev.rafael

A view em questão ñ teria por um acaso uma tag ui:include?

robinsonbsilva

Sim!

&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;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"&gt;

    &lt;ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" template="../template/template.xhtml"&gt;
	    &lt;ui:define name="content"&gt; 
				&lt;ui:include src="form.xhtml" /&gt;
				<br></br>
				&lt;h:commandButton id="btnSalvar" action="#{usuarioMB.save}" value="Salvar" styleClass="botoes"/&gt;
        		&lt;h:messages/&gt;
		&lt;/ui:define&gt;
    &lt;/ui:composition&gt;
&lt;/html&gt;
dev.rafael

Confira a localização do arquivo form.xhtml e, se possível, remova a tag e coloque o conteudo desse arquivo inline p/ ver se corrige o problema.

robinsonbsilva

Boa dia,

Está OK agora, o erro se dava aos “includes” mesmo!!

Muito obrigado pela ajuda…

Criado 21 de outubro de 2010
Ultima resposta 22 de out. de 2010
Respostas 17
Participantes 4